summaryrefslogtreecommitdiffstats
path: root/polly/lib/CodeGen/CodeGeneration.cpp
diff options
context:
space:
mode:
authorJohannes Doerfert <jdoerfert@codeaurora.org>2014-07-28 03:46:28 +0000
committerJohannes Doerfert <jdoerfert@codeaurora.org>2014-07-28 03:46:28 +0000
commit515f85770cbd6127185e7dc6746429b08c2ebe43 (patch)
tree6fc8bffa87dc6887bd8e4b7d2660ce0e81f9c199 /polly/lib/CodeGen/CodeGeneration.cpp
parent636b6a2fd784c10f502b853d0d99773dedfdc8f5 (diff)
downloadbcm5719-llvm-515f85770cbd6127185e7dc6746429b08c2ebe43.tar.gz
bcm5719-llvm-515f85770cbd6127185e7dc6746429b08c2ebe43.zip
Replace the dependences parallelism check by the IslAst one
llvm-svn: 214061
Diffstat (limited to 'polly/lib/CodeGen/CodeGeneration.cpp')
-rw-r--r--polly/lib/CodeGen/CodeGeneration.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/polly/lib/CodeGen/CodeGeneration.cpp b/polly/lib/CodeGen/CodeGeneration.cpp
index 1f093fb25c9..56b2ab34af3 100644
--- a/polly/lib/CodeGen/CodeGeneration.cpp
+++ b/polly/lib/CodeGen/CodeGeneration.cpp
@@ -861,13 +861,35 @@ void ClastStmtCodeGen::codegenForVector(const clast_for *F) {
ClastVars.erase(F->iterator);
}
+static isl_union_map *getCombinedScheduleForSpace(Scop *S, unsigned dimLevel) {
+ isl_space *Space = S->getParamSpace();
+ isl_union_map *schedule = isl_union_map_empty(Space);
+
+ for (ScopStmt *Stmt : *S) {
+ unsigned remainingDimensions = Stmt->getNumScattering() - dimLevel;
+ isl_map *Scattering = isl_map_project_out(
+ Stmt->getScattering(), isl_dim_out, dimLevel, remainingDimensions);
+ schedule = isl_union_map_add_map(schedule, Scattering);
+ }
+
+ return schedule;
+}
+
bool ClastStmtCodeGen::isParallelFor(const clast_for *f) {
isl_set *Domain = isl_set_copy(isl_set_from_cloog_domain(f->domain));
assert(Domain && "Cannot access domain of loop");
Dependences &D = P->getAnalysis<Dependences>();
-
- return D.isParallelDimension(Domain, isl_set_n_dim(Domain));
+ isl_union_map *Deps =
+ D.getDependences(Dependences::TYPE_RAW | Dependences::TYPE_WAW |
+ Dependences::TYPE_WAR | Dependences::TYPE_RAW);
+ isl_union_map *Schedule =
+ getCombinedScheduleForSpace(S, isl_set_n_dim(Domain));
+ Schedule =
+ isl_union_map_intersect_range(Schedule, isl_union_set_from_set(Domain));
+ bool IsParallel = D.isParallel(Schedule, Deps);
+ isl_union_map_free(Schedule);
+ return IsParallel;
}
void ClastStmtCodeGen::codegen(const clast_for *f) {
OpenPOWER on IntegriCloud