Index: llvm/lib/Analysis/MemorySSA.cpp =================================================================== --- llvm/lib/Analysis/MemorySSA.cpp +++ llvm/lib/Analysis/MemorySSA.cpp @@ -261,10 +261,10 @@ template static ClobberAlias instructionClobbersQuery(const MemoryDef *MD, const MemoryLocation &UseLoc, - const Instruction *UseInst, AliasAnalysisType &AA) { + const Instruction *UseInst, bool IsCall, + AliasAnalysisType &AA) { Instruction *DefInst = MD->getMemoryInst(); assert(DefInst && "Defining instruction not actually an instruction"); - const auto *UseCall = dyn_cast(UseInst); Optional AR; if (const IntrinsicInst *II = dyn_cast(DefInst)) { @@ -277,7 +277,7 @@ // context. switch (II->getIntrinsicID()) { case Intrinsic::lifetime_start: - if (UseCall) + if (IsCall) return {false, NoAlias}; AR = AA.alias(MemoryLocation(II->getArgOperand(1)), UseLoc); return {AR != NoAlias, AR}; @@ -296,8 +296,8 @@ } } - if (UseCall) { - ModRefInfo I = AA.getModRefInfo(DefInst, UseCall); + if (IsCall) { + ModRefInfo I = AA.getModRefInfo(DefInst, cast(UseInst)); AR = isMustSet(I) ? MustAlias : MayAlias; return {isModOrRefSet(I), AR}; } @@ -320,9 +320,9 @@ // to exist while MemoryLocOrCall is pushed through places. if (UseMLOC.IsCall) return instructionClobbersQuery(MD, MemoryLocation(), MU->getMemoryInst(), - AA); + UseMLOC.IsCall, AA); return instructionClobbersQuery(MD, UseMLOC.getLoc(), MU->getMemoryInst(), - AA); + UseMLOC.IsCall, AA); } // Return true when MD may alias MU, return false otherwise. @@ -587,7 +587,8 @@ return {Current, true, MayAlias}; ClobberAlias CA = - instructionClobbersQuery(MD, Desc.Loc, Query->Inst, AA); + instructionClobbersQuery(MD, Desc.Loc, Query->Inst, Query->IsCall, + AA); if (CA.IsClobber) return {MD, true, CA.AR}; } Index: llvm/unittests/Analysis/MemorySSATest.cpp =================================================================== --- llvm/unittests/Analysis/MemorySSATest.cpp +++ llvm/unittests/Analysis/MemorySSATest.cpp @@ -1205,8 +1205,8 @@ // %bar = getelementptr i8, i8* %foo, i64 1 // store i8 0, i8* %foo // store i8 0, i8* %bar - // call void @llvm.lifetime.end.p0i8(i64 8, i32* %p) - // call void @llvm.lifetime.start.p0i8(i64 8, i32* %p) + // call void @llvm.lifetime.end.p0i8(i64 8, i32* %foo) + // call void @llvm.lifetime.start.p0i8(i64 8, i32* %foo) // store i8 0, i8* %foo // store i8 0, i8* %bar // ret void @@ -1263,6 +1263,11 @@ MemoryAccess *BarClobber = MSSA.getWalker()->getClobberingMemoryAccess(BarAccess); EXPECT_EQ(BarClobber, LifetimeStartAccess); + + MemoryAccess *LifetimeStartClobber = + MSSA.getWalker()->getClobberingMemoryAccess( + LifetimeStartAccess, MemoryLocation(Foo)); + EXPECT_EQ(LifetimeStartClobber, LifetimeStartAccess); } TEST_F(MemorySSATest, DefOptimizationsAreInvalidatedOnMoving) {