Index: llvm/trunk/lib/Transforms/Utils/LoopRotationUtils.cpp =================================================================== --- llvm/trunk/lib/Transforms/Utils/LoopRotationUtils.cpp +++ llvm/trunk/lib/Transforms/Utils/LoopRotationUtils.cpp @@ -295,7 +295,7 @@ // Begin by walking OrigHeader and populating ValueMap with an entry for // each Instruction. BasicBlock::iterator I = OrigHeader->begin(), E = OrigHeader->end(); - ValueToValueMapTy ValueMap; + ValueToValueMapTy ValueMap, ValueMapMSSA; // For PHI nodes, the value available in OldPreHeader is just the // incoming value from OldPreHeader. @@ -374,6 +374,9 @@ if (auto *II = dyn_cast(C)) if (II->getIntrinsicID() == Intrinsic::assume) AC->registerAssumption(II); + // MemorySSA cares whether the cloned instruction was inserted or not, and + // not whether it can be remapped to a simplified value. + ValueMapMSSA[Inst] = C; } } @@ -391,10 +394,11 @@ LoopEntryBranch->eraseFromParent(); // Update MemorySSA before the rewrite call below changes the 1:1 - // instruction:cloned_instruction_or_value mapping in ValueMap. + // instruction:cloned_instruction_or_value mapping. if (MSSAU) { - ValueMap[OrigHeader] = OrigPreheader; - MSSAU->updateForClonedBlockIntoPred(OrigHeader, OrigPreheader, ValueMap); + ValueMapMSSA[OrigHeader] = OrigPreheader; + MSSAU->updateForClonedBlockIntoPred(OrigHeader, OrigPreheader, + ValueMapMSSA); } SmallVector InsertedPHIs; Index: llvm/trunk/test/Analysis/MemorySSA/loop-rotate-valuemap.ll =================================================================== --- llvm/trunk/test/Analysis/MemorySSA/loop-rotate-valuemap.ll +++ llvm/trunk/test/Analysis/MemorySSA/loop-rotate-valuemap.ll @@ -0,0 +1,26 @@ +; RUN: opt -loop-rotate -enable-mssa-loop-dependency %s -S | FileCheck %s +; REQUIRES: asserts + +; Check that loop rotate keeps proper mapping between cloned instructions, +; otherwise, MemorySSA will assert. + +; CHECK-LABEL: @f +define void @f() { +entry: + br label %for.body16 + +for.cond.cleanup15: ; preds = %for.body16 + ret void + +for.body16: ; preds = %for.body16.for.body16_crit_edge, %entry + %call.i = tail call float @expf(float 0.000000e+00) #1 + %0 = load float*, float** undef, align 8 + br i1 undef, label %for.cond.cleanup15, label %for.body16.for.body16_crit_edge + +for.body16.for.body16_crit_edge: ; preds = %for.body16 + %.pre = load float, float* undef, align 8 + br label %for.body16 +} + +declare float @expf(float) +