[PATCH] D110623: [SLP] Avoid calculating expensive spill cost when it is not required

Dinar Temirbulatov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 10 23:11:20 PST 2021


dtemirbulatov updated this revision to Diff 393666.
dtemirbulatov added a comment.

Addressed remarks.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110623/new/

https://reviews.llvm.org/D110623

Files:
  llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp


Index: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -2312,6 +2312,7 @@
       // Make a new scheduling region, i.e. all existing ScheduleData is not
       // in the new region yet.
       ++SchedulingRegionID;
+      NoCalls = true;
     }
 
     ScheduleData *getScheduleData(Value *V) {
@@ -2529,6 +2530,10 @@
     // Make sure that the initial SchedulingRegionID is greater than the
     // initial SchedulingRegionID in ScheduleData (which is 0).
     int SchedulingRegionID = 1;
+
+    /// Indicates that no CallInst found in the tree and we don't need to
+    /// calculate spill cost.
+    bool NoCalls = true;
   };
 
   /// Attaches the BlockScheduling structures to basic blocks.
@@ -5528,7 +5533,13 @@
     }
   }
 
-  InstructionCost SpillCost = getSpillCost();
+  bool NoCallInst = all_of(BlocksSchedules,
+                           [](const decltype(BlocksSchedules)::value_type &BS) {
+                             return BS.second->NoCalls;
+                           });
+
+  InstructionCost SpillCost = NoCallInst ? 0 : getSpillCost();
+  assert((!NoCallInst || getSpillCost() == 0) && "Incorrect spill cost");
   Cost += SpillCost + ExtractCost;
   if (FirstUsers.size() == 1) {
     int Limit = ShuffleMask.front().size() * 2;
@@ -7264,6 +7275,10 @@
       }
       CurrentLoadStore = SD;
     }
+    CallInst *CI = dyn_cast<CallInst>(I);
+    if (CI && (!isa<DbgInfoIntrinsic>(I) || !isa<AssumeInst>(I) ||
+               !CI->isLifetimeStartOrEnd()))
+      NoCalls = false;
   }
   if (NextLoadStore) {
     if (CurrentLoadStore)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D110623.393666.patch
Type: text/x-patch
Size: 1734 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211211/c154da8d/attachment-0001.bin>


More information about the llvm-commits mailing list