mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-08 18:31:23 +00:00
Add a target hook to allow loads from constant pools to be rematerialized, and an
implementation for x86. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37576 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
86ff296e63
commit
c101e95cb6
@ -298,6 +298,16 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// isOtherReMaterializableLoad - If the specified machine instruction is a
|
||||||
|
/// direct load that is trivially rematerializable, not counting loads from
|
||||||
|
/// stack slots, return true. If not, return false. This predicate must
|
||||||
|
/// return false if the instruction has any side effects other than
|
||||||
|
/// producing the value from the load, or if it requres any address
|
||||||
|
/// registers that are not always available.
|
||||||
|
virtual bool isOtherReMaterializableLoad(MachineInstr *MI) const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// convertToThreeAddress - This method must be implemented by targets that
|
/// convertToThreeAddress - This method must be implemented by targets that
|
||||||
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
||||||
/// may be able to convert a two-address instruction into one or moretrue
|
/// may be able to convert a two-address instruction into one or moretrue
|
||||||
|
@ -336,12 +336,14 @@ void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
|
|||||||
// time we see a vreg.
|
// time we see a vreg.
|
||||||
if (interval.empty()) {
|
if (interval.empty()) {
|
||||||
// Remember if the definition can be rematerialized. All load's from fixed
|
// Remember if the definition can be rematerialized. All load's from fixed
|
||||||
// stack slots are re-materializable.
|
// stack slots are re-materializable. The target may permit other loads to
|
||||||
|
// be re-materialized as well.
|
||||||
int FrameIdx = 0;
|
int FrameIdx = 0;
|
||||||
if (vi.DefInst &&
|
if (vi.DefInst &&
|
||||||
(tii_->isReMaterializable(vi.DefInst->getOpcode()) ||
|
(tii_->isReMaterializable(vi.DefInst->getOpcode()) ||
|
||||||
(tii_->isLoadFromStackSlot(vi.DefInst, FrameIdx) &&
|
(tii_->isLoadFromStackSlot(vi.DefInst, FrameIdx) &&
|
||||||
mf_->getFrameInfo()->isFixedObjectIndex(FrameIdx))))
|
mf_->getFrameInfo()->isFixedObjectIndex(FrameIdx)) ||
|
||||||
|
tii_->isOtherReMaterializableLoad(vi.DefInst)))
|
||||||
interval.remat = vi.DefInst;
|
interval.remat = vi.DefInst;
|
||||||
|
|
||||||
// Get the Idx of the defining instructions.
|
// Get the Idx of the defining instructions.
|
||||||
|
@ -664,7 +664,8 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM,
|
|||||||
// If this instruction is being rematerialized, just remove it!
|
// If this instruction is being rematerialized, just remove it!
|
||||||
int FrameIdx;
|
int FrameIdx;
|
||||||
if ((TID->Flags & M_REMATERIALIZIBLE) ||
|
if ((TID->Flags & M_REMATERIALIZIBLE) ||
|
||||||
TII->isLoadFromStackSlot(&MI, FrameIdx)) {
|
TII->isLoadFromStackSlot(&MI, FrameIdx) ||
|
||||||
|
TII->isOtherReMaterializableLoad(&MI)) {
|
||||||
bool Remove = true;
|
bool Remove = true;
|
||||||
for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
|
for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
|
||||||
MachineOperand &MO = MI.getOperand(i);
|
MachineOperand &MO = MI.getOperand(i);
|
||||||
|
@ -112,6 +112,31 @@ unsigned X86InstrInfo::isStoreToStackSlot(MachineInstr *MI,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool X86InstrInfo::isOtherReMaterializableLoad(MachineInstr *MI) const {
|
||||||
|
switch (MI->getOpcode()) {
|
||||||
|
default: break;
|
||||||
|
case X86::MOV8rm:
|
||||||
|
case X86::MOV16rm:
|
||||||
|
case X86::MOV16_rm:
|
||||||
|
case X86::MOV32rm:
|
||||||
|
case X86::MOV32_rm:
|
||||||
|
case X86::MOV64rm:
|
||||||
|
case X86::FpLD64m:
|
||||||
|
case X86::MOVSSrm:
|
||||||
|
case X86::MOVSDrm:
|
||||||
|
case X86::MOVAPSrm:
|
||||||
|
case X86::MOVAPDrm:
|
||||||
|
case X86::MMX_MOVD64rm:
|
||||||
|
case X86::MMX_MOVQ64rm:
|
||||||
|
return MI->getOperand(1).isRegister() && MI->getOperand(2).isImmediate() &&
|
||||||
|
MI->getOperand(3).isRegister() && MI->getOperand(4).isConstantPoolIndex() &&
|
||||||
|
MI->getOperand(1).getReg() == 0 &&
|
||||||
|
MI->getOperand(2).getImmedValue() == 1 &&
|
||||||
|
MI->getOperand(3).getReg() == 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// convertToThreeAddress - This method must be implemented by targets that
|
/// convertToThreeAddress - This method must be implemented by targets that
|
||||||
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
||||||
/// may be able to convert a two-address instruction into a true
|
/// may be able to convert a two-address instruction into a true
|
||||||
|
@ -239,6 +239,7 @@ public:
|
|||||||
unsigned& destReg) const;
|
unsigned& destReg) const;
|
||||||
unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
||||||
unsigned isStoreToStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
unsigned isStoreToStackSlot(MachineInstr *MI, int &FrameIndex) const;
|
||||||
|
bool isOtherReMaterializableLoad(MachineInstr *MI) const;
|
||||||
|
|
||||||
/// convertToThreeAddress - This method must be implemented by targets that
|
/// convertToThreeAddress - This method must be implemented by targets that
|
||||||
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
/// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target
|
||||||
|
Loading…
Reference in New Issue
Block a user