Index: llvm/trunk/include/llvm/Transforms/Utils/MemorySSA.h =================================================================== --- llvm/trunk/include/llvm/Transforms/Utils/MemorySSA.h +++ llvm/trunk/include/llvm/Transforms/Utils/MemorySSA.h @@ -500,7 +500,7 @@ /// access associated with it. If passed a basic block gets the memory phi /// node that exists for that block, if there is one. Otherwise, this will get /// a MemoryUseOrDef. - MemoryAccess *getMemoryAccess(const Value *) const; + MemoryUseOrDef *getMemoryAccess(const Instruction *) const; MemoryPhi *getMemoryAccess(const BasicBlock *BB) const; void dump() const; @@ -563,12 +563,12 @@ /// must be non-null. /// Note: If a MemoryAccess already exists for I, this function will make it /// inaccessible and it *must* have removeMemoryAccess called on it. - MemoryAccess *createMemoryAccessBefore(Instruction *I, - MemoryAccess *Definition, - MemoryAccess *InsertPt); - MemoryAccess *createMemoryAccessAfter(Instruction *I, - MemoryAccess *Definition, - MemoryAccess *InsertPt); + MemoryUseOrDef *createMemoryAccessBefore(Instruction *I, + MemoryAccess *Definition, + MemoryUseOrDef *InsertPt); + MemoryUseOrDef *createMemoryAccessAfter(Instruction *I, + MemoryAccess *Definition, + MemoryAccess *InsertPt); /// \brief Remove a MemoryAccess from MemorySSA, including updating all /// definitions and uses. Index: llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp +++ llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp @@ -538,7 +538,7 @@ BasicBlock *HoistBB = HoistPt->getParent(); MemoryUseOrDef *UD; if (K != InsKind::Scalar) - UD = cast(MSSA->getMemoryAccess(HoistPt)); + UD = MSSA->getMemoryAccess(HoistPt); for (++II; II != InstructionsToHoist.end(); ++II) { Instruction *Insn = *II; @@ -582,8 +582,7 @@ // Also check that it is safe to move the load or store from HoistPt // to NewHoistPt, and from Insn to NewHoistPt. safeToHoistLdSt(NewHoistPt, HoistPt, UD, K, NBBsOnAllPaths) && - safeToHoistLdSt(NewHoistPt, Insn, - cast(MSSA->getMemoryAccess(Insn)), + safeToHoistLdSt(NewHoistPt, Insn, MSSA->getMemoryAccess(Insn), K, NBBsOnAllPaths)) { // Extend HoistPt to NewHoistPt. HoistPt = NewHoistPt; @@ -600,7 +599,7 @@ // Start over from BB. Start = II; if (K != InsKind::Scalar) - UD = cast(MSSA->getMemoryAccess(*Start)); + UD = MSSA->getMemoryAccess(*Start); HoistPt = Insn; HoistBB = BB; NBBsOnAllPaths = MaxNumberOfBBSInPath; Index: llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp =================================================================== --- llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp +++ llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp @@ -1589,9 +1589,10 @@ BlockNumberingValid.erase(BB); return NewAccess; } -MemoryAccess *MemorySSA::createMemoryAccessBefore(Instruction *I, - MemoryAccess *Definition, - MemoryAccess *InsertPt) { + +MemoryUseOrDef *MemorySSA::createMemoryAccessBefore(Instruction *I, + MemoryAccess *Definition, + MemoryUseOrDef *InsertPt) { assert(I->getParent() == InsertPt->getBlock() && "New and old access must be in the same block"); MemoryUseOrDef *NewAccess = createDefinedAccess(I, Definition); @@ -1601,9 +1602,9 @@ return NewAccess; } -MemoryAccess *MemorySSA::createMemoryAccessAfter(Instruction *I, - MemoryAccess *Definition, - MemoryAccess *InsertPt) { +MemoryUseOrDef *MemorySSA::createMemoryAccessAfter(Instruction *I, + MemoryAccess *Definition, + MemoryAccess *InsertPt) { assert(I->getParent() == InsertPt->getBlock() && "New and old access must be in the same block"); MemoryUseOrDef *NewAccess = createDefinedAccess(I, Definition); @@ -1888,21 +1889,19 @@ } for (Instruction &I : B) { - if (MemoryAccess *MA = getMemoryAccess(&I)) { - assert(isa(MA) && - "Found a phi node not attached to a bb"); - verifyUseInDefs(cast(MA)->getDefiningAccess(), MA); + if (MemoryUseOrDef *MA = getMemoryAccess(&I)) { + verifyUseInDefs(MA->getDefiningAccess(), MA); } } } } -MemoryAccess *MemorySSA::getMemoryAccess(const Value *I) const { - return ValueToMemoryAccess.lookup(I); +MemoryUseOrDef *MemorySSA::getMemoryAccess(const Instruction *I) const { + return cast_or_null(ValueToMemoryAccess.lookup(I)); } MemoryPhi *MemorySSA::getMemoryAccess(const BasicBlock *BB) const { - return cast_or_null(getMemoryAccess((const Value *)BB)); + return cast_or_null(ValueToMemoryAccess.lookup(cast(BB))); } /// Perform a local numbering on blocks so that instruction ordering can be Index: llvm/trunk/unittests/Transforms/Utils/MemorySSA.cpp =================================================================== --- llvm/trunk/unittests/Transforms/Utils/MemorySSA.cpp +++ llvm/trunk/unittests/Transforms/Utils/MemorySSA.cpp @@ -276,8 +276,7 @@ unsigned I = 0; for (StoreInst *V : {S1, S2, S3}) { // Everything should be clobbered by its defining access - MemoryAccess *DefiningAccess = - cast(MSSA.getMemoryAccess(V))->getDefiningAccess(); + MemoryAccess *DefiningAccess = MSSA.getMemoryAccess(V)->getDefiningAccess(); MemoryAccess *WalkerClobber = Walker->getClobberingMemoryAccess(V); EXPECT_EQ(DefiningAccess, WalkerClobber) << "Store " << I << " doesn't have the correct clobbering access";