[llvm] [RISCV] Add short forward branch support for `lb`, `lbu`, `lh`, `lhu`, `lw`, `lwu` and `ld` (PR #170829)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 11 08:32:49 PST 2025


================
@@ -897,6 +897,75 @@ MachineInstr *RISCVInstrInfo::foldMemoryOperandImpl(
       .addImm(0);
 }
 
+static unsigned getLoadPredicatedOpcode(unsigned Opcode) {
+  switch (Opcode) {
+  case RISCV::LB:
+    return RISCV::PseudoCCLB;
+  case RISCV::LBU:
+    return RISCV::PseudoCCLBU;
+  case RISCV::LH:
+    return RISCV::PseudoCCLH;
+  case RISCV::LHU:
+    return RISCV::PseudoCCLHU;
+  case RISCV::LW:
+    return RISCV::PseudoCCLW;
+  case RISCV::LWU:
+    return RISCV::PseudoCCLWU;
+  case RISCV::LD:
+    return RISCV::PseudoCCLD;
+  default:
+    return 0;
+  }
+}
+
+MachineInstr *RISCVInstrInfo::foldMemoryOperandImpl(
+    MachineFunction &MF, MachineInstr &MI, ArrayRef<unsigned> Ops,
+    MachineBasicBlock::iterator InsertPt, MachineInstr &LoadMI,
+    LiveIntervals *LIS) const {
+  // For now, only handle RISCV::PseudoCCMOVGPR.
+  if (MI.getOpcode() != RISCV::PseudoCCMOVGPR)
+    return nullptr;
+
+  unsigned PredOpc = getLoadPredicatedOpcode(LoadMI.getOpcode());
+
+  if (!STI.hasShortForwardBranchILoad() || !PredOpc)
+    return nullptr;
+
+  MachineRegisterInfo &MRI = MF.getRegInfo();
+
+  if (Ops.size() != 1)
+    return nullptr;
+
+  bool Invert = MRI.getVRegDef(MI.getOperand(Ops[0]).getReg()) == &LoadMI;
----------------
topperc wrote:

I was able to get a bad machine code error from this IR.

```
define i32 @test_i8_s_3(i32 %b, i1 zeroext %x, ptr %base) nounwind {             
entry:                                                                           
  %addr = getelementptr i8, ptr %base, i32 4   ; compute base + 4                
  %val = load i8, ptr %addr          ; load 8-bit value                          
  %ext = sext i8 %val to i32         ; sign-extend to 32 bits                    
  %res = select i1 %x, i32 %b, i32 %ext                                          
  ret i32 %res                                                                   
}
```

https://github.com/llvm/llvm-project/pull/170829


More information about the llvm-commits mailing list