void BBState::processRead(RLEContext &Ctx, SILInstruction *I, SILValue Mem, SILValue Val, bool PF) { // Initialize the MemLocation. MemLocation L(Mem); // If we cant figure out the Base or Projection Path for the read, simply // ignore it for now. if (!L.isValid()) return; // Expand the given MemLocation and Val into individual fields and process // them as separate reads. MemLocationList Locs; LoadStoreValueList Vals; MemLocation::expandWithValues(L, Val, &I->getModule(), Locs, Vals); bool CanForward = true; for (auto &X : Locs) { CanForward &= isTrackingMemLocation(Ctx.getMemLocationBit(X)); } // We do not have every location available, track the MemLocations and // their values from this instruction, and return. if (!CanForward) { for (unsigned i = 0; i < Locs.size(); ++i) { updateForwardSetForRead(Ctx, Ctx.getMemLocationBit(Locs[i]), Vals[i]); } return; } // At this point, we have all the MemLocations and their values available. // // If we are not doing forwarding just yet, simply return. if (!PF) return; // Lastly, forward value to the load. setupRLE(Ctx, I, Mem); }
void BBState::processWrite(RLEContext &Ctx, SILInstruction *I, SILValue Mem, SILValue Val) { // Initialize the MemLocation. MemLocation L(Mem); // If we cant figure out the Base or Projection Path for the write, // process it as an unknown memory instruction. if (!L.isValid()) { processUnknownWriteInst(Ctx, I); return; } // Expand the given MemLocation and Val into individual fields and process // them as separate writes. MemLocationList Locs; LoadStoreValueList Vals; MemLocation::expandWithValues(L, Val, &I->getModule(), Locs, Vals); for (unsigned i = 0; i < Locs.size(); ++i) { updateForwardSetForWrite(Ctx, Ctx.getMemLocationBit(Locs[i]), Vals[i]); } }