Skip to content

Commit 972df2c

Browse files
committed
[RISCV][GISel] Emit G_CONSTANT 0 as a copy from X0. (#67202)
We need to use a COPY so the register coalescer can replace reads of the register we copy to with X0. This is needed so that we use X0 on instructions that don't have an immediate form. This was reviewed as #67202.
1 parent 7cd01af commit 972df2c

File tree

4 files changed

+21
-23
lines changed

4 files changed

+21
-23
lines changed

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,7 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
228228
MI.setDesc(TII.get(TargetOpcode::COPY));
229229
return true;
230230
case TargetOpcode::G_CONSTANT:
231-
if (!selectConstant(MI, MIB, MRI))
232-
return false;
233-
break;
231+
return selectConstant(MI, MIB, MRI);
234232
case TargetOpcode::G_BRCOND: {
235233
// TODO: Fold with G_ICMP.
236234
auto Bcc =
@@ -242,10 +240,6 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
242240
default:
243241
return false;
244242
}
245-
246-
MI.eraseFromParent();
247-
248-
return true;
249243
}
250244

251245
void RISCVInstructionSelector::renderNegImm(MachineInstrBuilder &MIB,
@@ -312,6 +306,13 @@ bool RISCVInstructionSelector::selectConstant(MachineInstr &MI,
312306
Register FinalReg = MI.getOperand(0).getReg();
313307
int64_t Imm = MI.getOperand(1).getCImm()->getSExtValue();
314308

309+
if (Imm == 0) {
310+
MI.getOperand(1).ChangeToRegister(RISCV::X0, false);
311+
RBI.constrainGenericRegister(FinalReg, RISCV::GPRRegClass, MRI);
312+
MI.setDesc(TII.get(TargetOpcode::COPY));
313+
return true;
314+
}
315+
315316
RISCVMatInt::InstSeq Seq =
316317
RISCVMatInt::generateInstSeq(Imm, Subtarget->getFeatureBits());
317318
unsigned NumInsts = Seq.size();
@@ -358,6 +359,7 @@ bool RISCVInstructionSelector::selectConstant(MachineInstr &MI,
358359
SrcReg = DstReg;
359360
}
360361

362+
MI.eraseFromParent();
361363
return true;
362364
}
363365

llvm/test/CodeGen/RISCV/GlobalISel/alu-roundtrip.ll

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,12 @@ entry:
133133
define i32 @neg_i32(i32 %a) {
134134
; RV32IM-LABEL: neg_i32:
135135
; RV32IM: # %bb.0: # %entry
136-
; RV32IM-NEXT: li a1, 0
137-
; RV32IM-NEXT: sub a0, a1, a0
136+
; RV32IM-NEXT: neg a0, a0
138137
; RV32IM-NEXT: ret
139138
;
140139
; RV64IM-LABEL: neg_i32:
141140
; RV64IM: # %bb.0: # %entry
142-
; RV64IM-NEXT: li a1, 0
143-
; RV64IM-NEXT: subw a0, a1, a0
141+
; RV64IM-NEXT: negw a0, a0
144142
; RV64IM-NEXT: ret
145143
entry:
146144
%0 = sub i32 0, %a
@@ -481,18 +479,16 @@ entry:
481479
define i64 @neg_i64(i64 %a) {
482480
; RV32IM-LABEL: neg_i64:
483481
; RV32IM: # %bb.0: # %entry
484-
; RV32IM-NEXT: li a3, 0
485-
; RV32IM-NEXT: sub a2, a3, a0
486-
; RV32IM-NEXT: sltu a0, a3, a0
487-
; RV32IM-NEXT: sub a1, a3, a1
482+
; RV32IM-NEXT: neg a2, a0
483+
; RV32IM-NEXT: snez a0, a0
484+
; RV32IM-NEXT: neg a1, a1
488485
; RV32IM-NEXT: sub a1, a1, a0
489486
; RV32IM-NEXT: mv a0, a2
490487
; RV32IM-NEXT: ret
491488
;
492489
; RV64IM-LABEL: neg_i64:
493490
; RV64IM: # %bb.0: # %entry
494-
; RV64IM-NEXT: li a1, 0
495-
; RV64IM-NEXT: sub a0, a1, a0
491+
; RV64IM-NEXT: neg a0, a0
496492
; RV64IM-NEXT: ret
497493
entry:
498494
%0 = sub i64 0, %a

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/constant32.mir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ body: |
115115
; CHECK-LABEL: name: const_i32_0
116116
; CHECK: liveins: $x10
117117
; CHECK-NEXT: {{ $}}
118-
; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 0
119-
; CHECK-NEXT: $x10 = COPY [[ADDI]]
118+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0
119+
; CHECK-NEXT: $x10 = COPY [[COPY]]
120120
; CHECK-NEXT: PseudoRET implicit $x10
121121
%0:gprb(s32) = G_CONSTANT i32 0
122122
$x10 = COPY %0(s32)

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/constant64.mir

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ body: |
118118
; CHECK-LABEL: name: const_i64_0
119119
; CHECK: liveins: $x10
120120
; CHECK-NEXT: {{ $}}
121-
; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 0
122-
; CHECK-NEXT: $x10 = COPY [[ADDI]]
121+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0
122+
; CHECK-NEXT: $x10 = COPY [[COPY]]
123123
; CHECK-NEXT: PseudoRET implicit $x10
124124
%0:gprb(s64) = G_CONSTANT i64 0
125125
$x10 = COPY %0(s64)
@@ -245,8 +245,8 @@ body: |
245245
; CHECK-LABEL: name: const_i32_0
246246
; CHECK: liveins: $x10
247247
; CHECK-NEXT: {{ $}}
248-
; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 0
249-
; CHECK-NEXT: $x10 = COPY [[ADDI]]
248+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0
249+
; CHECK-NEXT: $x10 = COPY [[COPY]]
250250
; CHECK-NEXT: PseudoRET implicit $x10
251251
%0:gprb(s32) = G_CONSTANT i32 0
252252
%1:gprb(s64) = G_ANYEXT %0(s32)

0 commit comments

Comments
 (0)