summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Grosser <grosser@fim.uni-passau.de>2011-08-19 23:34:28 +0000
committerTobias Grosser <grosser@fim.uni-passau.de>2011-08-19 23:34:28 +0000
commit7d4cee4b0269ef03a016d51a46819cce6a56a4d5 (patch)
treeacb0246be221d274d294f4a4a88b1c6679d0c861
parent756f8ae5206e307f3bb3e8f6bc7ffaef17acc562 (diff)
downloadbcm5719-llvm-7d4cee4b0269ef03a016d51a46819cce6a56a4d5.tar.gz
bcm5719-llvm-7d4cee4b0269ef03a016d51a46819cce6a56a4d5.zip
ScopInfo: Construct the accessrelations with isl_pw_aff
This simplifies the code quite a bit. llvm-svn: 138147
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp55
1 files changed, 17 insertions, 38 deletions
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index c56f9eff463..362166886c5 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -303,22 +303,6 @@ public:
}
};
-static isl_map *getValueOf(const SCEVAffFunc &AffFunc,
- const ScopStmt *Statement, isl_dim *dim) {
- assert((AffFunc.getType() == SCEVAffFunc::Eq
- || AffFunc.getType() == SCEVAffFunc::ReadMem
- || AffFunc.getType() == SCEVAffFunc::WriteMem)
- && "AffFunc is not an equality");
- isl_pw_aff *Affine = SCEVAffinator::getPwAff(Statement, AffFunc.OriginalSCEV,
- AffFunc.getBaseAddr());
- isl_map *Map = isl_map_from_pw_aff(Affine);
- isl_dim *CtxDim = isl_set_get_dim(Statement->getParent()->getContext());
-
- isl_map_align_params(Map, CtxDim);
- const char *dimname = isl_dim_get_tuple_name(dim, isl_dim_set);
- Map = isl_map_set_tuple_name(Map, isl_dim_in, dimname);
- return Map;
-}
//===----------------------------------------------------------------------===//
MemoryAccess::~MemoryAccess() {
@@ -376,36 +360,31 @@ MemoryAccess::MemoryAccess(const SCEVAffFunc &AffFunc, ScopStmt *Statement) {
setBaseName();
- isl_dim *dim = isl_dim_set_alloc(Statement->getIslContext(),
- Statement->getNumParams(),
- Statement->getNumIterators());
- dim = isl_dim_set_tuple_name(dim, isl_dim_set, Statement->getBaseName());
-
- AccessRelation = getValueOf(AffFunc, Statement, dim);
+ isl_pw_aff *Affine = SCEVAffinator::getPwAff(Statement, AffFunc.OriginalSCEV,
+ AffFunc.getBaseAddr());
- // Devide the access function by the size of the elements in the function.
- isl_dim *dim2 = isl_dim_alloc(Statement->getIslContext(),
- 0, 1, 1);
- isl_basic_map *bmap = isl_basic_map_universe(isl_dim_copy(dim2));
- isl_constraint *c = isl_equality_alloc(dim2);
+ // Devide the access function by the size of the elements in the array.
+ //
+ // A stride one array access in C expressed as A[i] is expressed in LLVM-IR
+ // as something like A[i * elementsize]. This hides the fact that two
+ // subsequent values of 'i' index two values that are stored next to each
+ // other in memory. By this devision we make this characteristic obvious
+ // again.
isl_int v;
isl_int_init(v);
- isl_int_set_si(v, -1);
- isl_constraint_set_coefficient(c, isl_dim_in, 0, v);
isl_int_set_si(v, AffFunc.getElemSizeInBytes());
- isl_constraint_set_coefficient(c, isl_dim_out, 0, v);
-
- bmap = isl_basic_map_add_constraint(bmap, c);
- isl_map* dataSizeMap = isl_map_from_basic_map(bmap);
-
- isl_dim *Model = isl_set_get_dim(Statement->getParent()->getContext());
- dataSizeMap = isl_map_align_params(dataSizeMap, Model);
-
- AccessRelation = isl_map_apply_range(AccessRelation, dataSizeMap);
+ Affine = isl_pw_aff_scale_down(Affine, v);
+ isl_int_clear(v);
+ AccessRelation = isl_map_from_pw_aff(Affine);
+ AccessRelation = isl_map_set_tuple_name(AccessRelation, isl_dim_in,
+ Statement->getBaseName());
AccessRelation = isl_map_set_tuple_name(AccessRelation, isl_dim_out,
getBaseName().c_str());
+ isl_dim *Model = isl_set_get_dim(Statement->getParent()->getContext());
+ AccessRelation = isl_map_align_params(AccessRelation, Model);
+
// FIXME: Temporarily remove dimension ids.
AccessRelation = map_remove_dim_ids(AccessRelation);
}
OpenPOWER on IntegriCloud