summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Grosser <grosser@fim.uni-passau.de>2013-06-21 06:41:31 +0000
committerTobias Grosser <grosser@fim.uni-passau.de>2013-06-21 06:41:31 +0000
commitedab1359a0ad2141f797bc6a1039cc4dc1dd8829 (patch)
tree7bd10390fd315b4551c20f8f185fe6ca1c518980
parent4773a10cfbaefad4166edb836dcf29946e82e5e8 (diff)
downloadbcm5719-llvm-edab1359a0ad2141f797bc6a1039cc4dc1dd8829.tar.gz
bcm5719-llvm-edab1359a0ad2141f797bc6a1039cc4dc1dd8829.zip
Use isl_val instead of isl_int in the core of Polly
isl recently introduced isl_val as an abstract interface to represent arbitrary precision numbers. This interface superseeds the old isl_int interface. In contrast to the old interface which implemented arbitrary precision arithmetic using macros that forward to the gmp library, the new library hides the math library implementation in isl. This allows us to switch the math library used by isl without affecting users such as Polly. llvm-svn: 184529
-rw-r--r--polly/include/polly/CodeGen/CodeGeneration.h9
-rwxr-xr-xpolly/include/polly/Support/GICHelper.h8
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp57
-rw-r--r--polly/lib/CodeGen/BlockGenerators.cpp30
-rw-r--r--polly/lib/CodeGen/IslCodeGeneration.cpp8
-rw-r--r--polly/lib/ScheduleOptimizer.cpp8
-rw-r--r--polly/lib/Support/GICHelper.cpp47
-rwxr-xr-xpolly/utils/checkout_cloog.sh2
8 files changed, 102 insertions, 67 deletions
diff --git a/polly/include/polly/CodeGen/CodeGeneration.h b/polly/include/polly/CodeGen/CodeGeneration.h
index e57d979582b..648c2217434 100644
--- a/polly/include/polly/CodeGen/CodeGeneration.h
+++ b/polly/include/polly/CodeGen/CodeGeneration.h
@@ -58,11 +58,10 @@ static inline int getNumberOfIterations(__isl_take isl_set *Domain) {
isl_point *P = isl_set_sample_point(Elements);
- isl_int V;
- isl_int_init(V);
- isl_point_get_coordinate(P, isl_dim_set, Dim - 1, &V);
- int NumberIterations = isl_int_get_si(V);
- isl_int_clear(V);
+ isl_val *V;
+ V = isl_point_get_coordinate_val(P, isl_dim_set, Dim - 1);
+ int NumberIterations = isl_val_get_num_si(V);
+ isl_val_free(V);
isl_point_free(P);
return NumberIterations;
diff --git a/polly/include/polly/Support/GICHelper.h b/polly/include/polly/Support/GICHelper.h
index f06e0c0f38c..f9d773e55ec 100755
--- a/polly/include/polly/Support/GICHelper.h
+++ b/polly/include/polly/Support/GICHelper.h
@@ -17,6 +17,8 @@
#include "llvm/ADT/APInt.h"
#include <gmp.h>
+#include "isl/ctx.h"
+
struct isl_map;
struct isl_union_map;
struct isl_set;
@@ -26,6 +28,7 @@ struct isl_multi_aff;
struct isl_pw_multi_aff;
struct isl_aff;
struct isl_pw_aff;
+struct isl_val;
namespace polly {
@@ -40,6 +43,11 @@ void MPZ_from_APInt(mpz_t v, const llvm::APInt apint, bool is_signed = true);
/// @param mpz The mpz_t you want to convert.
llvm::APInt APInt_from_MPZ(const mpz_t mpz);
+
+__isl_give isl_val *isl_valFromAPInt(isl_ctx *Ctx, const llvm::APInt Int, bool
+ IsSigned);
+llvm::APInt APIntFromVal(__isl_take isl_val *Val);
+
/// @brief Get c++ string from Isl objects.
//@{
std::string stringFromIslObj(/*__isl_keep*/ isl_map *map);
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index cc28d33a32d..881375b34ad 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -44,6 +44,7 @@
#include "isl/printer.h"
#include "isl/local_space.h"
#include "isl/options.h"
+#include "isl/val.h"
#include <sstream>
#include <string>
#include <vector>
@@ -98,8 +99,7 @@ public:
__isl_give isl_pw_aff *visitConstant(const SCEVConstant *Constant) {
ConstantInt *Value = Constant->getValue();
- isl_int v;
- isl_int_init(v);
+ isl_val *v;
// LLVM does not define if an integer value is interpreted as a signed or
// unsigned value. Hence, without further information, it is unknown how
@@ -111,15 +111,14 @@ public:
// demand.
// 2. We pass down the signedness of the calculation and use it to interpret
// this constant correctly.
- MPZ_from_APInt(v, Value->getValue(), /* isSigned */ true);
+ v = isl_valFromAPInt(Ctx, Value->getValue(), /* isSigned */ true);
isl_space *Space = isl_space_set_alloc(Ctx, 0, NbLoopSpaces);
isl_local_space *ls = isl_local_space_from_space(isl_space_copy(Space));
isl_aff *Affine = isl_aff_zero_on_domain(ls);
isl_set *Domain = isl_set_universe(Space);
- Affine = isl_aff_add_constant(Affine, v);
- isl_int_clear(v);
+ Affine = isl_aff_add_constant_val(Affine, v);
return isl_pw_aff_alloc(Domain, Affine);
}
@@ -299,11 +298,10 @@ MemoryAccess::MemoryAccess(const IRAccess &Access, const Instruction *AccInst,
// subsequent values of 'i' index two values that are stored next to each
// other in memory. By this division we make this characteristic obvious
// again.
- isl_int v;
- isl_int_init(v);
- isl_int_set_si(v, Access.getElemSizeInBytes());
- Affine = isl_pw_aff_scale_down(Affine, v);
- isl_int_clear(v);
+ isl_val *v;
+ v = isl_val_int_from_si(isl_pw_aff_get_ctx(Affine),
+ Access.getElemSizeInBytes());
+ Affine = isl_pw_aff_scale_down_val(Affine, v);
AccessRelation = isl_map_from_pw_aff(Affine);
isl_space *Space = Statement->getDomainSpace();
@@ -368,16 +366,15 @@ static isl_map *getEqualAndLarger(isl_space *setDomain) {
// input[?,?,?,...,iX] -> output[?,?,?,...,oX] : iX < oX
//
unsigned lastDimension = isl_map_dim(Map, isl_dim_in) - 1;
- isl_int v;
- isl_int_init(v);
+ isl_val *v;
+ isl_ctx *Ctx = isl_map_get_ctx(Map);
isl_constraint *c = isl_inequality_alloc(isl_local_space_copy(MapLocalSpace));
- isl_int_set_si(v, -1);
- isl_constraint_set_coefficient(c, isl_dim_in, lastDimension, v);
- isl_int_set_si(v, 1);
- isl_constraint_set_coefficient(c, isl_dim_out, lastDimension, v);
- isl_int_set_si(v, -1);
- isl_constraint_set_constant(c, v);
- isl_int_clear(v);
+ v = isl_val_int_from_si(Ctx, -1);
+ c = isl_constraint_set_coefficient_val(c, isl_dim_in, lastDimension, v);
+ v = isl_val_int_from_si(Ctx, 1);
+ c = isl_constraint_set_coefficient_val(c, isl_dim_out, lastDimension, v);
+ v = isl_val_int_from_si(Ctx, -1);
+ c = isl_constraint_set_constant_val(c, v);
Map = isl_map_add_constraint(Map, c);
@@ -736,7 +733,7 @@ void Scop::buildContext() {
void Scop::addParameterBounds() {
for (unsigned i = 0; i < isl_set_dim(Context, isl_dim_param); ++i) {
- isl_int V;
+ isl_val *V;
isl_id *Id;
const SCEV *Scev;
const IntegerType *T;
@@ -749,19 +746,15 @@ void Scop::addParameterBounds() {
assert(T && "Not an integer type");
int Width = T->getBitWidth();
- isl_int_init(V);
+ V = isl_val_int_from_si(IslCtx, Width - 1);
+ V = isl_val_2exp(V);
+ V = isl_val_neg(V);
+ Context = isl_set_lower_bound_val(Context, isl_dim_param, i, 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);
+ V = isl_val_int_from_si(IslCtx, Width - 1);
+ V = isl_val_2exp(V);
+ V = isl_val_sub_ui(V, 1);
+ Context = isl_set_upper_bound_val(Context, isl_dim_param, i, V);
}
}
diff --git a/polly/lib/CodeGen/BlockGenerators.cpp b/polly/lib/CodeGen/BlockGenerators.cpp
index 7ca5d2dd445..b0bc9dcf7f2 100644
--- a/polly/lib/CodeGen/BlockGenerators.cpp
+++ b/polly/lib/CodeGen/BlockGenerators.cpp
@@ -66,7 +66,7 @@ class IslGenerator {
public:
IslGenerator(IRBuilder<> &Builder, std::vector<Value *> &IVS)
: Builder(Builder), IVS(IVS) {}
- Value *generateIslInt(__isl_take isl_int Int);
+ Value *generateIslVal(__isl_take isl_val *Val);
Value *generateIslAff(__isl_take isl_aff *Aff);
Value *generateIslPwAff(__isl_take isl_pw_aff *PwAff);
@@ -83,23 +83,18 @@ private:
};
}
-Value *IslGenerator::generateIslInt(isl_int Int) {
- mpz_t IntMPZ;
- mpz_init(IntMPZ);
- isl_int_get_gmp(Int, IntMPZ);
- Value *IntValue = Builder.getInt(APInt_from_MPZ(IntMPZ));
- mpz_clear(IntMPZ);
+Value *IslGenerator::generateIslVal(__isl_take isl_val *Val) {
+ Value *IntValue = Builder.getInt(APIntFromVal(Val));
return IntValue;
}
Value *IslGenerator::generateIslAff(__isl_take isl_aff *Aff) {
Value *Result;
Value *ConstValue;
- isl_int ConstIsl;
+ isl_val *Val;
- isl_int_init(ConstIsl);
- isl_aff_get_constant(Aff, &ConstIsl);
- ConstValue = generateIslInt(ConstIsl);
+ Val = isl_aff_get_constant_val(Aff);
+ ConstValue = generateIslVal(Val);
Type *Ty = Builder.getInt64Ty();
// FIXME: We should give the constant and coefficients the right type. Here
@@ -112,25 +107,22 @@ Value *IslGenerator::generateIslAff(__isl_take isl_aff *Aff) {
"The Dimension of Induction Variables must match the dimension of the "
"affine space.");
- isl_int CoefficientIsl;
- isl_int_init(CoefficientIsl);
-
for (unsigned int i = 0; i < NbInputDims; ++i) {
Value *CoefficientValue;
- isl_aff_get_coefficient(Aff, isl_dim_in, i, &CoefficientIsl);
+ Val = isl_aff_get_coefficient_val(Aff, isl_dim_in, i);
- if (isl_int_is_zero(CoefficientIsl))
+ if (isl_val_is_zero(Val)) {
+ isl_val_free(Val);
continue;
+ }
- CoefficientValue = generateIslInt(CoefficientIsl);
+ CoefficientValue = generateIslVal(Val);
CoefficientValue = Builder.CreateIntCast(CoefficientValue, Ty, true);
Value *IV = Builder.CreateIntCast(IVS[i], Ty, true);
Value *PAdd = Builder.CreateMul(CoefficientValue, IV, "p_mul_coeff");
Result = Builder.CreateAdd(Result, PAdd, "p_sum_coeff");
}
- isl_int_clear(CoefficientIsl);
- isl_int_clear(ConstIsl);
isl_aff_free(Aff);
return Result;
diff --git a/polly/lib/CodeGen/IslCodeGeneration.cpp b/polly/lib/CodeGen/IslCodeGeneration.cpp
index d5c3a9f4359..327d2cf1476 100644
--- a/polly/lib/CodeGen/IslCodeGeneration.cpp
+++ b/polly/lib/CodeGen/IslCodeGeneration.cpp
@@ -505,20 +505,18 @@ IntegerType *IslExprBuilder::getType(__isl_keep isl_ast_expr *Expr) {
Value *IslExprBuilder::createInt(__isl_take isl_ast_expr *Expr) {
assert(isl_ast_expr_get_type(Expr) == isl_ast_expr_int &&
"Expression not of type isl_ast_expr_int");
- isl_int Int;
+ isl_val *Val;
Value *V;
APInt APValue;
IntegerType *T;
- isl_int_init(Int);
- isl_ast_expr_get_int(Expr, &Int);
- APValue = APInt_from_MPZ(Int);
+ Val = isl_ast_expr_get_val(Expr);
+ APValue = APIntFromVal(Val);
T = getType(Expr);
APValue = APValue.sextOrSelf(T->getBitWidth());
V = ConstantInt::get(T, APValue);
isl_ast_expr_free(Expr);
- isl_int_clear(Int);
return V;
}
diff --git a/polly/lib/ScheduleOptimizer.cpp b/polly/lib/ScheduleOptimizer.cpp
index 05336c7d9c0..d88563b3924 100644
--- a/polly/lib/ScheduleOptimizer.cpp
+++ b/polly/lib/ScheduleOptimizer.cpp
@@ -314,7 +314,7 @@ isl_map *IslScheduleOptimizer::getPrevectorMap(isl_ctx *ctx, int DimToVectorize,
isl_aff *Aff;
int PointDimension; /* ip */
int TileDimension; /* it */
- isl_int VectorWidthMP;
+ isl_val *VectorWidthMP;
assert(0 <= DimToVectorize && DimToVectorize < ScheduleDimensions);
@@ -343,10 +343,8 @@ isl_map *IslScheduleOptimizer::getPrevectorMap(isl_ctx *ctx, int DimToVectorize,
Aff = isl_aff_zero_on_domain(LocalSpaceRange);
Aff = isl_aff_set_constant_si(Aff, VectorWidth);
Aff = isl_aff_set_coefficient_si(Aff, isl_dim_in, TileDimension, 1);
- isl_int_init(VectorWidthMP);
- isl_int_set_si(VectorWidthMP, VectorWidth);
- Aff = isl_aff_mod(Aff, VectorWidthMP);
- isl_int_clear(VectorWidthMP);
+ VectorWidthMP = isl_val_int_from_si(ctx, VectorWidth);
+ Aff = isl_aff_mod_val(Aff, VectorWidthMP);
Modulo = isl_pw_aff_zero_set(isl_pw_aff_from_aff(Aff));
TilingMap = isl_map_intersect_range(TilingMap, Modulo);
diff --git a/polly/lib/Support/GICHelper.cpp b/polly/lib/Support/GICHelper.cpp
index f1fe15a7928..11fc197967f 100644
--- a/polly/lib/Support/GICHelper.cpp
+++ b/polly/lib/Support/GICHelper.cpp
@@ -17,6 +17,9 @@
#include "isl/set.h"
#include "isl/union_map.h"
#include "isl/union_set.h"
+#include "isl/val.h"
+
+#include "llvm/Support/raw_ostream.h"
using namespace llvm;
@@ -39,6 +42,27 @@ void polly::MPZ_from_APInt(mpz_t v, const APInt apint, bool is_signed) {
mpz_neg(v, v);
}
+__isl_give isl_val *polly::isl_valFromAPInt(isl_ctx *Ctx, const APInt Int,
+ bool IsSigned) {
+ APInt Abs;
+ isl_val *v;
+
+ if (IsSigned)
+ Abs = Int.abs();
+ else
+ Abs = Int;
+
+ const uint64_t *Data = Abs.getRawData();
+ unsigned Words = Abs.getNumWords();
+
+ v = isl_val_int_from_chunks(Ctx, Words, sizeof(uint64_t), Data);
+
+ if (IsSigned && Int.isNegative())
+ v = isl_val_neg(v);
+
+ return v;
+}
+
APInt polly::APInt_from_MPZ(const mpz_t mpz) {
uint64_t *p = NULL;
size_t sz;
@@ -60,6 +84,29 @@ APInt polly::APInt_from_MPZ(const mpz_t mpz) {
}
}
+APInt polly::APIntFromVal(__isl_take isl_val *Val) {
+ uint64_t *Data;
+ int NumChunks;
+
+ NumChunks = isl_val_n_abs_num_chunks(Val, sizeof(uint64_t));
+
+ Data = (uint64_t*) malloc(NumChunks * sizeof(uint64_t));
+ isl_val_get_abs_num_chunks(Val, sizeof(uint64_t), Data);
+ APInt A(8 * sizeof(uint64_t) * NumChunks, NumChunks, Data);
+
+ if (isl_val_is_neg(Val)) {
+ A = A.zext(A.getBitWidth() + 1);
+ A = -A;
+ }
+
+ if (A.getMinSignedBits() < A.getBitWidth())
+ A = A.trunc(A.getMinSignedBits());
+
+ free(Data);
+ isl_val_free(Val);
+ return A;
+}
+
template <typename ISLTy, typename ISL_CTX_GETTER, typename ISL_PRINTER>
static inline std::string stringFromIslObjInternal(__isl_keep ISLTy *isl_obj,
ISL_CTX_GETTER ctx_getter_fn,
diff --git a/polly/utils/checkout_cloog.sh b/polly/utils/checkout_cloog.sh
index 1296c96a466..95f037e2719 100755
--- a/polly/utils/checkout_cloog.sh
+++ b/polly/utils/checkout_cloog.sh
@@ -1,7 +1,7 @@
#!/bin/sh
CLOOG_HASH="f861f854b6cc85b67e39794e38e7104fcd59af90"
-ISL_HASH="1df91d8515ec88dc7f7f597168ad0f34f26de5a7"
+ISL_HASH="0a83197c479109b0f7c327484b80a878f291b296"
PWD=`pwd`
OpenPOWER on IntegriCloud