Skip to content

[RISCV][MacroFusion] Improve fusion in pre-RA #82738

Closed
@zxc12523

Description

@zxc12523

#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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    llvmUmbrella label for LLVM issues

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions