forked from OSchip/llvm-project
Limit the number of memory operands in MachineInstr to 2^16 and store the number in padding.
Saves one machine word on MachineInstr (88->80 bytes on x86_64, 48->44 on i386). llvm-svn: 152930
This commit is contained in:
parent
fa391a7df2
commit
d03878bdf2
|
@ -74,9 +74,10 @@ private:
|
|||
// anything other than to convey comment
|
||||
// information to AsmPrinter.
|
||||
|
||||
uint16_t NumMemRefs; // information on memory references
|
||||
mmo_iterator MemRefs;
|
||||
|
||||
std::vector<MachineOperand> Operands; // the operands
|
||||
mmo_iterator MemRefs; // information on memory references
|
||||
mmo_iterator MemRefsEnd;
|
||||
MachineBasicBlock *Parent; // Pointer to the owning basic block.
|
||||
DebugLoc debugLoc; // Source line information.
|
||||
|
||||
|
@ -284,13 +285,13 @@ public:
|
|||
|
||||
/// Access to memory operands of the instruction
|
||||
mmo_iterator memoperands_begin() const { return MemRefs; }
|
||||
mmo_iterator memoperands_end() const { return MemRefsEnd; }
|
||||
bool memoperands_empty() const { return MemRefsEnd == MemRefs; }
|
||||
mmo_iterator memoperands_end() const { return MemRefs + NumMemRefs; }
|
||||
bool memoperands_empty() const { return NumMemRefs == 0; }
|
||||
|
||||
/// hasOneMemOperand - Return true if this instruction has exactly one
|
||||
/// MachineMemOperand.
|
||||
bool hasOneMemOperand() const {
|
||||
return MemRefsEnd - MemRefs == 1;
|
||||
return NumMemRefs == 1;
|
||||
}
|
||||
|
||||
/// API for querying MachineInstr properties. They are the same as MCInstrDesc
|
||||
|
@ -888,7 +889,7 @@ public:
|
|||
/// list. This does not transfer ownership.
|
||||
void setMemRefs(mmo_iterator NewMemRefs, mmo_iterator NewMemRefsEnd) {
|
||||
MemRefs = NewMemRefs;
|
||||
MemRefsEnd = NewMemRefsEnd;
|
||||
NumMemRefs = NewMemRefsEnd - NewMemRefs;
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
|
@ -482,7 +482,7 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, const MachineMemOperand &MMO) {
|
|||
/// MCID NULL and no operands.
|
||||
MachineInstr::MachineInstr()
|
||||
: MCID(0), Flags(0), AsmPrinterFlags(0),
|
||||
MemRefs(0), MemRefsEnd(0),
|
||||
NumMemRefs(0), MemRefs(0),
|
||||
Parent(0) {
|
||||
// Make sure that we get added to a machine basicblock
|
||||
LeakDetector::addGarbageObject(this);
|
||||
|
@ -502,7 +502,7 @@ void MachineInstr::addImplicitDefUseOperands() {
|
|||
/// the MCInstrDesc.
|
||||
MachineInstr::MachineInstr(const MCInstrDesc &tid, bool NoImp)
|
||||
: MCID(&tid), Flags(0), AsmPrinterFlags(0),
|
||||
MemRefs(0), MemRefsEnd(0), Parent(0) {
|
||||
NumMemRefs(0), MemRefs(0), Parent(0) {
|
||||
unsigned NumImplicitOps = 0;
|
||||
if (!NoImp)
|
||||
NumImplicitOps = MCID->getNumImplicitDefs() + MCID->getNumImplicitUses();
|
||||
|
@ -517,7 +517,7 @@ MachineInstr::MachineInstr(const MCInstrDesc &tid, bool NoImp)
|
|||
MachineInstr::MachineInstr(const MCInstrDesc &tid, const DebugLoc dl,
|
||||
bool NoImp)
|
||||
: MCID(&tid), Flags(0), AsmPrinterFlags(0),
|
||||
MemRefs(0), MemRefsEnd(0), Parent(0), debugLoc(dl) {
|
||||
NumMemRefs(0), MemRefs(0), Parent(0), debugLoc(dl) {
|
||||
unsigned NumImplicitOps = 0;
|
||||
if (!NoImp)
|
||||
NumImplicitOps = MCID->getNumImplicitDefs() + MCID->getNumImplicitUses();
|
||||
|
@ -533,7 +533,7 @@ MachineInstr::MachineInstr(const MCInstrDesc &tid, const DebugLoc dl,
|
|||
/// basic block.
|
||||
MachineInstr::MachineInstr(MachineBasicBlock *MBB, const MCInstrDesc &tid)
|
||||
: MCID(&tid), Flags(0), AsmPrinterFlags(0),
|
||||
MemRefs(0), MemRefsEnd(0), Parent(0) {
|
||||
NumMemRefs(0), MemRefs(0), Parent(0) {
|
||||
assert(MBB && "Cannot use inserting ctor with null basic block!");
|
||||
unsigned NumImplicitOps =
|
||||
MCID->getNumImplicitDefs() + MCID->getNumImplicitUses();
|
||||
|
@ -549,7 +549,7 @@ MachineInstr::MachineInstr(MachineBasicBlock *MBB, const MCInstrDesc &tid)
|
|||
MachineInstr::MachineInstr(MachineBasicBlock *MBB, const DebugLoc dl,
|
||||
const MCInstrDesc &tid)
|
||||
: MCID(&tid), Flags(0), AsmPrinterFlags(0),
|
||||
MemRefs(0), MemRefsEnd(0), Parent(0), debugLoc(dl) {
|
||||
NumMemRefs(0), MemRefs(0), Parent(0), debugLoc(dl) {
|
||||
assert(MBB && "Cannot use inserting ctor with null basic block!");
|
||||
unsigned NumImplicitOps =
|
||||
MCID->getNumImplicitDefs() + MCID->getNumImplicitUses();
|
||||
|
@ -564,7 +564,7 @@ MachineInstr::MachineInstr(MachineBasicBlock *MBB, const DebugLoc dl,
|
|||
///
|
||||
MachineInstr::MachineInstr(MachineFunction &MF, const MachineInstr &MI)
|
||||
: MCID(&MI.getDesc()), Flags(0), AsmPrinterFlags(0),
|
||||
MemRefs(MI.MemRefs), MemRefsEnd(MI.MemRefsEnd),
|
||||
NumMemRefs(MI.NumMemRefs), MemRefs(MI.MemRefs),
|
||||
Parent(0), debugLoc(MI.getDebugLoc()) {
|
||||
Operands.reserve(MI.getNumOperands());
|
||||
|
||||
|
@ -739,17 +739,16 @@ void MachineInstr::RemoveOperand(unsigned OpNo) {
|
|||
void MachineInstr::addMemOperand(MachineFunction &MF,
|
||||
MachineMemOperand *MO) {
|
||||
mmo_iterator OldMemRefs = MemRefs;
|
||||
mmo_iterator OldMemRefsEnd = MemRefsEnd;
|
||||
uint16_t OldNumMemRefs = NumMemRefs;
|
||||
|
||||
size_t NewNum = (MemRefsEnd - MemRefs) + 1;
|
||||
uint16_t NewNum = NumMemRefs + 1;
|
||||
mmo_iterator NewMemRefs = MF.allocateMemRefsArray(NewNum);
|
||||
mmo_iterator NewMemRefsEnd = NewMemRefs + NewNum;
|
||||
|
||||
std::copy(OldMemRefs, OldMemRefsEnd, NewMemRefs);
|
||||
std::copy(OldMemRefs, OldMemRefs + OldNumMemRefs, NewMemRefs);
|
||||
NewMemRefs[NewNum - 1] = MO;
|
||||
|
||||
MemRefs = NewMemRefs;
|
||||
MemRefsEnd = NewMemRefsEnd;
|
||||
NumMemRefs = NewNum;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
Loading…
Reference in New Issue