[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 24 14:41:38 PST 2021


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

Rebased, fixed 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
@@ -2487,6 +2487,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) {
@@ -2704,6 +2705,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.
@@ -5542,8 +5547,9 @@
       }
 
       // Debug information does not impact spill cost.
-      if ((isa<CallInst>(&*PrevInstIt) &&
-           !isa<DbgInfoIntrinsic>(&*PrevInstIt)) &&
+      auto *CI = dyn_cast<CallInst>(&*PrevInstIt);
+      if ((CI && (!isa<DbgInfoIntrinsic>(CI) || !isa<AssumeInst>(CI) ||
+                  !CI->isLifetimeStartOrEnd())) &&
           &*PrevInstIt != PrevInst)
         NumCalls++;
 
@@ -5709,7 +5715,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;
@@ -7445,6 +7457,10 @@
       }
       CurrentLoadStore = SD;
     }
+    auto *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.396183.patch
Type: text/x-patch
Size: 2152 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211224/eaa034b6/attachment.bin>


More information about the llvm-commits mailing list