[llvm-commits] CVS: llvm/include/llvm/CodeGen/MachineInstr.h

Chris Lattner lattner at cs.uiuc.edu
Tue Oct 22 18:17:01 PDT 2002


Changes in directory llvm/include/llvm/CodeGen:

MachineInstr.h updated: 1.67 -> 1.68

---
Log message:

  - Two minor improvements to the MachineInstr class to reduce footprint and
    overhead: Merge 3 parallel vectors into 1, change regsUsed hash_set to be a
    bitvector.  Sped up LLC a little less than 10% in a debug build!



---
Diffs of the changes:

Index: llvm/include/llvm/CodeGen/MachineInstr.h
diff -u llvm/include/llvm/CodeGen/MachineInstr.h:1.67 llvm/include/llvm/CodeGen/MachineInstr.h:1.68
--- llvm/include/llvm/CodeGen/MachineInstr.h:1.67	Mon Oct 21 19:15:13 2002
+++ llvm/include/llvm/CodeGen/MachineInstr.h	Tue Oct 22 18:16:14 2002
@@ -12,7 +12,6 @@
 #include "llvm/Target/MachineInstrInfo.h"
 #include "llvm/Annotation.h"
 #include <Support/iterator>
-#include <Support/hash_set>
 class Instruction;
 
 //---------------------------------------------------------------------------
@@ -267,17 +266,26 @@
 //      a CALL (if any), and return value of a RETURN.
 //---------------------------------------------------------------------------
 
-class MachineInstr :  public Annotable,         // MachineInstrs are annotable
-                      public NonCopyable {      // Disable copy operations
+class MachineInstr : public Annotable,         // MachineInstrs are annotable
+                     public NonCopyable {      // Disable copy operations
   MachineOpCode    opCode;              // the opcode
   OpCodeMask       opCodeMask;          // extra bits for variants of an opcode
   std::vector<MachineOperand> operands; // the operands
-  std::vector<Value*>   implicitRefs;   // values implicitly referenced by this
-  std::vector<bool>     implicitIsDef;  //  machine instruction (eg, call args)
-  std::vector<bool>     implicitIsDefAndUse;
-  hash_set<int>    regsUsed;            // all machine registers used for this
-                                        //  instruction, including regs used
-                                        //  to save values across the instr.
+
+  struct ImplicitRef {
+    Value *Val;
+    bool isDef, isDefAndUse;
+
+    ImplicitRef(Value *V, bool D, bool DU) : Val(V), isDef(D), isDefAndUse(DU){}
+  };
+
+  // implicitRefs - Values implicitly referenced by this machine instruction
+  // (eg, call args)
+  std::vector<ImplicitRef> implicitRefs;
+
+  // regsUsed - all machine registers used for this instruction, including regs
+  // used to save values across the instruction.  This is a bitset of registers.
+  std::vector<bool> regsUsed;
 public:
   /*ctor*/		MachineInstr	(MachineOpCode _opCode,
 					 OpCodeMask    _opCodeMask = 0x0);
@@ -313,7 +321,7 @@
   //
   // Information about implicit operands of the instruction
   // 
-  unsigned             	getNumImplicitRefs() const{return implicitRefs.size();}
+  unsigned             	getNumImplicitRefs() const{ return implicitRefs.size();}
   
   bool			implicitRefIsDefined(unsigned i) const;
   bool			implicitRefIsDefinedAndUsed(unsigned i) const;
@@ -324,9 +332,15 @@
   //
   // Information about registers used in this instruction
   // 
-  const hash_set<int>&  getRegsUsed    () const { return regsUsed; }
-        hash_set<int>&  getRegsUsed    ()       { return regsUsed; }
+  const std::vector<bool> &getRegsUsed    () const { return regsUsed; }
   
+  // insertUsedReg - Add a register to the Used registers set...
+  void insertUsedReg(unsigned Reg) {
+    if (Reg >= regsUsed.size())
+      regsUsed.resize(Reg+1);
+    regsUsed[Reg] = true;
+  }
+
   //
   // Debugging support
   // 
@@ -477,41 +491,38 @@
 }
 
 inline bool
-MachineInstr::implicitRefIsDefined(unsigned int i) const
+MachineInstr::implicitRefIsDefined(unsigned i) const
 {
-  assert(i < implicitIsDef.size() && "operand out of range!");
-  return implicitIsDef[i];
+  assert(i < implicitRefs.size() && "operand out of range!");
+  return implicitRefs[i].isDef;
 }
 
 inline bool
-MachineInstr::implicitRefIsDefinedAndUsed(unsigned int i) const
+MachineInstr::implicitRefIsDefinedAndUsed(unsigned i) const
 {
-  assert(i < implicitIsDefAndUse.size() && "operand out of range!");
-  return implicitIsDefAndUse[i];
+  assert(i < implicitRefs.size() && "operand out of range!");
+  return implicitRefs[i].isDefAndUse;
 }
 
 inline const Value*
-MachineInstr::getImplicitRef(unsigned int i) const
+MachineInstr::getImplicitRef(unsigned i) const
 {
   assert(i < implicitRefs.size() && "getImplicitRef() out of range!");
-  return implicitRefs[i];
+  return implicitRefs[i].Val;
 }
 
 inline Value*
-MachineInstr::getImplicitRef(unsigned int i)
+MachineInstr::getImplicitRef(unsigned i)
 {
   assert(i < implicitRefs.size() && "getImplicitRef() out of range!");
-  return implicitRefs[i];
+  return implicitRefs[i].Val;
 }
 
 inline void
 MachineInstr::addImplicitRef(Value* val, 
                              bool isDef,
-                             bool isDefAndUse)
-{
-  implicitRefs.push_back(val);
-  implicitIsDef.push_back(isDef);
-  implicitIsDefAndUse.push_back(isDefAndUse);
+                             bool isDefAndUse) {
+  implicitRefs.push_back(ImplicitRef(val, isDef, isDefAndUse));
 }
 
 inline void
@@ -521,9 +532,9 @@
                              bool isDefAndUse)
 {
   assert(i < implicitRefs.size() && "setImplicitRef() out of range!");
-  implicitRefs[i] = val;
-  implicitIsDef[i] = isDef;
-  implicitIsDefAndUse[i] = isDefAndUse;
+  implicitRefs[i].Val = val;
+  implicitRefs[i].isDef = isDef;
+  implicitRefs[i].isDefAndUse = isDefAndUse;
 }
 
 inline void





More information about the llvm-commits mailing list