summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Transforms/Scalar/GVN.cpp2
-rw-r--r--llvm/test/Transforms/GVN/unreachable-predecessor.ll38
2 files changed, 40 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp
index a790db3338c..61443e301d6 100644
--- a/llvm/lib/Transforms/Scalar/GVN.cpp
+++ b/llvm/lib/Transforms/Scalar/GVN.cpp
@@ -2457,6 +2457,8 @@ void GVN::addDeadBlock(BasicBlock *BB) {
PHINode &Phi = cast<PHINode>(*II);
Phi.setIncomingValue(Phi.getBasicBlockIndex(P),
UndefValue::get(Phi.getType()));
+ if (MD)
+ MD->invalidateCachedPointerInfo(&Phi);
}
}
}
diff --git a/llvm/test/Transforms/GVN/unreachable-predecessor.ll b/llvm/test/Transforms/GVN/unreachable-predecessor.ll
new file mode 100644
index 00000000000..1fedc4acb92
--- /dev/null
+++ b/llvm/test/Transforms/GVN/unreachable-predecessor.ll
@@ -0,0 +1,38 @@
+; RUN: opt < %s -gvn -S | FileCheck %s
+
+; loop.then is not reachable from loop, so we should be able to deduce that the
+; store through %phi2 cannot alias %ptr1.
+
+; CHECK-LABEL: @test1
+define void @test1(i32* %ptr1, i32* %ptr2) {
+; CHECK-LABEL: entry:
+; CHECK: %[[GEP:.*]] = getelementptr inbounds i32, i32* %ptr1, i64 1
+; CHECK: %[[VAL1:.*]] = load i32, i32* %[[GEP]]
+entry:
+ br label %loop.preheader
+
+loop.preheader:
+ %gep1 = getelementptr inbounds i32, i32* %ptr1, i64 1
+ br label %loop
+
+; CHECK-LABEL: loop:
+; CHECK-NOT: load
+loop:
+ %phi1 = phi i32* [ %gep1, %loop.preheader ], [ %phi2, %loop.then ]
+ %val1 = load i32, i32* %phi1
+ br i1 false, label %loop.then, label %loop.if
+
+loop.if:
+ %gep2 = getelementptr inbounds i32, i32* %gep1, i64 1
+ %val2 = load i32, i32* %gep2
+ %cmp = icmp slt i32 %val1, %val2
+ br label %loop.then
+
+; CHECK-LABEL: loop.then
+; CHECK: store i32 %[[VAL1]], i32* %phi2
+loop.then:
+ %phi2 = phi i32* [ %ptr2, %loop ], [ %gep2, %loop.if ]
+ store i32 %val1, i32* %phi2
+ store i32 0, i32* %ptr1
+ br label %loop
+}
OpenPOWER on IntegriCloud