[llvm] r340529 - [GVN] Invalidate cached info for phis when setting dead predecessors to undef

John Brawn via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 23 05:48:17 PDT 2018


Author: john.brawn
Date: Thu Aug 23 05:48:17 2018
New Revision: 340529

URL: http://llvm.org/viewvc/llvm-project?rev=340529&view=rev
Log:
[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

Added:
    llvm/trunk/test/Transforms/GVN/unreachable-predecessor.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/GVN.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=340529&r1=340528&r2=340529&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Thu Aug 23 05:48:17 2018
@@ -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);
       }
     }
   }

Added: llvm/trunk/test/Transforms/GVN/unreachable-predecessor.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/unreachable-predecessor.ll?rev=340529&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/unreachable-predecessor.ll (added)
+++ llvm/trunk/test/Transforms/GVN/unreachable-predecessor.ll Thu Aug 23 05:48:17 2018
@@ -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
+}




More information about the llvm-commits mailing list