From c2669cdd6aef165ce6bca5b5b1c9443d61fe315b Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Mon, 2 Oct 2017 11:41:19 +0000 Subject: [PATCH] [ScopBuilder] Build escaping dependencies separately. Instructions that compute escaping values might be synthesizable and therefore not contained in any ScopStmt. When buildAccessFunctions is changed to only iterate over the instruction list of statement, "free" instructions still need to be written. We do this after the main MemoryAccesses have been created. This can change the order in which MemoryAccesses are created, but has otherwise no functional change. git-svn-id: https://llvm.org/svn/llvm-project/polly/trunk@314663 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ScopBuilder.cpp | 11 +++++++++-- test/ScopInfo/multidim_2d_with_modref_call.ll | 4 ++-- test/ScopInfo/multidim_2d_with_modref_call_2.ll | 4 ++-- test/ScopInfo/multidim_fortran_2d_with_modref_call.ll | 4 ++-- test/ScopInfo/phi_scalar_simple_2.ll | 4 ++-- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/Analysis/ScopBuilder.cpp b/lib/Analysis/ScopBuilder.cpp index e4c191b9..bbf8f582 100644 --- a/lib/Analysis/ScopBuilder.cpp +++ b/lib/Analysis/ScopBuilder.cpp @@ -657,6 +657,15 @@ void ScopBuilder::buildAccessFunctions() { for (BasicBlock *BB : R->blocks()) buildAccessFunctions(&Stmt, *BB, R); } + + // Build write accesses for values that are used after the SCoP. + // The instructions defining them might be synthesizable and therefore not + // contained in any statement, hence we iterate over the original instructions + // to identify all escaping values. + for (BasicBlock *BB : scop->getRegion().blocks()) { + for (Instruction &Inst : *BB) + buildEscapingDependences(&Inst); + } } bool ScopBuilder::shouldModelInst(Instruction *Inst, Loop *L) { @@ -743,8 +752,6 @@ void ScopBuilder::buildAccessFunctions(ScopStmt *Stmt, BasicBlock &BB, // explicit data dependences. if (!PHI && (!isa(&Inst) || NonAffineSubRegion)) buildScalarDependences(Stmt, &Inst); - - buildEscapingDependences(&Inst); } } diff --git a/test/ScopInfo/multidim_2d_with_modref_call.ll b/test/ScopInfo/multidim_2d_with_modref_call.ll index 3daf8684..6def1371 100644 --- a/test/ScopInfo/multidim_2d_with_modref_call.ll +++ b/test/ScopInfo/multidim_2d_with_modref_call.ll @@ -25,13 +25,13 @@ ; CHECK-NEXT: p0: %tmp14 ; CHECK-NEXT: p1: {0,+,(0 smax %tmp)}<%bb12> ; CHECK-NEXT: Arrays { -; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: i64 MemRef_arg1[*]; // Element size 8 +; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: double MemRef_arg4[*]; // Element size 8 ; CHECK-NEXT: } ; CHECK-NEXT: Arrays (Bounds as pw_affs) { -; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: i64 MemRef_arg1[*]; // Element size 8 +; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: double MemRef_arg4[*]; // Element size 8 ; CHECK-NEXT: } ; CHECK-NEXT: Alias Groups (0): diff --git a/test/ScopInfo/multidim_2d_with_modref_call_2.ll b/test/ScopInfo/multidim_2d_with_modref_call_2.ll index c2800c52..53d4fd1d 100644 --- a/test/ScopInfo/multidim_2d_with_modref_call_2.ll +++ b/test/ScopInfo/multidim_2d_with_modref_call_2.ll @@ -25,13 +25,13 @@ ; CHECK-NEXT: p0: %tmp14 ; CHECK-NEXT: p1: {0,+,(0 smax %tmp)}<%bb12> ; CHECK-NEXT: Arrays { -; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: i64 MemRef_arg1[*]; // Element size 8 +; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: [1000 x double]* MemRef_arg4[*]; // Element size 8 ; CHECK-NEXT: } ; CHECK-NEXT: Arrays (Bounds as pw_affs) { -; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: i64 MemRef_arg1[*]; // Element size 8 +; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: [1000 x double]* MemRef_arg4[*]; // Element size 8 ; CHECK-NEXT: } ; CHECK-NEXT: Alias Groups (0): diff --git a/test/ScopInfo/multidim_fortran_2d_with_modref_call.ll b/test/ScopInfo/multidim_fortran_2d_with_modref_call.ll index 56e43954..c7ac31bd 100644 --- a/test/ScopInfo/multidim_fortran_2d_with_modref_call.ll +++ b/test/ScopInfo/multidim_fortran_2d_with_modref_call.ll @@ -25,13 +25,13 @@ ; CHECK-NEXT: p0: %tmp14 ; CHECK-NEXT: p1: {0,+,(0 smax %tmp)}<%bb12> ; CHECK-NEXT: Arrays { -; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: i64 MemRef_arg1[*]; // Element size 8 +; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: double MemRef_arg4[*]; // Element size 8 ; CHECK-NEXT: } ; CHECK-NEXT: Arrays (Bounds as pw_affs) { -; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: i64 MemRef_arg1[*]; // Element size 8 +; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 ; CHECK-NEXT: double MemRef_arg4[*]; // Element size 8 ; CHECK-NEXT: } ; CHECK-NEXT: Alias Groups (0): diff --git a/test/ScopInfo/phi_scalar_simple_2.ll b/test/ScopInfo/phi_scalar_simple_2.ll index 309499db..46010ac0 100644 --- a/test/ScopInfo/phi_scalar_simple_2.ll +++ b/test/ScopInfo/phi_scalar_simple_2.ll @@ -16,10 +16,10 @@ ; CHECK-NEXT: [N, c] -> { Stmt_for_cond[i0] -> [i0, 0, 0, 0] : i0 <= N; Stmt_for_cond[0] -> [0, 0, 0, 0] : N < 0 }; ; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1] ; CHECK-NEXT: [N, c] -> { Stmt_for_cond[i0] -> MemRef_x_addr_0__phi[] }; -; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] -; CHECK-NEXT: [N, c] -> { Stmt_for_cond[i0] -> MemRef_x_addr_0[] }; ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0] ; CHECK-NEXT: [N, c] -> { Stmt_for_cond[i0] -> MemRef_A[i0] }; +; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] +; CHECK-NEXT: [N, c] -> { Stmt_for_cond[i0] -> MemRef_x_addr_0[] }; ; CHECK-NEXT: Stmt_for_body ; CHECK-NEXT: Domain := ; CHECK-NEXT: [N, c] -> { Stmt_for_body[i0] : 0 <= i0 < N }; -- 2.11.4.GIT