From 18daacad61e59994ffc64d2abdb0eb08e07f25aa Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Tue, 22 May 2012 10:47:27 +0000 Subject: [PATCH] ScopInfo: Add parameter bounds to context Derive the maximal and minimal values of a parameter from the type it has. Add this information to the scop context. This information is needed, to derive optimal types during code generation. llvm-svn: 157245 --- polly/include/polly/ScopInfo.h | 3 +++ polly/lib/Analysis/ScopInfo.cpp | 34 ++++++++++++++++++++++++++++++++++ polly/test/ScopInfo/loop_carry.ll | 2 +- polly/utils/checkout_cloog.sh | 2 +- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index 4eb1ece..9bb08ef 100755 --- a/polly/include/polly/ScopInfo.h +++ b/polly/include/polly/ScopInfo.h @@ -443,6 +443,9 @@ class Scop { /// @brief Build the Context of the Scop. void buildContext(); + /// @brief Add the bounds of the parameters to the context. + void addParameterBounds(); + /// Build the Scop and Statement with precalculate scop information. void buildScop(TempScop &TempScop, const Region &CurRegion, // Loops in Scop containing CurRegion diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index b1b95c0..2c9486c 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -37,6 +37,7 @@ #define DEBUG_TYPE "polly-scops" #include "llvm/Support/Debug.h" +#include "isl/int.h" #include "isl/constraint.h" #include "isl/set.h" #include "isl/map.h" @@ -755,6 +756,38 @@ void Scop::buildContext() { Context = isl_set_universe (Space); } +void Scop::addParameterBounds() { + for (unsigned i = 0; i < isl_set_dim(Context, isl_dim_param); ++i) { + isl_int V; + isl_id *Id; + const SCEV *Scev; + const IntegerType *T; + + Id = isl_set_get_dim_id(Context, isl_dim_param, i); + Scev = (const SCEV*) isl_id_get_user(Id); + T = dyn_cast(Scev->getType()); + isl_id_free(Id); + + assert(T && "Not an integer type"); + int Width = T->getBitWidth(); + + isl_int_init(V); + + isl_int_set_si(V, 1); + isl_int_mul_2exp(V, V, Width-1); + isl_int_neg(V, V); + isl_set_lower_bound(Context, isl_dim_param, i, V); + + isl_int_set_si(V, 1); + isl_int_mul_2exp(V, V, Width-1); + isl_int_sub_ui(V, V, 1); + isl_set_upper_bound(Context, isl_dim_param, i, V); + + isl_int_clear(V); + } +} + + void Scop::realignParams() { // Add all parameters into a common model. isl_space *Space = isl_space_params_alloc(IslCtx, ParameterIds.size()); @@ -790,6 +823,7 @@ Scop::Scop(TempScop &tempScop, LoopInfo &LI, ScalarEvolution &ScalarEvolution, buildScop(tempScop, getRegion(), NestLoops, Scatter, LI); realignParams(); + addParameterBounds(); assert(NestLoops.empty() && "NestLoops not empty at top level!"); } diff --git a/polly/test/ScopInfo/loop_carry.ll b/polly/test/ScopInfo/loop_carry.ll index e45fb85..f61bb00 100644 --- a/polly/test/ScopInfo/loop_carry.ll +++ b/polly/test/ScopInfo/loop_carry.ll @@ -47,7 +47,7 @@ bb2: ; preds = %bb, %entry } ; CHECK: Context: -; CHECK: [n] -> { : } +; CHECK: [n] -> { : n >= -9223372036854775808 and n <= 9223372036854775807 } ; CHECK: Statements { ; CHECK: Stmt_bb_nph ; CHECK: Domain := diff --git a/polly/utils/checkout_cloog.sh b/polly/utils/checkout_cloog.sh index b8832da..7d9928d 100755 --- a/polly/utils/checkout_cloog.sh +++ b/polly/utils/checkout_cloog.sh @@ -1,7 +1,7 @@ #!/bin/sh CLOOG_HASH="57470e76bfd58a0c38c598e816411663193e0f45" -ISL_HASH="2b54bb607bfc666dfee01c6332e347d0c253335f" +ISL_HASH="edfaf3a8006bbf9f4dd7db7fef4035402e14dff6" PWD=`pwd` -- 2.7.4