[polly] r248535 - Handle read-only scalars used in PHI-nodes correctly
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 24 13:59:59 PDT 2015
Author: grosser
Date: Thu Sep 24 15:59:59 2015
New Revision: 248535
URL: http://llvm.org/viewvc/llvm-project?rev=248535&view=rev
Log:
Handle read-only scalars used in PHI-nodes correctly
This change addresses three issues:
- Read only scalars that enter a PHI node through an edge that comes from
outside the scop are not modeled any more, as such PHI nodes will always
be initialized to this initial value right before the SCoP is entered.
- For PHI nodes that depend on a scalar value that is defined outside the
scop, but where the scalar values is passed through an edge that itself
comes from a BB that is part of the region, we introduce in this basic
block a read of the out-of-scop value to ensure it's value is available
to write it into the PHI alloc location.
- Read only uses of scalars by PHI nodes are ignored in the general read only
handling code, as they are taken care of by the general PHI node modeling
code.
Added:
polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi-2.ll
polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi.ll
Modified:
polly/trunk/lib/Analysis/ScopInfo.cpp
Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=248535&r1=248534&r2=248535&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Thu Sep 24 15:59:59 2015
@@ -2707,6 +2707,8 @@ void ScopInfo::buildPHIAccesses(PHINode
addMemoryAccess(OpIBB, OpI, MemoryAccess::MUST_WRITE, OpI, 1, true,
OpI);
}
+ } else if (ModelReadOnlyScalars && !isa<Constant>(Op)) {
+ addMemoryAccess(OpBB, PHI, MemoryAccess::READ, Op, 1, true, Op);
}
// Always use the terminator of the incoming basic block as the access
@@ -2779,7 +2781,7 @@ bool ScopInfo::buildScalarDependences(In
addMemoryAccess(UseParent, UI, MemoryAccess::READ, Inst, 1, true, Inst);
}
- if (ModelReadOnlyScalars) {
+ if (ModelReadOnlyScalars && !isa<PHINode>(Inst)) {
for (Value *Op : Inst->operands()) {
if (canSynthesize(Op, LI, SE, R))
continue;
Added: polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi-2.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi-2.ll?rev=248535&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi-2.ll (added)
+++ polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi-2.ll Thu Sep 24 15:59:59 2015
@@ -0,0 +1,37 @@
+; RUN: opt %loadPolly -polly-scops -analyze -polly-detect-unprofitable \
+; RUN: < %s | FileCheck %s
+;
+; float foo(float sum, float A[]) {
+;
+; for (long i = 0; i < 100; i++)
+; sum += A[i];
+;
+; return sum;
+; }
+
+; Verify that we do not model the read from %sum. Reads that only happen in
+; case control flow reaches the PHI node from outside the SCoP are handled
+; implicitly during code generation.
+
+; CHECK: Stmt_bb1[i0] -> MemRef_phisum__ph
+; CHECK-NOT: Stmt_bb1[i0] -> MemRef_sum[]
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define float @foo(float %sum, float* %A) {
+bb:
+ br label %bb1
+
+bb1:
+ %i = phi i64 [ 0, %bb ], [ %i.next, %bb1 ]
+ %phisum = phi float [ %sum, %bb ], [ %tmp5, %bb1 ]
+ %tmp = getelementptr inbounds float, float* %A, i64 %i
+ %tmp4 = load float, float* %tmp, align 4
+ %tmp5 = fadd float %phisum, %tmp4
+ %i.next = add nuw nsw i64 %i, 1
+ %exitcond = icmp ne i64 %i, 100
+ br i1 %exitcond, label %bb1, label %bb7
+
+bb7:
+ ret float %phisum
+}
Added: 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=248535&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi.ll (added)
+++ polly/trunk/test/ScopInfo/read-only-scalar-used-in-phi.ll Thu Sep 24 15:59:59 2015
@@ -0,0 +1,56 @@
+; RUN: opt %loadPolly -analyze -polly-scops -polly-detect-unprofitable \
+; RUN: < %s | FileCheck %s
+;
+; float foo(float sum, float A[]) {
+;
+; for (long i = 0; i < 100; i++)
+; sum += A[i];
+;
+; return sum;
+; }
+
+; CHECK: Stmt_next
+; CHECK: Domain :=
+; CHECK: { Stmt_next[] };
+; CHECK: Schedule :=
+; CHECK: { Stmt_next[] -> [0, 0] };
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK: { Stmt_next[] -> MemRef_sum[] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK: { Stmt_next[] -> MemRef_phisum__phi[] };
+; CHECK: Stmt_bb1
+; CHECK: Domain :=
+; CHECK: { Stmt_bb1[i0] : i0 <= 100 and i0 >= 0 };
+; CHECK: Schedule :=
+; CHECK: { Stmt_bb1[i0] -> [1, i0] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; 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] };
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define float @foo(float %sum, float* %A) {
+bb:
+ br label %next
+
+next:
+ br i1 true, label %bb1, label %bb7
+
+bb1:
+ %i = phi i64 [ 0, %next ], [ %i.next, %bb1 ]
+ %phisum = phi float [ %sum, %next ], [ %tmp5, %bb1 ]
+ %tmp = getelementptr inbounds float, float* %A, i64 %i
+ %tmp4 = load float, float* %tmp, align 4
+ %tmp5 = fadd float %phisum, %tmp4
+ %i.next = add nuw nsw i64 %i, 1
+ %exitcond = icmp ne i64 %i, 100
+ br i1 %exitcond, label %bb1, label %bb7
+
+bb7:
+ ret float %phisum
+}
More information about the llvm-commits
mailing list