[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
Thu Feb 17 13:01:29 PST 2022


dtemirbulatov updated this revision to Diff 409759.
dtemirbulatov marked an inline comment as done.
dtemirbulatov added a comment.

Addressed remark.


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
@@ -2637,6 +2637,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) {
@@ -2877,6 +2878,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.
@@ -5804,10 +5809,11 @@
       }
 
       // Debug information does not impact spill cost.
-      if ((isa<CallInst>(&*PrevInstIt) &&
-           !isa<DbgInfoIntrinsic>(&*PrevInstIt)) &&
-          &*PrevInstIt != PrevInst)
-        NumCalls++;
+      if (isa<CallInst>(&*PrevInstIt)) {
+        auto *II = dyn_cast<IntrinsicInst>(&*PrevInstIt);
+        if (!II || !II->isAssumeLikeIntrinsic())
+          NumCalls++;
+      }
 
       ++PrevInstIt;
     }
@@ -5968,7 +5974,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;
@@ -7748,6 +7760,11 @@
       }
       CurrentLoadStore = SD;
     }
+    if (isa<CallInst>(I)) {
+      auto *II = dyn_cast<IntrinsicInst>(I);
+      if (!II || !II->isAssumeLikeIntrinsic())
+        NoCalls = false;
+    }
   }
   if (NextLoadStore) {
     if (CurrentLoadStore)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D110623.409759.patch
Type: text/x-patch
Size: 2167 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220217/4af75a6c/attachment-0001.bin>


More information about the llvm-commits mailing list