[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