[PATCH] D98176: Introduce a generic operator to apply complex operations to BitVector

serge via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 8 06:11:42 PST 2021


serge-sans-paille created this revision.
serge-sans-paille added reviewers: zturner, RKSimon.
Herald added subscribers: dexonsmith, hiraditya.
serge-sans-paille requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

This avoids temporary and memcpy call when computing large expressions.

It's basically some kind of poor man's expression template, but it seems easier
to maintain to have a single generic `apply` call instead of the whole
expression template machinery here.


https://reviews.llvm.org/D98176

Files:
  llvm/include/llvm/ADT/BitVector.h
  llvm/lib/CodeGen/CFIInstrInserter.cpp


Index: llvm/lib/CodeGen/CFIInstrInserter.cpp
===================================================================
--- llvm/lib/CodeGen/CFIInstrInserter.cpp
+++ llvm/lib/CodeGen/CFIInstrInserter.cpp
@@ -265,9 +265,9 @@
   MBBInfo.OutgoingCFARegister = SetRegister;
 
   // Update outgoing CSR info.
-  MBBInfo.OutgoingCSRSaved = MBBInfo.IncomingCSRSaved;
-  MBBInfo.OutgoingCSRSaved |= CSRSaved;
-  MBBInfo.OutgoingCSRSaved.reset(CSRRestored);
+  BitVector::apply([](auto x, auto y, auto z) { return (x | y) & ~z;},
+                   MBBInfo.OutgoingCSRSaved,
+                   MBBInfo.IncomingCSRSaved, CSRSaved, CSRRestored);
 }
 
 void CFIInstrInserter::updateSuccCFAInfo(MBBCFAInfo &MBBInfo) {
@@ -295,6 +295,7 @@
   const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
   bool InsertedCFIInstr = false;
 
+  BitVector SetDifference;
   for (MachineBasicBlock &MBB : MF) {
     // Skip the first MBB in a function
     if (MBB.getNumber() == MF.front().getNumber()) continue;
@@ -346,8 +347,7 @@
       continue;
     }
 
-    BitVector SetDifference = PrevMBBInfo->OutgoingCSRSaved;
-    SetDifference.reset(MBBInfo.IncomingCSRSaved);
+    BitVector::apply([](auto x, auto y) { return x & ~y;}, SetDifference, PrevMBBInfo->OutgoingCSRSaved, MBBInfo.IncomingCSRSaved);
     for (int Reg : SetDifference.set_bits()) {
       unsigned CFIIndex =
           MF.addFrameInst(MCCFIInstruction::createRestore(nullptr, Reg));
@@ -356,8 +356,7 @@
       InsertedCFIInstr = true;
     }
 
-    SetDifference = MBBInfo.IncomingCSRSaved;
-    SetDifference.reset(PrevMBBInfo->OutgoingCSRSaved);
+    BitVector::apply([](auto x, auto y) { return x & ~y;}, SetDifference, MBBInfo.IncomingCSRSaved, PrevMBBInfo->OutgoingCSRSaved);
     for (int Reg : SetDifference.set_bits()) {
       auto it = CSRLocMap.find(Reg);
       assert(it != CSRLocMap.end() && "Reg should have an entry in CSRLocMap");
Index: llvm/include/llvm/ADT/BitVector.h
===================================================================
--- llvm/include/llvm/ADT/BitVector.h
+++ llvm/include/llvm/ADT/BitVector.h
@@ -568,6 +568,18 @@
     return false;
   }
 
+  template<class F, class... ArgTys>
+  static BitVector& apply(F&& f, BitVector& Out, ArgTys const&... Args) {
+    static_assert(sizeof...(ArgTys) > 0, "at least one argument");
+    std::initializer_list<size_t> Sizes = { Args.size()...};
+    size_t CommonSize = *std::min_element(Sizes.begin(), Sizes.end());
+    if (Out.size() < CommonSize)
+      Out.resize(CommonSize);
+    for (size_t i = 0, e = Out.NumBitWords(CommonSize); i != e; ++i)
+      Out.Bits[i] = f(Args.Bits[i]...);
+    return Out;
+  }
+
   BitVector &operator|=(const BitVector &RHS) {
     if (size() < RHS.size())
       resize(RHS.size());


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98176.328992.patch
Type: text/x-patch
Size: 2753 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210308/6e3aab05/attachment.bin>


More information about the llvm-commits mailing list