mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
This patch eliminates redundant instructions that produce 0.
For example, the first instruction in the code below can be eliminated if the use of $vr0 is replaced with $zero: addiu $vr0, $zero, 0 add $vr2, $vr1, $vr0 add $vr2, $vr1, $zero git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152280 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c174eaf948
commit
7065b7b203
@ -99,6 +99,8 @@ private:
|
|||||||
return CurDAG->getTargetConstant(Imm, Node->getValueType(0));
|
return CurDAG->getTargetConstant(Imm, Node->getValueType(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProcessFunctionAfterISel(MachineFunction &MF);
|
||||||
|
bool ReplaceUsesWithZeroReg(MachineRegisterInfo *MRI, const MachineInstr&);
|
||||||
void InitGlobalBaseReg(MachineFunction &MF);
|
void InitGlobalBaseReg(MachineFunction &MF);
|
||||||
|
|
||||||
virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op,
|
virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op,
|
||||||
@ -181,10 +183,57 @@ void MipsDAGToDAGISel::InitGlobalBaseReg(MachineFunction &MF) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MipsDAGToDAGISel::ReplaceUsesWithZeroReg(MachineRegisterInfo *MRI,
|
||||||
|
const MachineInstr& MI) {
|
||||||
|
unsigned DstReg = 0, ZeroReg = 0;
|
||||||
|
|
||||||
|
// Check if MI is "addiu $dst, $zero, 0" or "daddiu $dst, $zero, 0".
|
||||||
|
if ((MI.getOpcode() == Mips::ADDiu) &&
|
||||||
|
(MI.getOperand(1).getReg() == Mips::ZERO) &&
|
||||||
|
(MI.getOperand(2).getImm() == 0)) {
|
||||||
|
DstReg = MI.getOperand(0).getReg();
|
||||||
|
ZeroReg = Mips::ZERO;
|
||||||
|
} else if ((MI.getOpcode() == Mips::DADDiu) &&
|
||||||
|
(MI.getOperand(1).getReg() == Mips::ZERO_64) &&
|
||||||
|
(MI.getOperand(2).getImm() == 0)) {
|
||||||
|
DstReg = MI.getOperand(0).getReg();
|
||||||
|
ZeroReg = Mips::ZERO_64;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!DstReg)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Replace uses with ZeroReg.
|
||||||
|
for (MachineRegisterInfo::use_iterator U = MRI->use_begin(DstReg),
|
||||||
|
E = MRI->use_end(); U != E; ++U) {
|
||||||
|
MachineOperand &MO = U.getOperand();
|
||||||
|
MachineInstr *MI = MO.getParent();
|
||||||
|
|
||||||
|
// Do not replace if it is a phi's operand or is tied to def operand.
|
||||||
|
if (MI->isPHI() || MI->isRegTiedToDefOperand(U.getOperandNo()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
MO.setReg(ZeroReg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MipsDAGToDAGISel::ProcessFunctionAfterISel(MachineFunction &MF) {
|
||||||
|
InitGlobalBaseReg(MF);
|
||||||
|
|
||||||
|
MachineRegisterInfo *MRI = &MF.getRegInfo();
|
||||||
|
|
||||||
|
for (MachineFunction::iterator MFI = MF.begin(), MFE = MF.end(); MFI != MFE;
|
||||||
|
++MFI)
|
||||||
|
for (MachineBasicBlock::iterator I = MFI->begin(); I != MFI->end(); ++I)
|
||||||
|
ReplaceUsesWithZeroReg(MRI, *I);
|
||||||
|
}
|
||||||
|
|
||||||
bool MipsDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
|
bool MipsDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
|
||||||
bool Ret = SelectionDAGISel::runOnMachineFunction(MF);
|
bool Ret = SelectionDAGISel::runOnMachineFunction(MF);
|
||||||
|
|
||||||
InitGlobalBaseReg(MF);
|
ProcessFunctionAfterISel(MF);
|
||||||
|
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user