Skip to content

[RISCV] Add bltu/bgeu zero => bnez/beqz canonicalisation to RISCVInstrInfo::simplifyInstruction #141775

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4191,6 +4191,24 @@ bool RISCVInstrInfo::simplifyInstruction(MachineInstr &MI) const {
return true;
}
break;
case RISCV::BLTU:
// bltu zero, rs, imm => bne rs, zero, imm
if (MI.getOperand(0).getReg() == RISCV::X0) {
MachineOperand MO0 = MI.getOperand(0);
MI.removeOperand(0);
MI.insert(MI.operands_begin() + 1, {MO0});
MI.setDesc(get(RISCV::BNE));
}
break;
case RISCV::BGEU:
// bgeu zero, rs, imm => beq rs, zero, imm
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thinking about other cases here:

bgeu rs, zero, imm is an unconditionally taken branch. Rewriting as a unconditional branch is hard (due to CFG updates), but maybe we could turn this into beq zero, zero, imm? That would remove the register use, and might compress better?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

beq zero, zero, imm isn't compressible. The first register needs to be x8-x15.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, bgeu reg, zero is on my radar and as you say the CFG update makes it challenging. I hadn't considered canonicalising to beq zero, zero, imm. beq reg, reg, imm would be an alternative that has the chance of being compressible.

There are ~440 static instances of bgeu reg, zero in an RVA22 test-suite build. 40 instances of beq with rs1 == rs2 and 50 of bne with rs1 == rs2.

if (MI.getOperand(0).getReg() == RISCV::X0) {
MachineOperand MO0 = MI.getOperand(0);
MI.removeOperand(0);
MI.insert(MI.operands_begin() + 1, {MO0});
MI.setDesc(get(RISCV::BEQ));
}
break;
}
return false;
}
Expand Down
36 changes: 36 additions & 0 deletions llvm/test/CodeGen/RISCV/machine-copyprop-simplifyinstruction.mir
Original file line number Diff line number Diff line change
Expand Up @@ -742,3 +742,39 @@ body: |
renamable $x10 = MAXU renamable $x11, renamable $x11
PseudoRET implicit $x10
...
---
name: bltu
body: |
; CHECK-LABEL: name: bltu
; CHECK: bb.0:
; CHECK-NEXT: successors: %bb.1(0x80000000)
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: renamable $x11 = COPY $x12
; CHECK-NEXT: BNE $x12, $x0, %bb.1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.1:
; CHECK-NEXT: PseudoRET
bb.0:
renamable $x11 = COPY $x12
BLTU $x0, renamable $x11, %bb.1
bb.1:
PseudoRET
...
---
name: bgeu
body: |
; CHECK-LABEL: name: bgeu
; CHECK: bb.0:
; CHECK-NEXT: successors: %bb.1(0x80000000)
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: renamable $x11 = COPY $x12
; CHECK-NEXT: BEQ $x12, $x0, %bb.1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.1:
; CHECK-NEXT: PseudoRET
bb.0:
renamable $x11 = COPY $x12
BGEU $x0, renamable $x11, %bb.1
bb.1:
PseudoRET
...
Loading