forked from OSchip/llvm-project
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:
parent
3b2cf96bae
commit
18daacad61
|
@ -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
|
||||
|
|
|
@ -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!");
|
||||
}
|
||||
|
|
|
@ -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 :=
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
CLOOG_HASH="57470e76bfd58a0c38c598e816411663193e0f45"
|
||||
ISL_HASH="2b54bb607bfc666dfee01c6332e347d0c253335f"
|
||||
ISL_HASH="edfaf3a8006bbf9f4dd7db7fef4035402e14dff6"
|
||||
|
||||
PWD=`pwd`
|
||||
|
||||
|
|
Loading…
Reference in New Issue