[llvm-commits] [PATCH 02/20] [AVX] Remove Mutating Members from Inits

David Greene dag at cray.com
Tue Jul 19 13:11:37 PDT 2011


Delete all member functions that modify Init state.  This is in
preparation for making Inits const everywhere and finally, converting
them to FoldingSetNodes.
---
 utils/TableGen/CodeEmitterGen.cpp |   12 +++--
 utils/TableGen/Record.cpp         |   98 ++++++++++++++++++------------------
 utils/TableGen/Record.h           |   12 +----
 utils/TableGen/TGParser.cpp       |   19 ++++---
 4 files changed, 69 insertions(+), 72 deletions(-)

diff --git oldutils/TableGen/CodeEmitterGen.cpp newutils/TableGen/CodeEmitterGen.cpp
index d828dfc..8b5cdda 100644
--- oldutils/TableGen/CodeEmitterGen.cpp
+++ newutils/TableGen/CodeEmitterGen.cpp
@@ -41,19 +41,23 @@ void CodeEmitterGen::reverseBits(std::vector<Record*> &Insts) {
     BitsInit *BI = R->getValueAsBitsInit("Inst");
 
     unsigned numBits = BI->getNumBits();
-    BitsInit *NewBI = new BitsInit(numBits);
+ 
+    SmallVector<Init *, 16> NewBits(numBits);
+ 
     for (unsigned bit = 0, end = numBits / 2; bit != end; ++bit) {
       unsigned bitSwapIdx = numBits - bit - 1;
       Init *OrigBit = BI->getBit(bit);
       Init *BitSwap = BI->getBit(bitSwapIdx);
-      NewBI->setBit(bit, BitSwap);
-      NewBI->setBit(bitSwapIdx, OrigBit);
+      NewBits[bit]        = BitSwap;
+      NewBits[bitSwapIdx] = OrigBit;
     }
     if (numBits % 2) {
       unsigned middle = (numBits + 1) / 2;
-      NewBI->setBit(middle, BI->getBit(middle));
+      NewBits[middle] = BI->getBit(middle);
     }
 
+    BitsInit *NewBI = new BitsInit(ArrayRef<Init *>(NewBits));
+
     // Update the bits in reversed order so that emitInstrOpBits will get the
     // correct endianness.
     R->getValue("Inst")->setValue(NewBI);
diff --git oldutils/TableGen/Record.cpp newutils/TableGen/Record.cpp
index 3aaaa87..1a7f7e1 100644
--- oldutils/TableGen/Record.cpp
+++ newutils/TableGen/Record.cpp
@@ -15,6 +15,8 @@
 #include "Error.h"
 #include "llvm/Support/DataTypes.h"
 #include "llvm/Support/Format.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringExtras.h"
 
 using namespace llvm;
@@ -74,18 +76,17 @@ std::string BitsRecTy::getAsString() const {
 }
 
 Init *BitsRecTy::convertValue(UnsetInit *UI) {
-  BitsInit *Ret = new BitsInit(Size);
+  SmallVector<Init *, 16> NewBits(Size);
 
   for (unsigned i = 0; i != Size; ++i)
-    Ret->setBit(i, new UnsetInit());
-  return Ret;
+    NewBits[i] = new UnsetInit();
+
+  return new BitsInit(ArrayRef<Init *>(NewBits));
 }
 
 Init *BitsRecTy::convertValue(BitInit *UI) {
   if (Size != 1) return 0;  // Can only convert single bit.
-  BitsInit *Ret = new BitsInit(1);
-  Ret->setBit(0, UI);
-  return Ret;
+  return new BitsInit(ArrayRef<Init *>(UI));
 }
 
 /// canFitInBitfield - Return true if the number of bits is large enough to hold
@@ -105,11 +106,12 @@ Init *BitsRecTy::convertValue(IntInit *II) {
   if (!canFitInBitfield(Value, Size))
     return 0;
 
-  BitsInit *Ret = new BitsInit(Size);
+  SmallVector<Init *, 16> NewBits(Size);
+
   for (unsigned i = 0; i != Size; ++i)
-    Ret->setBit(i, new BitInit(Value & (1LL << i)));
+    NewBits[i] = new BitInit(Value & (1LL << i));
 
-  return Ret;
+  return new BitsInit(ArrayRef<Init *>(NewBits));
 }
 
 Init *BitsRecTy::convertValue(BitsInit *BI) {
@@ -122,16 +124,16 @@ Init *BitsRecTy::convertValue(BitsInit *BI) {
 Init *BitsRecTy::convertValue(TypedInit *VI) {
   if (BitsRecTy *BRT = dynamic_cast<BitsRecTy*>(VI->getType()))
     if (BRT->Size == Size) {
-      BitsInit *Ret = new BitsInit(Size);
+      SmallVector<Init *, 16> NewBits(Size);
+ 
       for (unsigned i = 0; i != Size; ++i)
-        Ret->setBit(i, new VarBitInit(VI, i));
-      return Ret;
+        NewBits[i] = new VarBitInit(VI, i);
+      return new BitsInit(ArrayRef<Init *>(NewBits));
     }
 
   if (Size == 1 && dynamic_cast<BitRecTy*>(VI->getType())) {
-    BitsInit *Ret = new BitsInit(1);
-    Ret->setBit(0, VI);
-    return Ret;
+    Init *NewBits[1] = { VI };
+    return new BitsInit(ArrayRef<Init *>(NewBits));
   }
 
   if (TernOpInit *Tern = dynamic_cast<TernOpInit*>(VI)) {
@@ -148,30 +150,31 @@ Init *BitsRecTy::convertValue(TypedInit *VI) {
         int64_t RHSVal = RHSi->getValue();
 
         if (canFitInBitfield(MHSVal, Size) && canFitInBitfield(RHSVal, Size)) {
-          BitsInit *Ret = new BitsInit(Size);
+          SmallVector<Init *, 16> NewBits(Size);
 
           for (unsigned i = 0; i != Size; ++i)
-            Ret->setBit(i, new TernOpInit(TernOpInit::IF, LHS,
-                                          new IntInit((MHSVal & (1LL << i)) ? 1 : 0),
-                                          new IntInit((RHSVal & (1LL << i)) ? 1 : 0),
-                                          VI->getType()));
+            NewBits[i] =
+              new TernOpInit(TernOpInit::IF, LHS,
+                             new IntInit((MHSVal & (1LL << i)) ? 1 : 0),
+                             new IntInit((RHSVal & (1LL << i)) ? 1 : 0),
+                             VI->getType());
 
-          return Ret;
+          return new BitsInit(ArrayRef<Init *>(NewBits));
         }
       } else {
         BitsInit *MHSbs = dynamic_cast<BitsInit*>(MHS);
         BitsInit *RHSbs = dynamic_cast<BitsInit*>(RHS);
 
         if (MHSbs && RHSbs) {
-          BitsInit *Ret = new BitsInit(Size);
+          SmallVector<Init *, 16> NewBits(Size);
 
           for (unsigned i = 0; i != Size; ++i)
-            Ret->setBit(i, new TernOpInit(TernOpInit::IF, LHS,
-                                          MHSbs->getBit(i),
-                                          RHSbs->getBit(i),
-                                          VI->getType()));
+            NewBits[i] = new TernOpInit(TernOpInit::IF, LHS,
+                                        MHSbs->getBit(i),
+                                        RHSbs->getBit(i),
+                                        VI->getType());
 
-          return Ret;
+          return new BitsInit(ArrayRef<Init *>(NewBits));
         }
       }
     }
@@ -396,15 +399,14 @@ RecTy *llvm::resolveTypes(RecTy *T1, RecTy *T2) {
 void Init::dump() const { return print(errs()); }
 
 Init *BitsInit::convertInitializerBitRange(const std::vector<unsigned> &Bits) {
-  BitsInit *BI = new BitsInit(Bits.size());
+  SmallVector<Init *, 16> NewBits(Bits.size());
+
   for (unsigned i = 0, e = Bits.size(); i != e; ++i) {
-    if (Bits[i] >= getNumBits()) {
-      delete BI;
+    if (Bits[i] >= getNumBits())
       return 0;
-    }
-    BI->setBit(i, getBit(Bits[i]));
+    NewBits[i] = getBit(Bits[i]);
   }
-  return BI;
+  return new BitsInit(ArrayRef<Init *>(NewBits));
 }
 
 std::string BitsInit::getAsString() const {
@@ -424,7 +426,7 @@ std::string BitsInit::getAsString() const {
 //
 Init *BitsInit::resolveReferences(Record &R, const RecordVal *RV) {
   bool Changed = false;
-  BitsInit *New = new BitsInit(getNumBits());
+  SmallVector<Init *, 16> NewBits(getNumBits());
 
   for (unsigned i = 0, e = Bits.size(); i != e; ++i) {
     Init *B;
@@ -435,12 +437,12 @@ Init *BitsInit::resolveReferences(Record &R, const RecordVal *RV) {
       CurBit = CurBit->resolveReferences(R, RV);
       Changed |= B != CurBit;
     } while (B != CurBit);
-    New->setBit(i, CurBit);
+    NewBits[i] = CurBit;
   }
 
   if (Changed)
-    return New;
-  delete New;
+    return new BitsInit(ArrayRef<Init *>(NewBits));
+
   return this;
 }
 
@@ -449,16 +451,15 @@ std::string IntInit::getAsString() const {
 }
 
 Init *IntInit::convertInitializerBitRange(const std::vector<unsigned> &Bits) {
-  BitsInit *BI = new BitsInit(Bits.size());
+  SmallVector<Init *, 16> NewBits(Bits.size());
 
   for (unsigned i = 0, e = Bits.size(); i != e; ++i) {
-    if (Bits[i] >= 64) {
-      delete BI;
+    if (Bits[i] >= 64)
       return 0;
-    }
-    BI->setBit(i, new BitInit(Value & (INT64_C(1) << Bits[i])));
+
+    NewBits[i] = new BitInit(Value & (INT64_C(1) << Bits[i]));
   }
-  return BI;
+  return new BitsInit(ArrayRef<Init *>(NewBits));
 }
 
 Init *ListInit::convertInitListSlice(const std::vector<unsigned> &Elements) {
@@ -1039,15 +1040,14 @@ Init *TypedInit::convertInitializerBitRange(const std::vector<unsigned> &Bits) {
   if (T == 0) return 0;  // Cannot subscript a non-bits variable.
   unsigned NumBits = T->getNumBits();
 
-  BitsInit *BI = new BitsInit(Bits.size());
+  SmallVector<Init *, 16> NewBits(Bits.size());
   for (unsigned i = 0, e = Bits.size(); i != e; ++i) {
-    if (Bits[i] >= NumBits) {
-      delete BI;
+    if (Bits[i] >= NumBits)
       return 0;
-    }
-    BI->setBit(i, new VarBitInit(this, Bits[i]));
+
+    NewBits[i] = new VarBitInit(this, Bits[i]);
   }
-  return BI;
+  return new BitsInit(ArrayRef<Init *>(NewBits));
 }
 
 Init *TypedInit::convertInitListSlice(const std::vector<unsigned> &Elements) {
diff --git oldutils/TableGen/Record.h newutils/TableGen/Record.h
index f4d0917..f300484 100644
--- oldutils/TableGen/Record.h
+++ newutils/TableGen/Record.h
@@ -15,6 +15,7 @@
 #ifndef RECORD_H
 #define RECORD_H
 
+#include "llvm/ADT/ArrayRef.h"
 #include "llvm/Support/SourceMgr.h"
 #include "llvm/Support/DataTypes.h"
 #include "llvm/Support/raw_ostream.h"
@@ -624,6 +625,7 @@ class BitsInit : public Init {
   std::vector<Init*> Bits;
 public:
   explicit BitsInit(unsigned Size) : Bits(Size) {}
+  BitsInit(ArrayRef<Init *> Range) : Bits(Range.begin(), Range.end()) {}
 
   unsigned getNumBits() const { return Bits.size(); }
 
@@ -631,11 +633,6 @@ public:
     assert(Bit < Bits.size() && "Bit index out of range!");
     return Bits[Bit];
   }
-  void setBit(unsigned Bit, Init *V) {
-    assert(Bit < Bits.size() && "Bit index out of range!");
-    assert(Bits[Bit] == 0 && "Bit already set!");
-    Bits[Bit] = V;
-  }
 
   virtual Init *convertInitializerTo(RecTy *Ty) {
     return Ty->convertValue(this);
@@ -1174,11 +1171,6 @@ public:
     return ArgNames[Num];
   }
 
-  void setArg(unsigned Num, Init *I) {
-    assert(Num < Args.size() && "Arg number out of range!");
-    Args[Num] = I;
-  }
-
   virtual Init *resolveReferences(Record &R, const RecordVal *RV);
 
   virtual std::string getAsString() const;
diff --git oldutils/TableGen/TGParser.cpp newutils/TableGen/TGParser.cpp
index 1b916b4..d8f5d63 100644
--- oldutils/TableGen/TGParser.cpp
+++ newutils/TableGen/TGParser.cpp
@@ -116,22 +116,22 @@ bool TGParser::SetValue(Record *CurRec, SMLoc Loc, const std::string &ValName,
     BitsInit *BInit = dynamic_cast<BitsInit*>(BI);
     assert(BInit != 0);
 
-    BitsInit *NewVal = new BitsInit(CurVal->getNumBits());
+    SmallVector<Init *, 16> NewBits(CurVal->getNumBits());
 
     // Loop over bits, assigning values as appropriate.
     for (unsigned i = 0, e = BitList.size(); i != e; ++i) {
       unsigned Bit = BitList[i];
-      if (NewVal->getBit(Bit))
+      if (NewBits[Bit])
         return Error(Loc, "Cannot set bit #" + utostr(Bit) + " of value '" +
                      ValName + "' more than once");
-      NewVal->setBit(Bit, BInit->getBit(i));
+      NewBits[Bit] = BInit->getBit(i);
     }
 
     for (unsigned i = 0, e = CurVal->getNumBits(); i != e; ++i)
-      if (NewVal->getBit(i) == 0)
-        NewVal->setBit(i, CurVal->getBit(i));
+      if (NewBits[i] == 0)
+        NewBits[i] = CurVal->getBit(i);
 
-    V = NewVal;
+    V = new BitsInit(ArrayRef<Init *>(NewBits));
   }
 
   if (RV->setValue(V))
@@ -1127,7 +1127,8 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType) {
     }
     Lex.Lex();  // eat the '}'
 
-    BitsInit *Result = new BitsInit(Vals.size());
+    SmallVector<Init *, 16> NewBits(Vals.size());
+
     for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
       Init *Bit = Vals[i]->convertInitializerTo(BitRecTy::get());
       if (Bit == 0) {
@@ -1135,9 +1136,9 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType) {
               ") is not convertable to a bit");
         return 0;
       }
-      Result->setBit(Vals.size()-i-1, Bit);
+      NewBits[Vals.size()-i-1] = Bit;
     }
-    return Result;
+    return new BitsInit(ArrayRef<Init *>(NewBits));
   }
   case tgtok::l_square: {          // Value ::= '[' ValueList ']'
     Lex.Lex(); // eat the '['
-- 
1.7.6




More information about the llvm-commits mailing list