diff options
Diffstat (limited to 'polly')
-rw-r--r-- | polly/include/polly/CodeGen/CodeGeneration.h | 9 | ||||
-rwxr-xr-x | polly/include/polly/Support/GICHelper.h | 8 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 57 | ||||
-rw-r--r-- | polly/lib/CodeGen/BlockGenerators.cpp | 30 | ||||
-rw-r--r-- | polly/lib/CodeGen/IslCodeGeneration.cpp | 8 | ||||
-rw-r--r-- | polly/lib/ScheduleOptimizer.cpp | 8 | ||||
-rw-r--r-- | polly/lib/Support/GICHelper.cpp | 47 | ||||
-rwxr-xr-x | polly/utils/checkout_cloog.sh | 2 |
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` |