[polly] r262033 - ScopDetect/Info: Add option to disable invariant load hoisting

Tobias Grosser via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 26 08:43:35 PST 2016


Author: grosser
Date: Fri Feb 26 10:43:35 2016
New Revision: 262033

URL: http://llvm.org/viewvc/llvm-project?rev=262033&view=rev
Log:
ScopDetect/Info: Add option to disable invariant load hoisting

This is helpful for test case reduction and other experiments.

Modified:
    polly/trunk/include/polly/ScopDetection.h
    polly/trunk/lib/Analysis/ScopDetection.cpp
    polly/trunk/lib/Analysis/ScopInfo.cpp

Modified: polly/trunk/include/polly/ScopDetection.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopDetection.h?rev=262033&r1=262032&r2=262033&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopDetection.h (original)
+++ polly/trunk/include/polly/ScopDetection.h Fri Feb 26 10:43:35 2016
@@ -110,6 +110,7 @@ extern bool PollyTrackFailures;
 extern bool PollyDelinearize;
 extern bool PollyUseRuntimeAliasChecks;
 extern bool PollyProcessUnprofitable;
+extern bool PollyInvariantLoadHoisting;
 
 /// @brief A function attribute which will cause Polly to skip the function
 extern llvm::StringRef PollySkipFnAttr;

Modified: polly/trunk/lib/Analysis/ScopDetection.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=262033&r1=262032&r2=262033&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
+++ polly/trunk/lib/Analysis/ScopDetection.cpp Fri Feb 26 10:43:35 2016
@@ -171,6 +171,12 @@ static cl::opt<bool>
                 cl::Hidden, cl::init(false), cl::ZeroOrMore,
                 cl::cat(PollyCategory));
 
+bool polly::PollyInvariantLoadHoisting;
+static cl::opt<bool, true> XPollyInvariantLoadHoisting(
+    "polly-invariant-load-hoisting", cl::desc("Hoist invariant loads."),
+    cl::location(PollyInvariantLoadHoisting), cl::Hidden, cl::ZeroOrMore,
+    cl::init(true), cl::cat(PollyCategory));
+
 /// @brief The minimal trip count under which loops are considered unprofitable.
 static const unsigned MIN_LOOP_TRIP_COUNT = 8;
 
@@ -304,6 +310,9 @@ bool ScopDetection::onlyValidRequiredInv
     InvariantLoadsSetTy &RequiredILS, DetectionContext &Context) const {
   Region &CurRegion = Context.CurRegion;
 
+  if (!PollyInvariantLoadHoisting && !RequiredILS.empty())
+    return false;
+
   for (LoadInst *Load : RequiredILS)
     if (!isHoistableLoad(Load, CurRegion, *LI, *SE))
       return false;

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=262033&r1=262032&r2=262033&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Fri Feb 26 10:43:35 2016
@@ -3116,27 +3116,28 @@ void Scop::verifyInvariantLoads(ScopDete
 }
 
 void Scop::hoistInvariantLoads(ScopDetection &SD) {
-  isl_union_map *Writes = getWrites();
-  for (ScopStmt &Stmt : *this) {
-
-    MemoryAccessList InvariantAccesses;
-
-    for (MemoryAccess *Access : Stmt)
-      if (isHoistableAccess(Access, Writes))
-        InvariantAccesses.push_front(Access);
-
-    // We inserted invariant accesses always in the front but need them to be
-    // sorted in a "natural order". The statements are already sorted in reverse
-    // post order and that suffices for the accesses too. The reason we require
-    // an order in the first place is the dependences between invariant loads
-    // that can be caused by indirect loads.
-    InvariantAccesses.reverse();
-
-    // Transfer the memory access from the statement to the SCoP.
-    Stmt.removeMemoryAccesses(InvariantAccesses);
-    addInvariantLoads(Stmt, InvariantAccesses);
+  if (PollyInvariantLoadHoisting) {
+    isl_union_map *Writes = getWrites();
+    for (ScopStmt &Stmt : *this) {
+      MemoryAccessList InvariantAccesses;
+
+      for (MemoryAccess *Access : Stmt)
+        if (isHoistableAccess(Access, Writes))
+          InvariantAccesses.push_front(Access);
+
+      // We inserted invariant accesses always in the front but need them to be
+      // sorted in a "natural order". The statements are already sorted in
+      // reverse post order and that suffices for the accesses too. The reason
+      // we require an order in the first place is the dependences between
+      // invariant loads that can be caused by indirect loads.
+      InvariantAccesses.reverse();
+
+      // Transfer the memory access from the statement to the SCoP.
+      Stmt.removeMemoryAccesses(InvariantAccesses);
+      addInvariantLoads(Stmt, InvariantAccesses);
+    }
+    isl_union_map_free(Writes);
   }
-  isl_union_map_free(Writes);
 
   verifyInvariantLoads(SD);
 }




More information about the llvm-commits mailing list