summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Brawn <john.brawn@arm.com>2018-08-23 12:48:17 +0000
committerJohn Brawn <john.brawn@arm.com>2018-08-23 12:48:17 +0000
commit23cbf09fad7ca004aec7ef77e89dd0d01ef0dd5f (patch)
tree807e725545f07ad59e28458b2a6a3c0f01b2baa8
parentcf1f714d3b1bcb623dbeed33dc8c469f3af0bdf2 (diff)
downloadbcm5719-llvm-23cbf09fad7ca004aec7ef77e89dd0d01ef0dd5f.tar.gz
bcm5719-llvm-23cbf09fad7ca004aec7ef77e89dd0d01ef0dd5f.zip
[GVN] Invalidate cached info for phis when setting dead predecessors to undef
When GVN sets the incoming value for a phi to undef because the incoming block is unreachable it needs to also invalidate the cached info for that phi in MemoryDependenceAnalysis, otherwise later queries will return stale information. Differential Revision: https://reviews.llvm.org/D51099 llvm-svn: 340529
-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