Skip to content

Commit 9d55563

Browse files
authored
[RISCV][GISel] Remove unnecessary copy from X0 in G_FCONSTANT selection. (#158429)
Instead of calling materializeImm, just assign GPRReg to X0. While there, move conversion to APInt to only where it is necessary.
1 parent 4a11cce commit 9d55563

File tree

3 files changed

+14
-11
lines changed

3 files changed

+14
-11
lines changed

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -738,12 +738,17 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
738738
// TODO: Use constant pool for complex constants.
739739
Register DstReg = MI.getOperand(0).getReg();
740740
const APFloat &FPimm = MI.getOperand(1).getFPImm()->getValueAPF();
741-
APInt Imm = FPimm.bitcastToAPInt();
742741
unsigned Size = MRI->getType(DstReg).getSizeInBits();
743742
if (Size == 16 || Size == 32 || (Size == 64 && Subtarget->is64Bit())) {
744-
Register GPRReg = MRI->createVirtualRegister(&RISCV::GPRRegClass);
745-
if (!materializeImm(GPRReg, Imm.getSExtValue(), MIB))
746-
return false;
743+
Register GPRReg;
744+
if (FPimm.isPosZero()) {
745+
GPRReg = RISCV::X0;
746+
} else {
747+
GPRReg = MRI->createVirtualRegister(&RISCV::GPRRegClass);
748+
APInt Imm = FPimm.bitcastToAPInt();
749+
if (!materializeImm(GPRReg, Imm.getSExtValue(), MIB))
750+
return false;
751+
}
747752

748753
unsigned Opcode = Size == 64 ? RISCV::FMV_D_X
749754
: Size == 32 ? RISCV::FMV_W_X
@@ -756,7 +761,7 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
756761
assert(Size == 64 && !Subtarget->is64Bit() &&
757762
"Unexpected size or subtarget");
758763

759-
if (Imm.isNonNegative() && Imm.isZero()) {
764+
if (FPimm.isPosZero()) {
760765
// Optimize +0.0 to use fcvt.d.w
761766
MachineInstrBuilder FCVT =
762767
MIB.buildInstr(RISCV::FCVT_D_W, {DstReg}, {Register(RISCV::X0)})
@@ -771,6 +776,7 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
771776
// Split into two pieces and build through the stack.
772777
Register GPRRegHigh = MRI->createVirtualRegister(&RISCV::GPRRegClass);
773778
Register GPRRegLow = MRI->createVirtualRegister(&RISCV::GPRRegClass);
779+
APInt Imm = FPimm.bitcastToAPInt();
774780
if (!materializeImm(GPRRegHigh, Imm.extractBits(32, 32).getSExtValue(),
775781
MIB))
776782
return false;

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/fp-constant-f16.mir

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ body: |
5757
; CHECK-LABEL: name: half_positive_zero
5858
; CHECK: liveins: $x10
5959
; CHECK-NEXT: {{ $}}
60-
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0
61-
; CHECK-NEXT: [[FMV_H_X:%[0-9]+]]:fpr16 = FMV_H_X [[COPY]]
60+
; CHECK-NEXT: [[FMV_H_X:%[0-9]+]]:fpr16 = FMV_H_X $x0
6261
; CHECK-NEXT: $f10_h = COPY [[FMV_H_X]]
6362
; CHECK-NEXT: PseudoRET implicit $f10_h
6463
%1:fprb(s16) = G_FCONSTANT half 0.000000e+00

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/fp-constant.mir

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ body: |
5656
; CHECK-LABEL: name: float_positive_zero
5757
; CHECK: liveins: $x10
5858
; CHECK-NEXT: {{ $}}
59-
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0
60-
; CHECK-NEXT: [[FMV_W_X:%[0-9]+]]:fpr32 = FMV_W_X [[COPY]]
59+
; CHECK-NEXT: [[FMV_W_X:%[0-9]+]]:fpr32 = FMV_W_X $x0
6160
; CHECK-NEXT: $f10_f = COPY [[FMV_W_X]]
6261
; CHECK-NEXT: PseudoRET implicit $f10_f
6362
%1:fprb(s32) = G_FCONSTANT float 0.000000e+00
@@ -171,8 +170,7 @@ body: |
171170
; RV64-LABEL: name: double_positive_zero
172171
; RV64: liveins: $x10
173172
; RV64-NEXT: {{ $}}
174-
; RV64-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0
175-
; RV64-NEXT: [[FMV_D_X:%[0-9]+]]:fpr64 = FMV_D_X [[COPY]]
173+
; RV64-NEXT: [[FMV_D_X:%[0-9]+]]:fpr64 = FMV_D_X $x0
176174
; RV64-NEXT: $f10_d = COPY [[FMV_D_X]]
177175
; RV64-NEXT: PseudoRET implicit $f10_d
178176
%1:fprb(s64) = G_FCONSTANT double 0.000000e+00

0 commit comments

Comments
 (0)