Closed
Description
#79425 has adopted TableGen-based macro fusion.
And it will generate RISCVGenMacroFusion.inc.
bool isTuneAUIPCADDIFusion(
const TargetInstrInfo &TII,
const TargetSubtargetInfo &STI,
const MachineInstr *FirstMI,
const MachineInstr &SecondMI) {
auto &MRI = SecondMI.getMF()->getRegInfo();
{
const MachineInstr *MI = &SecondMI;
if (( MI->getOpcode() != RISCV::ADDI ))
return false;
}
if (!FirstMI)
return true;
{
const MachineInstr *MI = FirstMI;
if (( MI->getOpcode() != RISCV::AUIPC ))
return false;
}
{
const MachineInstr *MI = &SecondMI;
if (!(
MI->getOperand(0).getReg().isVirtual()
|| MI->getOperand(0).getReg() == MI->getOperand(1).getReg()
))
return false;
}
{
Register FirstDest = FirstMI->getOperand(0).getReg();
if (FirstDest.isVirtual() && !MRI.hasOneNonDBGUse(FirstDest))
return false;
}
if (!(FirstMI->getOperand(0).isReg() &&
SecondMI.getOperand(1).isReg() &&
FirstMI->getOperand(0).getReg() == SecondMI.getOperand(1).getReg()))
return false;
return true;
}
My question is, is it possible to check FirstMI->getOperand(0).getReg() == SecondMI.getOperand(2).getReg()
when these two regs are virtual and the second inst is commutative?