[PATCH] D39637: [GVN PRE] Patch the source for Phi node in PRE

Serguei Katkov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Nov 4 23:37:28 PDT 2017


skatkov created this revision.

If we plan to use instruction in Phi node during PRE we must
patch it, otherwise it is possible that we can see poison where
program does not expect to see it.

This is the similar what GVN does.


https://reviews.llvm.org/D39637

Files:
  lib/Transforms/Scalar/GVN.cpp
  test/Transforms/GVN/PRE/pre-poison-add.ll


Index: test/Transforms/GVN/PRE/pre-poison-add.ll
===================================================================
--- /dev/null
+++ test/Transforms/GVN/PRE/pre-poison-add.ll
@@ -0,0 +1,52 @@
+; RUN: opt < %s -gvn -enable-pre -S | FileCheck %s
+
+ at H = common global i32 0
+ at 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
+}
Index: lib/Transforms/Scalar/GVN.cpp
===================================================================
--- lib/Transforms/Scalar/GVN.cpp
+++ lib/Transforms/Scalar/GVN.cpp
@@ -2288,9 +2288,11 @@
       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) {
+      // We plan to use V instead of CurInst, so patch it.
+      patchReplacementInstruction(CurInst, V);
       Phi->addIncoming(V, predMap[i].second);
-    else
+    } else
       Phi->addIncoming(PREInstr, PREPred);
   }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39637.121617.patch
Type: text/x-patch
Size: 2113 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171105/bbf1d6df/attachment.bin>


More information about the llvm-commits mailing list