[polly] r309271 - [Simplify] Count PHINodes in simplifiable exit nodes as escaping use.

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 27 07:09:31 PDT 2017


Author: meinersbur
Date: Thu Jul 27 07:09:31 2017
New Revision: 309271

URL: http://llvm.org/viewvc/llvm-project?rev=309271&view=rev
Log:
[Simplify] Count PHINodes in simplifiable exit nodes as escaping use.

After region exit simplification, the incoming block of a phi node in
the SCoP region's exit block lands outside of the region. Since we
treat SCoPs as if this already happened, we need to account for that
when looking for outside uses of scalars (i.e. escaping scalars).

Added:
    polly/trunk/test/Simplify/exit_phi_accesses-2.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=309271&r1=309270&r2=309271&view=diff
==============================================================================
--- polly/trunk/lib/Support/VirtualInstruction.cpp (original)
+++ polly/trunk/lib/Support/VirtualInstruction.cpp Thu Jul 27 07:09:31 2017
@@ -170,6 +170,13 @@ static bool isEscaping(Scop *S, Instruct
     BasicBlock *UserBB = getUseBlock(Use);
     if (!S->contains(UserBB))
       return true;
+
+    // When the SCoP region exit needs to be simplified, PHIs in the region exit
+    // move to a new basic block such that its incoming blocks are not in the
+    // scop anymore.
+    if (S->hasSingleExitEdge() && isa<PHINode>(Use.getUser()) &&
+        S->isExit(cast<PHINode>(Use.getUser())->getParent()))
+      return true;
   }
   return false;
 }

Added: polly/trunk/test/Simplify/exit_phi_accesses-2.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Simplify/exit_phi_accesses-2.ll?rev=309271&view=auto
==============================================================================
--- polly/trunk/test/Simplify/exit_phi_accesses-2.ll (added)
+++ polly/trunk/test/Simplify/exit_phi_accesses-2.ll Thu Jul 27 07:09:31 2017
@@ -0,0 +1,37 @@
+; RUN: opt %loadPolly -polly-scops -polly-simplify -analyze < %s | FileCheck %s
+;
+; The use of %sum.next by %phi counts as an escaping use.
+; Don't remove the scalar write of %sum.next.
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define float @foo(float* %A) {
+entry:
+  br label %header
+
+header:
+  fence seq_cst
+  br i1 true, label %body, label %exit
+
+body:
+  %i = phi i64 [ 0, %header ], [ %next, %body ]
+  %sum = phi float [ 0.0, %header ], [ %sum.next, %body ]
+  %arrayidx = getelementptr float, float* %A, i64 %i
+  %next = add nuw nsw i64 %i, 1
+  %val = load float, float* %arrayidx
+  %sum.next = fadd float %sum, %val
+  %cond = icmp ne i64 %i, 100
+  br i1 %cond, label %body, label %after
+
+after:
+  br label %exit
+
+exit:
+  %phi = phi float [%sum.next, %after], [0.0, %header]
+  ret float %phi
+}
+
+
+; CHECK: Statistics {
+; CHECK:     Dead accesses removed: 0
+; CHECK: }




More information about the llvm-commits mailing list