forked from OSchip/llvm-project
Hoist hasLoadFromStackSlot and hasStoreToStackSlot.
These the methods are target-independent since they simply scan the memory operands. They can live in TargetInstrInfoImpl. llvm-svn: 137063
This commit is contained in:
parent
c40303885b
commit
daa2cad723
|
@ -693,6 +693,12 @@ public:
|
||||||
unsigned &SrcOpIdx2) const;
|
unsigned &SrcOpIdx2) const;
|
||||||
virtual bool canFoldMemoryOperand(const MachineInstr *MI,
|
virtual bool canFoldMemoryOperand(const MachineInstr *MI,
|
||||||
const SmallVectorImpl<unsigned> &Ops) const;
|
const SmallVectorImpl<unsigned> &Ops) const;
|
||||||
|
virtual bool hasLoadFromStackSlot(const MachineInstr *MI,
|
||||||
|
const MachineMemOperand *&MMO,
|
||||||
|
int &FrameIndex) const;
|
||||||
|
virtual bool hasStoreToStackSlot(const MachineInstr *MI,
|
||||||
|
const MachineMemOperand *&MMO,
|
||||||
|
int &FrameIndex) const;
|
||||||
virtual bool PredicateInstruction(MachineInstr *MI,
|
virtual bool PredicateInstruction(MachineInstr *MI,
|
||||||
const SmallVectorImpl<MachineOperand> &Pred) const;
|
const SmallVectorImpl<MachineOperand> &Pred) const;
|
||||||
virtual void reMaterialize(MachineBasicBlock &MBB,
|
virtual void reMaterialize(MachineBasicBlock &MBB,
|
||||||
|
|
|
@ -160,6 +160,42 @@ bool TargetInstrInfoImpl::PredicateInstruction(MachineInstr *MI,
|
||||||
return MadeChange;
|
return MadeChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TargetInstrInfoImpl::hasLoadFromStackSlot(const MachineInstr *MI,
|
||||||
|
const MachineMemOperand *&MMO,
|
||||||
|
int &FrameIndex) const {
|
||||||
|
for (MachineInstr::mmo_iterator o = MI->memoperands_begin(),
|
||||||
|
oe = MI->memoperands_end();
|
||||||
|
o != oe;
|
||||||
|
++o) {
|
||||||
|
if ((*o)->isLoad() && (*o)->getValue())
|
||||||
|
if (const FixedStackPseudoSourceValue *Value =
|
||||||
|
dyn_cast<const FixedStackPseudoSourceValue>((*o)->getValue())) {
|
||||||
|
FrameIndex = Value->getFrameIndex();
|
||||||
|
MMO = *o;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TargetInstrInfoImpl::hasStoreToStackSlot(const MachineInstr *MI,
|
||||||
|
const MachineMemOperand *&MMO,
|
||||||
|
int &FrameIndex) const {
|
||||||
|
for (MachineInstr::mmo_iterator o = MI->memoperands_begin(),
|
||||||
|
oe = MI->memoperands_end();
|
||||||
|
o != oe;
|
||||||
|
++o) {
|
||||||
|
if ((*o)->isStore() && (*o)->getValue())
|
||||||
|
if (const FixedStackPseudoSourceValue *Value =
|
||||||
|
dyn_cast<const FixedStackPseudoSourceValue>((*o)->getValue())) {
|
||||||
|
FrameIndex = Value->getFrameIndex();
|
||||||
|
MMO = *o;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void TargetInstrInfoImpl::reMaterialize(MachineBasicBlock &MBB,
|
void TargetInstrInfoImpl::reMaterialize(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator I,
|
MachineBasicBlock::iterator I,
|
||||||
unsigned DestReg,
|
unsigned DestReg,
|
||||||
|
|
|
@ -856,24 +856,6 @@ unsigned X86InstrInfo::isLoadFromStackSlotPostFE(const MachineInstr *MI,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool X86InstrInfo::hasLoadFromStackSlot(const MachineInstr *MI,
|
|
||||||
const MachineMemOperand *&MMO,
|
|
||||||
int &FrameIndex) const {
|
|
||||||
for (MachineInstr::mmo_iterator o = MI->memoperands_begin(),
|
|
||||||
oe = MI->memoperands_end();
|
|
||||||
o != oe;
|
|
||||||
++o) {
|
|
||||||
if ((*o)->isLoad() && (*o)->getValue())
|
|
||||||
if (const FixedStackPseudoSourceValue *Value =
|
|
||||||
dyn_cast<const FixedStackPseudoSourceValue>((*o)->getValue())) {
|
|
||||||
FrameIndex = Value->getFrameIndex();
|
|
||||||
MMO = *o;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned X86InstrInfo::isStoreToStackSlot(const MachineInstr *MI,
|
unsigned X86InstrInfo::isStoreToStackSlot(const MachineInstr *MI,
|
||||||
int &FrameIndex) const {
|
int &FrameIndex) const {
|
||||||
if (isFrameStoreOpcode(MI->getOpcode()))
|
if (isFrameStoreOpcode(MI->getOpcode()))
|
||||||
|
@ -896,24 +878,6 @@ unsigned X86InstrInfo::isStoreToStackSlotPostFE(const MachineInstr *MI,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool X86InstrInfo::hasStoreToStackSlot(const MachineInstr *MI,
|
|
||||||
const MachineMemOperand *&MMO,
|
|
||||||
int &FrameIndex) const {
|
|
||||||
for (MachineInstr::mmo_iterator o = MI->memoperands_begin(),
|
|
||||||
oe = MI->memoperands_end();
|
|
||||||
o != oe;
|
|
||||||
++o) {
|
|
||||||
if ((*o)->isStore() && (*o)->getValue())
|
|
||||||
if (const FixedStackPseudoSourceValue *Value =
|
|
||||||
dyn_cast<const FixedStackPseudoSourceValue>((*o)->getValue())) {
|
|
||||||
FrameIndex = Value->getFrameIndex();
|
|
||||||
MMO = *o;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// regIsPICBase - Return true if register is PIC base (i.e.g defined by
|
/// regIsPICBase - Return true if register is PIC base (i.e.g defined by
|
||||||
/// X86::MOVPC32r.
|
/// X86::MOVPC32r.
|
||||||
static bool regIsPICBase(unsigned BaseReg, const MachineRegisterInfo &MRI) {
|
static bool regIsPICBase(unsigned BaseReg, const MachineRegisterInfo &MRI) {
|
||||||
|
|
|
@ -166,17 +166,6 @@ public:
|
||||||
unsigned isLoadFromStackSlotPostFE(const MachineInstr *MI,
|
unsigned isLoadFromStackSlotPostFE(const MachineInstr *MI,
|
||||||
int &FrameIndex) const;
|
int &FrameIndex) const;
|
||||||
|
|
||||||
/// hasLoadFromStackSlot - If the specified machine instruction has
|
|
||||||
/// a load from a stack slot, return true along with the FrameIndex
|
|
||||||
/// of the loaded stack slot and the machine mem operand containing
|
|
||||||
/// the reference. If not, return false. Unlike
|
|
||||||
/// isLoadFromStackSlot, this returns true for any instructions that
|
|
||||||
/// loads from the stack. This is a hint only and may not catch all
|
|
||||||
/// cases.
|
|
||||||
bool hasLoadFromStackSlot(const MachineInstr *MI,
|
|
||||||
const MachineMemOperand *&MMO,
|
|
||||||
int &FrameIndex) const;
|
|
||||||
|
|
||||||
unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const;
|
unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const;
|
||||||
/// isStoreToStackSlotPostFE - Check for post-frame ptr elimination
|
/// isStoreToStackSlotPostFE - Check for post-frame ptr elimination
|
||||||
/// stack locations as well. This uses a heuristic so it isn't
|
/// stack locations as well. This uses a heuristic so it isn't
|
||||||
|
@ -184,16 +173,6 @@ public:
|
||||||
unsigned isStoreToStackSlotPostFE(const MachineInstr *MI,
|
unsigned isStoreToStackSlotPostFE(const MachineInstr *MI,
|
||||||
int &FrameIndex) const;
|
int &FrameIndex) const;
|
||||||
|
|
||||||
/// hasStoreToStackSlot - If the specified machine instruction has a
|
|
||||||
/// store to a stack slot, return true along with the FrameIndex of
|
|
||||||
/// the loaded stack slot and the machine mem operand containing the
|
|
||||||
/// reference. If not, return false. Unlike isStoreToStackSlot,
|
|
||||||
/// this returns true for any instructions that loads from the
|
|
||||||
/// stack. This is a hint only and may not catch all cases.
|
|
||||||
bool hasStoreToStackSlot(const MachineInstr *MI,
|
|
||||||
const MachineMemOperand *&MMO,
|
|
||||||
int &FrameIndex) const;
|
|
||||||
|
|
||||||
bool isReallyTriviallyReMaterializable(const MachineInstr *MI,
|
bool isReallyTriviallyReMaterializable(const MachineInstr *MI,
|
||||||
AliasAnalysis *AA) const;
|
AliasAnalysis *AA) const;
|
||||||
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
||||||
|
|
Loading…
Reference in New Issue