Index: include/polly/DependenceInfo.h =================================================================== --- include/polly/DependenceInfo.h +++ include/polly/DependenceInfo.h @@ -76,20 +76,17 @@ /// connect all instances of a reduction with each other, they are therefore /// cyclic and possibly "reversed". enum Type { - // Write after read - TYPE_WAR = 1 << 0, - // Read after write - TYPE_RAW = 1 << 1, + TYPE_RAW = 1 << 0, - // Write after write - TYPE_WAW = 1 << 2, + // False dependences (write after write / write after read) + TYPE_FALSE = 1 << 2, // Reduction dependences - TYPE_RED = 1 << 3, + TYPE_RED = 1 << 1, // Transitive closure of the reduction dependences (& the reverse) - TYPE_TC_RED = 1 << 4, + TYPE_TC_RED = 1 << 3, }; /// Get the dependences of type @p Kinds. @@ -158,8 +155,8 @@ /// Create an empty dependences struct. explicit Dependences(const std::shared_ptr &IslCtx, AnalysisLevel Level) - : RAW(nullptr), WAR(nullptr), WAW(nullptr), RED(nullptr), TC_RED(nullptr), - IslCtx(IslCtx), Level(Level) {} + : RAW(nullptr), WAR(nullptr), WAW(nullptr), False(nullptr), RED(nullptr), + TC_RED(nullptr), IslCtx(IslCtx), Level(Level) {} /// Calculate and add at the privatization dependences. void addPrivatizationDependences(); @@ -179,6 +176,7 @@ isl_union_map *RAW; isl_union_map *WAR; isl_union_map *WAW; + isl_union_map *False; /// The special reduction dependences. isl_union_map *RED; Index: lib/Analysis/DependenceInfo.cpp =================================================================== --- lib/Analysis/DependenceInfo.cpp +++ lib/Analysis/DependenceInfo.cpp @@ -424,7 +424,7 @@ isl_union_map_free(RAW); isl_union_map_free(WAW); isl_union_map_free(WAR); - RAW = WAW = WAR = nullptr; + RAW = WAW = WAR = False = nullptr; isl_ctx_reset_error(IslCtx.get()); } @@ -435,6 +435,8 @@ RED = isl_union_map_empty(isl_union_map_get_space(RAW)); TC_RED = isl_union_map_empty(isl_union_set_get_space(TaggedStmtDomain)); isl_union_set_free(TaggedStmtDomain); + False = + isl_union_map_union(isl_union_map_copy(WAW), isl_union_map_copy(WAR)); return; } @@ -569,6 +571,7 @@ WAR = isl_union_map_coalesce(WAR); RED = isl_union_map_coalesce(RED); TC_RED = isl_union_map_coalesce(TC_RED); + False = isl_union_map_union(isl_union_map_copy(WAW), isl_union_map_copy(WAR)); DEBUG(dump()); } @@ -578,7 +581,7 @@ if (LegalityCheckDisabled) return true; - isl_union_map *Dependences = getDependences(TYPE_RAW | TYPE_WAW | TYPE_WAR); + isl_union_map *Dependences = getDependences(TYPE_RAW | TYPE_FALSE); isl_space *Space = S.getParamSpace(); isl_union_map *Schedule = isl_union_map_empty(Space); @@ -698,6 +701,8 @@ printDependencyMap(OS, RED); OS << "\tTransitive closure of reduction dependences:\n\t\t"; printDependencyMap(OS, TC_RED); + OS << "\tFalse dependences:\n\t\t"; + printDependencyMap(OS, False); } void Dependences::dump() const { print(dbgs()); } @@ -706,10 +711,11 @@ isl_union_map_free(RAW); isl_union_map_free(WAR); isl_union_map_free(WAW); + isl_union_map_free(False); isl_union_map_free(RED); isl_union_map_free(TC_RED); - RED = RAW = WAR = WAW = TC_RED = nullptr; + RED = RAW = WAR = WAW = TC_RED = False = nullptr; for (auto &ReductionDeps : ReductionDependences) isl_map_free(ReductionDeps.second); @@ -724,11 +730,9 @@ if (Kinds & TYPE_RAW) Deps = isl_union_map_union(Deps, isl_union_map_copy(RAW)); - if (Kinds & TYPE_WAR) - Deps = isl_union_map_union(Deps, isl_union_map_copy(WAR)); - - if (Kinds & TYPE_WAW) - Deps = isl_union_map_union(Deps, isl_union_map_copy(WAW)); + if (Kinds & TYPE_FALSE) { + Deps = isl_union_map_union(Deps, isl_union_map_copy(False)); + } if (Kinds & TYPE_RED) Deps = isl_union_map_union(Deps, isl_union_map_copy(RED)); Index: lib/Analysis/PolyhedralInfo.cpp =================================================================== --- lib/Analysis/PolyhedralInfo.cpp +++ lib/Analysis/PolyhedralInfo.cpp @@ -81,9 +81,8 @@ return false; DEBUG(dbgs() << "Loop :\t" << L->getHeader()->getName() << ":\n"); - isl_union_map *Deps = - D.getDependences(Dependences::TYPE_RAW | Dependences::TYPE_WAW | - Dependences::TYPE_WAR | Dependences::TYPE_RED); + isl_union_map *Deps = D.getDependences( + Dependences::TYPE_RAW | Dependences::TYPE_FALSE | Dependences::TYPE_RED); DEBUG(dbgs() << "Dependences :\t" << stringFromIslObj(Deps) << "\n"); isl_union_map *Schedule = getScheduleForLoop(S, L); Index: lib/CodeGen/IslAst.cpp =================================================================== --- lib/CodeGen/IslAst.cpp +++ lib/CodeGen/IslAst.cpp @@ -182,8 +182,8 @@ return false; isl_union_map *Schedule = isl_ast_build_get_schedule(Build); - isl_union_map *Deps = D->getDependences( - Dependences::TYPE_RAW | Dependences::TYPE_WAW | Dependences::TYPE_WAR); + isl_union_map *Deps = + D->getDependences(Dependences::TYPE_RAW | Dependences::TYPE_FALSE); if (!D->isParallel(Schedule, Deps, &NodeInfo->MinimalDependenceDistance) && !isl_union_map_free(Schedule)) Index: lib/Transform/ScheduleOptimizer.cpp =================================================================== --- lib/Transform/ScheduleOptimizer.cpp +++ lib/Transform/ScheduleOptimizer.cpp @@ -781,13 +781,9 @@ /// and false, otherwise. static bool containsOnlyMatMulDep(__isl_keep isl_map *Schedule, const Dependences *D, int &Pos) { - auto *WAR = D->getDependences(Dependences::TYPE_WAR); - if (!isl_union_map_is_empty(WAR)) { - isl_union_map_free(WAR); - return false; - } - isl_union_map_free(WAR); - auto *Dep = D->getDependences(Dependences::TYPE_RAW); + + auto *Dep = + D->getDependences(Dependences::TYPE_RAW | Dependences::TYPE_FALSE); auto *Red = D->getDependences(Dependences::TYPE_RED); if (Red) Dep = isl_union_map_union(Dep, Red); @@ -1421,20 +1417,17 @@ LastSchedule = nullptr; // Build input data. - int ValidityKinds = - Dependences::TYPE_RAW | Dependences::TYPE_WAR | Dependences::TYPE_WAW; + int ValidityKinds = Dependences::TYPE_RAW | Dependences::TYPE_FALSE; int ProximityKinds; if (OptimizeDeps == "all") - ProximityKinds = - Dependences::TYPE_RAW | Dependences::TYPE_WAR | Dependences::TYPE_WAW; + ProximityKinds = Dependences::TYPE_RAW | Dependences::TYPE_FALSE; else if (OptimizeDeps == "raw") ProximityKinds = Dependences::TYPE_RAW; else { errs() << "Do not know how to optimize for '" << OptimizeDeps << "'" << " Falling back to optimizing all dependences.\n"; - ProximityKinds = - Dependences::TYPE_RAW | Dependences::TYPE_WAR | Dependences::TYPE_WAW; + ProximityKinds = Dependences::TYPE_RAW | Dependences::TYPE_FALSE; } isl_union_set *Domain = S.getDomains();