diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.h b/llvm/lib/Target/RISCV/RISCVInstrInfo.h --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.h +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.h @@ -83,6 +83,9 @@ bool isAsCheapAsAMove(const MachineInstr &MI) const override; + Optional + isCopyInstrImpl(const MachineInstr &MI) const override; + bool verifyInstruction(const MachineInstr &MI, StringRef &ErrInfo) const override; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -530,6 +530,48 @@ return MI.isAsCheapAsAMove(); } +Optional +RISCVInstrInfo::isCopyInstrImpl(const MachineInstr &MI) const { + if (MI.isMoveReg()) + return DestSourcePair{MI.getOperand(0), MI.getOperand(1)}; + switch (MI.getOpcode()) { + default: + break; + case RISCV::SLLI: + case RISCV::SRLI: + case RISCV::SRAI: + case RISCV::ADDI: + case RISCV::ORI: + case RISCV::XORI: + if (MI.getOperand(2).isImm() && MI.getOperand(2).getImm() == 0) + return DestSourcePair{MI.getOperand(0), MI.getOperand(1)}; + break; + case RISCV::ADD: + case RISCV::OR: + case RISCV::XOR: + if (MI.getOperand(1).isReg() && MI.getOperand(1).getReg() == RISCV::X0) + return DestSourcePair{MI.getOperand(0), MI.getOperand(2)}; + if (MI.getOperand(2).isReg() && MI.getOperand(2).getReg() == RISCV::X0) + return DestSourcePair{MI.getOperand(0), MI.getOperand(1)}; + break; + case RISCV::SUB: + case RISCV::SLL: + case RISCV::SRL: + case RISCV::SRA: + if (MI.getOperand(2).isReg() && MI.getOperand(2).getReg() == RISCV::X0) + return DestSourcePair{MI.getOperand(0), MI.getOperand(1)}; + break; + case RISCV::FSGNJ_D: + case RISCV::FSGNJ_S: + // The canonical floatig-point move is fsgnj rd, rs, rs. + if (MI.getOperand(1).isReg() && MI.getOperand(2).isReg() && + MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) + return DestSourcePair{MI.getOperand(0), MI.getOperand(1)}; + break; + } + return None; +} + bool RISCVInstrInfo::verifyInstruction(const MachineInstr &MI, StringRef &ErrInfo) const { const MCInstrInfo *MCII = STI.getInstrInfo();