PHINode::Create(CurInst->getType(), predMap.size(),
CurInst->getName() + ".pre-phi", &CurrentBlock->front());
for (unsigned i = 0, e = predMap.size(); i != e; ++i) {
- if (Value *V = predMap[i].first)
+ if (Value *V = predMap[i].first) {
+ // If we use an existing value in this phi, we have to patch the original
+ // value because the phi will be used to replace a later value.
+ patchReplacementInstruction(CurInst, V);
Phi->addIncoming(V, predMap[i].second);
- else
+ } else
Phi->addIncoming(PREInstr, PREPred);
}
--- /dev/null
+; RUN: opt < %s -gvn -enable-pre -jump-threading -S | FileCheck %s
+
+@H = common global i32 0
+@G = common global i32 0
+
+define i32 @test(i1 %cond, i32 %v) nounwind {
+; CHECK-LABEL: @test
+entry:
+ br i1 %cond, label %bb, label %bb1
+
+bb:
+; CHECK: store
+; CHECK-NOT: br label %return
+ %add.1 = add nuw nsw i32 %v, -1
+ store i32 %add.1, i32* @G, align 4
+ br label %merge
+
+bb1:
+ br label %merge
+
+merge:
+ %add.2 = add i32 %v, -1
+ %cmp = icmp sgt i32 %add.2, 0
+ br i1 %cmp, label %action, label %return
+
+action:
+; CHECK: store
+; CHECK-NEXT: br label %return
+ store i32 %add.2, i32* @H, align 4
+ br label %return
+
+return:
+ %p = phi i32 [0, %merge], [1, %action]
+ ret i32 %p
+}
+
--- /dev/null
+; RUN: opt < %s -gvn -enable-pre -S | FileCheck %s
+
+@H = common global i32 0
+@G = common global i32 0
+
+define i32 @test1(i1 %cond, i32 %v) nounwind {
+; CHECK-LABEL: @test1
+entry:
+ br i1 %cond, label %bb, label %bb1
+
+bb:
+ %add.1 = add nuw nsw i32 %v, 42
+; CHECK: %add.1 = add i32 %v, 42
+ store i32 %add.1, i32* @G, align 4
+ br label %return
+
+bb1:
+; CHECK: %.pre = add i32 %v, 42
+ br label %return
+
+return:
+; CHECK: %add.2.pre-phi = phi i32 [ %.pre, %bb1 ], [ %add.1, %bb ]
+; CHECK-NEXT: store i32 %add.2.pre-phi, i32* @H, align 4
+; CHECK-NEXT: ret i32 0
+ %add.2 = add i32 %v, 42
+ store i32 %add.2, i32* @H, align 4
+ ret i32 0
+}
+
+define i32 @test2(i1 %cond, i32 %v) nounwind {
+; CHECK-LABEL: @test2
+entry:
+ br i1 %cond, label %bb, label %bb1
+
+bb:
+ %add.1 = add i32 %v, 42
+; CHECK: %add.1 = add i32 %v, 42
+ store i32 %add.1, i32* @G, align 4
+ br label %return
+
+bb1:
+; CHECK: %.pre = add nuw nsw i32 %v, 42
+ br label %return
+
+return:
+; CHECK: %add.2.pre-phi = phi i32 [ %.pre, %bb1 ], [ %add.1, %bb ]
+; CHECK-NEXT: store i32 %add.2.pre-phi, i32* @H, align 4
+; CHECK-NEXT: ret i32 0
+ %add.2 = add nuw nsw i32 %v, 42
+ store i32 %add.2, i32* @H, align 4
+ ret i32 0
+}