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
This commit is contained in:
Tobias Grosser 2012-05-22 10:47:27 +00:00
parent 3b2cf96bae
commit 18daacad61
4 changed files with 39 additions and 2 deletions

View File

@ -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

View File

@ -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<IntegerType>(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!");
}

View File

@ -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 :=

View File

@ -1,7 +1,7 @@
#!/bin/sh
CLOOG_HASH="57470e76bfd58a0c38c598e816411663193e0f45"
ISL_HASH="2b54bb607bfc666dfee01c6332e347d0c253335f"
ISL_HASH="edfaf3a8006bbf9f4dd7db7fef4035402e14dff6"
PWD=`pwd`