[llvm] [RISCV] Factor out LI/QC_LI matching in RISCVRedundantCopyElimination. NFC (PR #228610)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 2 15:47:21 PDT 2026


https://github.com/topperc created https://github.com/llvm/llvm-project/pull/228610

None

>From 6f08fe07d71b362ffe3286734094dfa8d1d76530 Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Fri, 2 Oct 2026 15:44:25 -0700
Subject: [PATCH] [RISCV] Factor out LI/QC_LI matching in
 RISCVRedundantCopyElimination. NFC

---
 .../RISCV/RISCVRedundantCopyElimination.cpp   | 49 +++++++++----------
 1 file changed, 23 insertions(+), 26 deletions(-)

diff --git a/llvm/lib/Target/RISCV/RISCVRedundantCopyElimination.cpp b/llvm/lib/Target/RISCV/RISCVRedundantCopyElimination.cpp
index ccf9fc2b040f6..67785f666531f 100644
--- a/llvm/lib/Target/RISCV/RISCVRedundantCopyElimination.cpp
+++ b/llvm/lib/Target/RISCV/RISCVRedundantCopyElimination.cpp
@@ -109,6 +109,20 @@ guaranteesRegEqualsImmInBlock(MachineBasicBlock &MBB,
   return false;
 }
 
+// Match "addi rd, x0, imm" or "qc.li rd, imm", returning the defined
+// register and the materialized immediate. Reg is invalid if MI isn't a
+// match.
+static RegImmPair matchRegImmediate(const MachineInstr &MI) {
+  if (MI.getOpcode() == RISCV::ADDI && MI.getOperand(0).isReg() &&
+      MI.getOperand(1).isReg() && MI.getOperand(1).getReg() == RISCV::X0 &&
+      MI.getOperand(2).isImm())
+    return RegImmPair(MI.getOperand(0).getReg(), MI.getOperand(2).getImm());
+  if (MI.getOpcode() == RISCV::QC_LI && MI.getOperand(0).isReg() &&
+      MI.getOperand(1).isImm())
+    return RegImmPair(MI.getOperand(0).getReg(), MI.getOperand(1).getImm());
+  return RegImmPair(Register(), 0);
+}
+
 static std::optional<int64_t>
 getRegImmediateBeforeTerminator(MachineBasicBlock &MBB, Register Reg,
                                 const TargetRegisterInfo *TRI) {
@@ -121,13 +135,9 @@ getRegImmediateBeforeTerminator(MachineBasicBlock &MBB, Register Reg,
     if (!MI.modifiesRegister(Reg, TRI))
       continue;
     // The last modification must define Reg itself to a known immediate.
-    if (MI.getOpcode() == RISCV::ADDI && MI.getOperand(0).isReg() &&
-        MI.getOperand(0).getReg() == Reg && MI.getOperand(1).isReg() &&
-        MI.getOperand(1).getReg() == RISCV::X0 && MI.getOperand(2).isImm())
-      return MI.getOperand(2).getImm();
-    if (MI.getOpcode() == RISCV::QC_LI && MI.getOperand(0).isReg() &&
-        MI.getOperand(0).getReg() == Reg && MI.getOperand(1).isImm())
-      return MI.getOperand(1).getImm();
+    RegImmPair Match = matchRegImmediate(MI);
+    if (Match.Reg == Reg)
+      return Match.Imm;
     return std::nullopt;
   }
   return std::nullopt;
@@ -199,29 +209,16 @@ bool RISCVRedundantCopyElimination::optimizeBlock(MachineBasicBlock &MBB) {
         Register DefReg = MI->getOperand(0).getReg();
         Register SrcReg = MI->getOperand(1).getReg();
 
-        if (SrcReg == RISCV::X0 && !MRI->isReserved(DefReg) &&
-            TargetReg == DefReg)
+        if (SrcReg == RISCV::X0 && TargetReg == DefReg &&
+            !MRI->isReserved(DefReg))
           RemoveMI = true;
       }
     } else {
-      // Xqcibi, XAndesPref and Zibi compare with non-zero immediate:
+      // Compare with non-zero immediate or a known register value:
       // remove redundant addi rd,x0,imm or qc.li rd,imm as applicable.
-      if (MI->getOpcode() == RISCV::ADDI && MI->getOperand(0).isReg() &&
-          MI->getOperand(1).isReg() && MI->getOperand(2).isImm()) {
-        Register DefReg = MI->getOperand(0).getReg();
-        Register SrcReg = MI->getOperand(1).getReg();
-        int64_t Imm = MI->getOperand(2).getImm();
-        if (SrcReg == RISCV::X0 && !MRI->isReserved(DefReg) &&
-            TargetReg == DefReg && Imm == CompareImm)
-          RemoveMI = true;
-      } else if (MI->getOpcode() == RISCV::QC_LI && MI->getOperand(0).isReg() &&
-                 MI->getOperand(1).isImm()) {
-        Register DefReg = MI->getOperand(0).getReg();
-        int64_t Imm = MI->getOperand(1).getImm();
-        if (!MRI->isReserved(DefReg) && TargetReg == DefReg &&
-            Imm == CompareImm)
-          RemoveMI = true;
-      }
+      RegImmPair Match = matchRegImmediate(*MI);
+      if (Match.Reg && TargetReg == Match.Reg && Match.Imm == CompareImm)
+        RemoveMI = true;
     }
 
     if (RemoveMI) {



More information about the llvm-commits mailing list