[polly] r250622 - Avoid unnecessay .s2a write access when used only in PHIs

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 17 14:07:08 PDT 2015


Author: meinersbur
Date: Sat Oct 17 16:07:08 2015
New Revision: 250622

URL: http://llvm.org/viewvc/llvm-project?rev=250622&view=rev
Log:
Avoid unnecessay .s2a write access when used only in PHIs

Accesses for exit node phis will be handled separately by 
buildPHIAccesses if there is more than one exiting edge, 
buildScalarDependences does not need to create additional SCALAR 
accesses.

This is a corrected version of r250517, which was reverted in r250607.

Differential Revision: http://reviews.llvm.org/D13848

Added:
    polly/trunk/test/ScopInfo/exit_phi_accesses-2.ll
Modified:
    polly/trunk/lib/Analysis/ScopInfo.cpp
    polly/trunk/test/ScopInfo/exit_phi_accesses.ll
    polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi.ll

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=250622&r1=250621&r2=250622&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Sat Oct 17 16:07:08 2015
@@ -3271,6 +3271,23 @@ bool ScopInfo::buildScalarDependences(In
     if (NonAffineSubRegion && NonAffineSubRegion->contains(UseParent))
       continue;
 
+    // Check for PHI nodes in the region exit and skip them, if they will be
+    // modeled
+    // as PHI nodes.
+    //
+    // PHI nodes in the region exit that have more than two incoming edges need
+    // to
+    // be modeled as PHI-Nodes to correctly model the fact that depending on the
+    // control flow a different value will be assigned to the PHI node. In case
+    // this
+    // is the case, there is no need to create an additional normal scalar
+    // dependence.
+    // Hence bail out, before we register an "out-of-region" use for this
+    // definition.
+    if (isa<PHINode>(UI) && UI->getParent() == R->getExit() &&
+        !R->getExitingBlock())
+      continue;
+
     // Check whether or not the use is in the SCoP.
     if (!R->contains(UseParent)) {
       AnyCrossStmtUse = true;

Added: polly/trunk/test/ScopInfo/exit_phi_accesses-2.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/exit_phi_accesses-2.ll?rev=250622&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/exit_phi_accesses-2.ll (added)
+++ polly/trunk/test/ScopInfo/exit_phi_accesses-2.ll Sat Oct 17 16:07:08 2015
@@ -0,0 +1,47 @@
+; RUN: opt %loadPolly -analyze -polly-scops %s | FileCheck %s
+
+; CHECK-LABEL: Function: foo
+; CHECK:       Statements {
+; CHECK-NEXT:      Stmt_body
+; CHECK-NEXT:          Domain :=
+; CHECK-NEXT:              { Stmt_body[i0] : i0 <= 100 and i0 >= 0 };
+; CHECK-NEXT:          Schedule :=
+; CHECK-NEXT:              { Stmt_body[i0] -> [i0] };
+; CHECK-NEXT:          MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT:              { Stmt_body[i0] -> MemRef_sum__phi[] };
+; CHECK-NEXT:          ReadAccess :=       [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT:              { Stmt_body[i0] -> MemRef_sum__phi[] };
+; CHECK-NEXT:          ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT:              { Stmt_body[i0] -> MemRef_A[i0] };
+; CHECK-NEXT:          MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT:              { Stmt_body[i0] -> MemRef_sum_next[] };
+; CHECK-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
+  %scalar = fadd float 0.0, 0.0
+  %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
+}

Modified: polly/trunk/test/ScopInfo/exit_phi_accesses.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/exit_phi_accesses.ll?rev=250622&r1=250621&r2=250622&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/exit_phi_accesses.ll (original)
+++ polly/trunk/test/ScopInfo/exit_phi_accesses.ll Sat Oct 17 16:07:08 2015
@@ -1,11 +1,9 @@
 ; RUN: opt %loadPolly -analyze -polly-scops %s | FileCheck %s
 
 ; Check that PHI nodes only create PHI access and nothing else (e.g. unnecessary
-; SCALAR accesses)In this case, for a PHI in the exit node, hence there is no
+; SCALAR accesses). In this case, for a PHI in the exit node, hence there is no
 ; PHI ReadAccess.
 
-; XFAIL: *
-
 ; CHECK-LABEL: Function: foo
 ; CHECK:       Statements {
 ; CHECK-NEXT:      Stmt_header
@@ -22,7 +20,7 @@
 ; CHECK-NEXT:              { Stmt_body[i0] -> [1, i0] };
 ; CHECK-NEXT:          MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
 ; CHECK-NEXT:              { Stmt_body[i0] -> MemRef_phi[] };
-; CHECK-NEXT:   }
+; CHECK-NEXT:  }
 
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 

Modified: polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi.ll?rev=250622&r1=250621&r2=250622&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi.ll (original)
+++ polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi.ll Sat Oct 17 16:07:08 2015
@@ -27,8 +27,6 @@
 ; CHECK:           { Stmt_bb1[i0] -> MemRef_phisum__phi[] };
 ; CHECK:       ReadAccess :=       [Reduction Type: NONE] [Scalar: 1]
 ; CHECK:           { Stmt_bb1[i0] -> MemRef_phisum__phi[] };
-; CHECK:       MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
-; CHECK:           { Stmt_bb1[i0] -> MemRef_phisum[] };
 ; CHECK:       ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
 ; CHECK:           { Stmt_bb1[i0] -> MemRef_A[i0] };
 




More information about the llvm-commits mailing list