void BlockState::updateForwardSetForWrite(RLEContext &Ctx, unsigned bit) { // This is a store, invalidate any location that this location may alias, as // their values can no longer be forwarded. LSLocation &R = Ctx.getLSLocation(bit); for (unsigned i = 0; i < ForwardSetIn.size(); ++i) { if (!isTrackingLSLocation(i)) continue; LSLocation &L = Ctx.getLSLocation(i); if (!L.isMayAliasLSLocation(R, Ctx.getAA())) continue; // MayAlias, invalidate the LSLocation. stopTrackingLSLocation(i); } // Start tracking this LSLocation. startTrackingLSLocation(bit); }
void BlockState::processUnknownWriteInst(RLEContext &Ctx, SILInstruction *I, RLEKind Kind) { auto *AA = Ctx.getAA(); for (unsigned i = 0; i < ForwardSetIn.size(); ++i) { if (!isTrackingLSLocation(i)) continue; // Invalidate any location this instruction may write to. // // TODO: checking may alias with Base is overly conservative, // we should check may alias with base plus projection path. LSLocation &R = Ctx.getLSLocation(i); if (!AA->mayWriteToMemory(I, R.getBase())) continue; // MayAlias. stopTrackingLSLocation(i); stopTrackingLSValue(i); } }