diff --git a/llvm/lib/Analysis/MemorySSA.cpp b/llvm/lib/Analysis/MemorySSA.cpp index 1660321990bf23..32589155706b3b 100644 --- a/llvm/lib/Analysis/MemorySSA.cpp +++ b/llvm/lib/Analysis/MemorySSA.cpp @@ -1764,7 +1764,14 @@ MemoryUseOrDef *MemorySSA::createNewAccess(Instruction *I, bool DefCheck, UseCheck; DefCheck = isModSet(ModRef) || isOrdered(I); UseCheck = isRefSet(ModRef); - assert(Def == DefCheck && (Def || Use == UseCheck) && "Invalid template"); + // Use set is not checked since AA may return better results as a result of + // other transforms. + // FIXME: Would Def value always be consistent after transforms? + assert(Def == DefCheck && "Invalid template"); + if (!Def && Use != UseCheck) { + // New Access should not have more power than template access + assert(!UseCheck && "Invalid template"); + } #endif } else { // Find out what affect this instruction has on memory. diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/pr58719.ll b/llvm/test/Transforms/SimpleLoopUnswitch/pr58719.ll new file mode 100644 index 00000000000000..49d6768e2d57c7 --- /dev/null +++ b/llvm/test/Transforms/SimpleLoopUnswitch/pr58719.ll @@ -0,0 +1,21 @@ +; RUN: opt -passes="require,cgscc(instcombine),function(loop-mssa(loop-simplifycfg)),recompute-globalsaa,function(loop-mssa(simple-loop-unswitch),print)" -disable-output < %s + +; Check that don't crash if the Alias Analysis returns better results than +; before when cloning loop's memoryssa. +define void @f(ptr %p) { +entry: + %0 = load i16, ptr %p, align 1 + ret void +} + +define void @g(i1 %tobool.not) { +entry: + br label %for.cond + +for.cond: ; preds = %if.then, %for.cond, %entry + br i1 %tobool.not, label %if.then, label %for.cond + +if.then: ; preds = %for.cond + call void @f() + br label %for.cond +}