[polly] r309454 - [Simplify] Do not remove dependencies of phis within region stmts.

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 28 16:22:32 PDT 2017


Author: meinersbur
Date: Fri Jul 28 16:22:32 2017
New Revision: 309454

URL: http://llvm.org/viewvc/llvm-project?rev=309454&view=rev
Log:
[Simplify] Do not remove dependencies of phis within region stmts.

These were wrongly assumed to be phi nodes that require
MemoryKind::PHI accesses.

Added:
    polly/trunk/test/Simplify/notdead_region_innerphi.ll
Modified:
    polly/trunk/lib/Support/VirtualInstruction.cpp

Modified: polly/trunk/lib/Support/VirtualInstruction.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Support/VirtualInstruction.cpp?rev=309454&r1=309453&r2=309454&view=diff
==============================================================================
--- polly/trunk/lib/Support/VirtualInstruction.cpp (original)
+++ polly/trunk/lib/Support/VirtualInstruction.cpp Fri Jul 28 16:22:32 2017
@@ -355,7 +355,8 @@ static void walkReachable(Scop *S, LoopI
       continue;
 
     // Add all operands to the worklists.
-    if (PHINode *PHI = dyn_cast<PHINode>(Inst)) {
+    PHINode *PHI = dyn_cast<PHINode>(Inst);
+    if (PHI && PHI->getParent() == Stmt->getEntryBlock()) {
       if (MemoryAccess *PHIRead = Stmt->lookupPHIReadOf(PHI))
         WorklistAccs.push_back(PHIRead);
     } else {

Added: polly/trunk/test/Simplify/notdead_region_innerphi.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Simplify/notdead_region_innerphi.ll?rev=309454&view=auto
==============================================================================
--- polly/trunk/test/Simplify/notdead_region_innerphi.ll (added)
+++ polly/trunk/test/Simplify/notdead_region_innerphi.ll Fri Jul 28 16:22:32 2017
@@ -0,0 +1,50 @@
+; RUN: opt %loadPolly -polly-simplify -analyze < %s | FileCheck %s -match-full-lines
+;
+; Do not remove dependencies of a phi node within a region statement (%phi).
+;
+define void @func(i32 %n, double* noalias nonnull %A, double %alpha) {
+entry:
+  br label %for
+
+for:
+  %j = phi i32 [0, %entry], [%j.inc, %inc]
+  %j.cmp = icmp slt i32 %j, %n
+  br i1 %j.cmp, label %body, label %exit
+
+    body:
+      %val = fadd double 21.0, 21.0
+      br label %region_entry
+
+
+    region_entry:
+      %region.cmp = fcmp ueq double %alpha, 0.0
+      br i1 %region.cmp, label %region_true, label %region_exit
+
+    region_true:
+      br i1 true, label %region_verytrue, label %region_mostlytrue
+
+    region_verytrue:
+      br label %region_mostlytrue
+
+    region_mostlytrue:
+      %phi = phi double [%val, %region_true], [0.0, %region_verytrue]
+      store double %phi, double* %A
+      br label %region_exit
+
+    region_exit:
+      br label %inc
+
+
+inc:
+  %j.inc = add nuw nsw i32 %j, 1
+  br label %for
+
+exit:
+  br label %return
+
+return:
+  ret void
+}
+
+
+; CHECK: SCoP could not be simplified




More information about the llvm-commits mailing list