diff options
author | Johannes Doerfert <jdoerfert@codeaurora.org> | 2014-07-28 03:46:28 +0000 |
---|---|---|
committer | Johannes Doerfert <jdoerfert@codeaurora.org> | 2014-07-28 03:46:28 +0000 |
commit | 515f85770cbd6127185e7dc6746429b08c2ebe43 (patch) | |
tree | 6fc8bffa87dc6887bd8e4b7d2660ce0e81f9c199 /polly/lib/CodeGen/CodeGeneration.cpp | |
parent | 636b6a2fd784c10f502b853d0d99773dedfdc8f5 (diff) | |
download | bcm5719-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.cpp | 26 |
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) { |