From fd46308de4ce8f824bf02d560b81084112ea6e95 Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Wed, 27 Jan 2016 22:51:56 +0000 Subject: [PATCH] ScopInfo: Never add read accesses for synthesizable values Before adding a MK_Value READ MemoryAccess, check whether the read is necessary or synthesizable. Synthesizable values are later generated by the SCEVExpander and therefore do not need to be transferred explicitly. This can happen because the check for synthesizability has presumbly been forgotten in the case where a phi's incoming value has been defined in a different statement. Differential Revision: http://reviews.llvm.org/D15687 llvm-svn: 258998 --- polly/lib/Analysis/ScopInfo.cpp | 7 +++++++ polly/test/Isl/CodeGen/phi-defined-before-scop.ll | 3 +-- .../Isl/CodeGen/synthesizable_phi_write_after_loop.ll | 10 ++-------- polly/test/Isl/CodeGen/uninitialized_scalar_memory.ll | 1 - .../ScopInfo/NonAffine/non_affine_loop_used_later.ll | 4 ---- polly/test/ScopInfo/non_affine_region_1.ll | 2 -- polly/test/ScopInfo/non_affine_region_3.ll | 2 -- .../pointer-used-as-base-pointer-and-scalar-read.ll | 8 -------- .../ScopInfo/same-base-address-scalar-and-array.ll | 1 - 9 files changed, 10 insertions(+), 28 deletions(-) diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index a8c8fe3afb84..8f98aa5dde6e 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -3962,6 +3962,13 @@ void ScopInfo::ensureValueWrite(Instruction *Value) { ArrayRef(), ScopArrayInfo::MK_Value); } void ScopInfo::ensureValueRead(Value *Value, BasicBlock *UserBB) { + + // If the instruction can be synthesized and the user is in the region we do + // not need to add a value dependences. + Region &ScopRegion = scop->getRegion(); + if (canSynthesize(Value, LI, SE, &ScopRegion)) + return; + ScopStmt *UserStmt = scop->getStmtForBasicBlock(UserBB); // We do not model uses outside the scop. diff --git a/polly/test/Isl/CodeGen/phi-defined-before-scop.ll b/polly/test/Isl/CodeGen/phi-defined-before-scop.ll index 240d3d3f8668..a04af6491496 100644 --- a/polly/test/Isl/CodeGen/phi-defined-before-scop.ll +++ b/polly/test/Isl/CodeGen/phi-defined-before-scop.ll @@ -4,8 +4,7 @@ ; CHECK-NEXT: %tmp7.ph.merge = phi %struct.wibble* [ %tmp7.ph.final_reload, %polly.exiting ], [ %tmp7.ph, %bb6.region_exiting ] ; CHECK-LABEL: polly.stmt.bb3: -; CHECK-NEXT: %tmp2.s2a.reload = load %struct.wibble*, %struct.wibble** %tmp2.s2a -; CHECK-NEXT: store %struct.wibble* %tmp2.s2a.reload, %struct.wibble** %tmp7.s2a +; CHECK-NEXT: store %struct.wibble* %tmp2, %struct.wibble** %tmp7.s2a target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/Isl/CodeGen/synthesizable_phi_write_after_loop.ll b/polly/test/Isl/CodeGen/synthesizable_phi_write_after_loop.ll index ef068ce397a7..9cd72a82c62b 100644 --- a/polly/test/Isl/CodeGen/synthesizable_phi_write_after_loop.ll +++ b/polly/test/Isl/CodeGen/synthesizable_phi_write_after_loop.ll @@ -8,17 +8,11 @@ ; In this case the Loop passed to the expander must NOT be the loop ; - Overwriting the same alloca in each iteration s.t. the last value will ; retain in %i.inc.s2a -; The latter is currently generated by Polly and tested here. +; The first is currently generated by Polly and tested here. ; CHECK: polly.stmt.next: -; CHECK-NEXT: %i.inc.s2a.reload = load i32, i32* %i.inc.s2a -; CHECK-NEXT: store i32 %i.inc.s2a.reload, i32* %phi.phiops +; CHECK-NEXT: store i32 2, i32* %phi.phiops ; CHECK-NEXT: br label %polly.stmt.join -; -; CHECK: polly.stmt.loop: -; CHECK: %0 = trunc i64 %polly.indvar to i32 -; CHECK: %1 = add i32 %0, 1 -; CHECK: store i32 %1, i32* %i.inc.s2a define i32 @func() { entry: diff --git a/polly/test/Isl/CodeGen/uninitialized_scalar_memory.ll b/polly/test/Isl/CodeGen/uninitialized_scalar_memory.ll index 4f2bb516475e..18e1848b7583 100644 --- a/polly/test/Isl/CodeGen/uninitialized_scalar_memory.ll +++ b/polly/test/Isl/CodeGen/uninitialized_scalar_memory.ll @@ -5,7 +5,6 @@ ; ; CHECK: polly.start: ; CHECK-NEXT: store float %ebig.0, float* %ebig.0.s2a -; CHECK-NEXT: store i32 %iebig.0, i32* %iebig.0.s2a ; CHECK-NEXT: br label %polly.stmt.if.end.entry ; ; int g(void); diff --git a/polly/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll b/polly/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll index 40eb6c4a5bf2..cd022e2c61c4 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll @@ -25,7 +25,6 @@ ; CHECK-NEXT: i32 MemRef_j_0__phi; // Element size 4 ; CHECK-NEXT: i32 MemRef_j_0; // Element size 4 ; CHECK-NEXT: i32 MemRef_A[*]; // Element size 4 -; CHECK-NEXT: i32 MemRef_smax; // Element size 4 ; CHECK-NEXT: i32 MemRef_j_2__phi; // Element size 4 ; CHECK-NEXT: i32 MemRef_j_2; // Element size 4 ; CHECK-NEXT: } @@ -33,7 +32,6 @@ ; CHECK-NEXT: i32 MemRef_j_0__phi; // Element size 4 ; CHECK-NEXT: i32 MemRef_j_0; // Element size 4 ; CHECK-NEXT: i32 MemRef_A[*]; // Element size 4 -; CHECK-NEXT: i32 MemRef_smax; // Element size 4 ; CHECK-NEXT: i32 MemRef_j_2__phi; // Element size 4 ; CHECK-NEXT: i32 MemRef_j_2; // Element size 4 ; CHECK-NEXT: } @@ -60,8 +58,6 @@ ; CHECK-NEXT: [N] -> { Stmt_bb4__TO__bb18[i0] -> MemRef_A[i0] }; ; CHECK-NEXT: MayWriteAccess := [Reduction Type: NONE] [Scalar: 0] ; CHECK-NEXT: [N] -> { Stmt_bb4__TO__bb18[i0] -> MemRef_A[i0] }; -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1] -; CHECK-NEXT: [N] -> { Stmt_bb4__TO__bb18[i0] -> MemRef_smax[] }; ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] ; CHECK-NEXT: [N] -> { Stmt_bb4__TO__bb18[i0] -> MemRef_j_2__phi[] }; ; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1] diff --git a/polly/test/ScopInfo/non_affine_region_1.ll b/polly/test/ScopInfo/non_affine_region_1.ll index b9e0481d7d17..dc142eb0e6bd 100644 --- a/polly/test/ScopInfo/non_affine_region_1.ll +++ b/polly/test/ScopInfo/non_affine_region_1.ll @@ -41,8 +41,6 @@ ; CHECK-NEXT: [b] -> { Stmt_bb8[0] : b = 0 }; ; CHECK-NEXT: Schedule := ; CHECK-NEXT: [b] -> { Stmt_bb8[i0] -> [0, 0] }; -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1] -; CHECK-NEXT: [b] -> { Stmt_bb8[i0] -> MemRef_b[] }; ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] ; CHECK-NEXT: [b] -> { Stmt_bb8[i0] -> MemRef_x_1__phi[] }; ; CHECK-NEXT: Stmt_bb10__TO__bb18 diff --git a/polly/test/ScopInfo/non_affine_region_3.ll b/polly/test/ScopInfo/non_affine_region_3.ll index edea3b41098d..3b43c6360c93 100644 --- a/polly/test/ScopInfo/non_affine_region_3.ll +++ b/polly/test/ScopInfo/non_affine_region_3.ll @@ -31,8 +31,6 @@ ; CHECK-NEXT: { Stmt_bb3__TO__bb18[i0] -> MemRef_A[i0] }; ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] ; CHECK-NEXT: { Stmt_bb3__TO__bb18[i0] -> MemRef_x_2__phi[] }; -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1] -; CHECK-NEXT: { Stmt_bb3__TO__bb18[i0] -> MemRef_b[] }; ; CHECK-NEXT: Stmt_bb18 ; CHECK-NEXT: Domain := ; CHECK-NEXT: { Stmt_bb18[i0] : 0 <= i0 <= 1023 }; diff --git a/polly/test/ScopInfo/pointer-used-as-base-pointer-and-scalar-read.ll b/polly/test/ScopInfo/pointer-used-as-base-pointer-and-scalar-read.ll index 9d0a53ffa52d..11b0e3318146 100644 --- a/polly/test/ScopInfo/pointer-used-as-base-pointer-and-scalar-read.ll +++ b/polly/test/ScopInfo/pointer-used-as-base-pointer-and-scalar-read.ll @@ -6,16 +6,12 @@ ; CHECK: Arrays { ; CHECK-NEXT: float MemRef_A[*]; // Element size 4 -; CHECK-NEXT: float* MemRef_A; // Element size 8 ; CHECK-NEXT: float* MemRef_x__phi; // Element size 8 -; CHECK-NEXT: float* MemRef_B; // Element size 8 ; CHECK-NEXT: float* MemRef_C[*]; // Element size 8 ; CHECK-NEXT: } ; CHECK: Arrays (Bounds as pw_affs) { ; CHECK-NEXT: float MemRef_A[*]; // Element size 4 -; CHECK-NEXT: float* MemRef_A; // Element size 8 ; CHECK-NEXT: float* MemRef_x__phi; // Element size 8 -; CHECK-NEXT: float* MemRef_B; // Element size 8 ; CHECK-NEXT: float* MemRef_C[*]; // Element size 8 ; CHECK-NEXT: } ; CHECK: Alias Groups (0): @@ -28,8 +24,6 @@ ; CHECK-NEXT: [p] -> { Stmt_then[i0] -> [i0, 1] }; ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0] ; CHECK-NEXT: [p] -> { Stmt_then[i0] -> MemRef_A[0] }; -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1] -; CHECK-NEXT: [p] -> { Stmt_then[i0] -> MemRef_A[] }; ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] ; CHECK-NEXT: [p] -> { Stmt_then[i0] -> MemRef_x__phi[] }; ; CHECK-NEXT: Stmt_else @@ -39,8 +33,6 @@ ; CHECK-NEXT: [p] -> { Stmt_else[i0] -> [i0, 0] : p >= 33 or p <= 31 }; ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0] ; CHECK-NEXT: [p] -> { Stmt_else[i0] -> MemRef_A[0] }; -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1] -; CHECK-NEXT: [p] -> { Stmt_else[i0] -> MemRef_B[] }; ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] ; CHECK-NEXT: [p] -> { Stmt_else[i0] -> MemRef_x__phi[] }; ; CHECK-NEXT: Stmt_bb8 diff --git a/polly/test/ScopInfo/same-base-address-scalar-and-array.ll b/polly/test/ScopInfo/same-base-address-scalar-and-array.ll index 017389df1254..65680fd71f4b 100644 --- a/polly/test/ScopInfo/same-base-address-scalar-and-array.ll +++ b/polly/test/ScopInfo/same-base-address-scalar-and-array.ll @@ -4,7 +4,6 @@ ; as it is used as a memory base pointer (%0) but also as a scalar (%out.addr.0.lcssa). ; ; CHECK: Arrays { -; CHECK-NEXT: float* MemRef_out; // Element size 8 ; CHECK-NEXT: float* MemRef_out_addr_0_lcssa; // Element size 8 ; CHECK-NEXT: float MemRef_out[*]; // Element size 4 ; CHECK-NEXT: }