mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
Another predicate routine
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76057 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
27bf677e59
commit
f1106c4247
@ -52,6 +52,12 @@ SystemZInstrInfo::SystemZInstrInfo(SystemZTargetMachine &tm)
|
||||
RegSpillOffsets[SpillOffsTab[i][0]] = SpillOffsTab[i][1];
|
||||
}
|
||||
|
||||
/// isGVStub - Return true if the GV requires an extra load to get the
|
||||
/// real address.
|
||||
static inline bool isGVStub(GlobalValue *GV, SystemZTargetMachine &TM) {
|
||||
return TM.getSubtarget<SystemZSubtarget>().GVRequiresExtraLoad(GV, TM, false);
|
||||
}
|
||||
|
||||
void SystemZInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned SrcReg, bool isKill, int FrameIdx,
|
||||
@ -246,6 +252,30 @@ unsigned SystemZInstrInfo::isStoreToStackSlot(const MachineInstr *MI,
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool SystemZInstrInfo::isInvariantLoad(const MachineInstr *MI) const {
|
||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||
const MachineOperand &MO = MI->getOperand(i);
|
||||
// Loads from constant pools are trivially invariant.
|
||||
if (MO.isCPI())
|
||||
return true;
|
||||
|
||||
if (MO.isGlobal())
|
||||
return isGVStub(MO.getGlobal(), TM);
|
||||
|
||||
// If this is a load from an invariant stack slot, the load is a constant.
|
||||
if (MO.isFI()) {
|
||||
const MachineFrameInfo &MFI =
|
||||
*MI->getParent()->getParent()->getFrameInfo();
|
||||
int Idx = MO.getIndex();
|
||||
return MFI.isFixedObjectIndex(Idx) && MFI.isImmutableObjectIndex(Idx);
|
||||
}
|
||||
}
|
||||
|
||||
// All other instances of these instructions are presumed to have other
|
||||
// issues.
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
SystemZInstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
|
@ -70,6 +70,7 @@ public:
|
||||
unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
|
||||
unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const;
|
||||
unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const;
|
||||
bool isInvariantLoad(const MachineInstr *MI) const;
|
||||
|
||||
virtual void storeRegToStackSlot(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
|
Loading…
Reference in New Issue
Block a user