return MA->getValueID() == MemoryUseVal || MA->getValueID() == MemoryDefVal;
}
- // Sadly, these have to be public because they are needed in some of the iterators.
- virtual bool isOptimized() const = 0;
- virtual MemoryAccess *getOptimized() const = 0;
- virtual void setOptimized(MemoryAccess *) = 0;
-
- /// \brief Reset the ID of what this MemoryUse was optimized to, causing it to
- /// be rewalked by the walker if necessary.
- /// This really should only be called by tests.
- virtual void resetOptimized() = 0;
-
protected:
friend class MemorySSA;
friend class MemorySSAUpdater;
: MemoryAccess(C, Vty, BB, 1), MemoryInst(MI) {
setDefiningAccess(DMA);
}
- void setDefiningAccess(MemoryAccess *DMA, bool Optimized = false) {
- setOperand(0, DMA);
- if (!Optimized)
- return;
- setOptimized(DMA);
- }
+
+ void setDefiningAccess(MemoryAccess *DMA) { setOperand(0, DMA); }
private:
Instruction *MemoryInst;
void print(raw_ostream &OS) const override;
- virtual void setOptimized(MemoryAccess *DMA) override {
- OptimizedID = DMA->getID();
+ void setDefiningAccess(MemoryAccess *DMA, bool Optimized = false) {
+ if (Optimized)
+ OptimizedID = DMA->getID();
+ MemoryUseOrDef::setDefiningAccess(DMA);
}
- virtual bool isOptimized() const override {
+ bool isOptimized() const {
return getDefiningAccess() && OptimizedID == getDefiningAccess()->getID();
}
- virtual MemoryAccess *getOptimized() const override {
- return getDefiningAccess();
- }
- virtual void resetOptimized() override { OptimizedID = INVALID_MEMORYACCESS_ID; }
+ /// \brief Reset the ID of what this MemoryUse was optimized to, causing it to
+ /// be rewalked by the walker if necessary.
+ /// This really should only be called by tests.
+ void resetOptimized() { OptimizedID = INVALID_MEMORYACCESS_ID; }
protected:
friend class MemorySSA;
MemoryDef(LLVMContext &C, MemoryAccess *DMA, Instruction *MI, BasicBlock *BB,
unsigned Ver)
- : MemoryUseOrDef(C, DMA, MemoryDefVal, MI, BB), ID(Ver),
- Optimized(nullptr), OptimizedID(INVALID_MEMORYACCESS_ID) {}
+ : MemoryUseOrDef(C, DMA, MemoryDefVal, MI, BB), ID(Ver) {}
// allocate space for exactly one operand
void *operator new(size_t s) { return User::operator new(s, 1); }
return MA->getValueID() == MemoryDefVal;
}
- virtual void setOptimized(MemoryAccess *MA) override {
- Optimized = MA;
- OptimizedID = getDefiningAccess()->getID();
- }
- virtual MemoryAccess *getOptimized() const override { return Optimized; }
- virtual bool isOptimized() const override {
- return getOptimized() && OptimizedID == getDefiningAccess()->getID();
- }
- virtual void resetOptimized() override { OptimizedID = INVALID_MEMORYACCESS_ID; }
-
-
void print(raw_ostream &OS) const override;
protected:
private:
const unsigned ID;
- MemoryAccess *Optimized;
- unsigned int OptimizedID;
};
template <>
def_chain_iterator &operator++() {
// N.B. liveOnEntry has a null defining access.
- if (auto *MUD = dyn_cast<MemoryUseOrDef>(MA)) {
- if (MUD->isOptimized())
- MA = MUD->getOptimized();
- else
- MA = MUD->getDefiningAccess();
- } else {
+ if (auto *MUD = dyn_cast<MemoryUseOrDef>(MA))
+ MA = MUD->getDefiningAccess();
+ else
MA = nullptr;
- }
-
return *this;
}
// If this is an already optimized use or def, return the optimized result.
// Note: Currently, we do not store the optimized def result because we'd need
// a separate field, since we can't use it as the defining access.
- if (auto *MUD = dyn_cast<MemoryUseOrDef>(StartingAccess))
- if (MUD->isOptimized())
- return MUD->getOptimized();
+ if (MemoryUse *MU = dyn_cast<MemoryUse>(StartingAccess))
+ if (MU->isOptimized())
+ return MU->getDefiningAccess();
const Instruction *I = StartingAccess->getMemoryInst();
UpwardsMemoryQuery Q(I, StartingAccess);
if (isUseTriviallyOptimizableToLiveOnEntry(*MSSA->AA, I)) {
MemoryAccess *LiveOnEntry = MSSA->getLiveOnEntryDef();
Cache.insert(StartingAccess, LiveOnEntry, Q.StartingLoc, Q.IsCall);
- if (auto *MUD = dyn_cast<MemoryUseOrDef>(StartingAccess))
- MUD->setDefiningAccess(LiveOnEntry, true);
+ if (MemoryUse *MU = dyn_cast<MemoryUse>(StartingAccess))
+ MU->setDefiningAccess(LiveOnEntry, true);
return LiveOnEntry;
}
DEBUG(dbgs() << *DefiningAccess << "\n");
DEBUG(dbgs() << "Final Memory SSA clobber for " << *I << " is ");
DEBUG(dbgs() << *Result << "\n");
- if (auto *MUD = dyn_cast<MemoryUseOrDef>(StartingAccess))
- MUD->setDefiningAccess(Result, true);
+ if (MemoryUse *MU = dyn_cast<MemoryUse>(StartingAccess))
+ MU->setDefiningAccess(Result, true);
return Result;
}