summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Transforms/Utils/LoopRotationUtils.cpp12
-rw-r--r--llvm/test/Analysis/MemorySSA/loop-rotate-valuemap.ll26
2 files changed, 34 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp b/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp
index 88c4937cfe1..37389a695b4 100644
--- a/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp
+++ b/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp
@@ -295,7 +295,7 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
// 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 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
if (auto *II = dyn_cast<IntrinsicInst>(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 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
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<PHINode*, 2> InsertedPHIs;
diff --git a/llvm/test/Analysis/MemorySSA/loop-rotate-valuemap.ll b/llvm/test/Analysis/MemorySSA/loop-rotate-valuemap.ll
new file mode 100644
index 00000000000..1ee5fcabdeb
--- /dev/null
+++ b/llvm/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)
+
OpenPOWER on IntegriCloud