Skip to content

Commit 688843b

Browse files
authored
[RISCV] Add constant folding combine for FMV_X_ANYEXTW/H. (llvm#106653)
1 parent 9a0030e commit 688843b

File tree

4 files changed

+29
-19
lines changed

4 files changed

+29
-19
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16440,6 +16440,13 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
1644016440
SDLoc DL(N);
1644116441
SDValue Op0 = N->getOperand(0);
1644216442
MVT VT = N->getSimpleValueType(0);
16443+
16444+
// Constant fold.
16445+
if (auto *CFP = dyn_cast<ConstantFPSDNode>(Op0)) {
16446+
APInt Val = CFP->getValueAPF().bitcastToAPInt().sext(VT.getSizeInBits());
16447+
return DAG.getConstant(Val, DL, VT);
16448+
}
16449+
1644316450
// If the input to FMV_X_ANYEXTW_RV64 is just FMV_W_X_RV64 then the
1644416451
// conversion is unnecessary and can be replaced with the FMV_W_X_RV64
1644516452
// operand. Similar for FMV_X_ANYEXTH and FMV_H_X.

llvm/test/CodeGen/RISCV/calling-conv-half.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,8 @@ define i32 @caller_half_in_regs() nounwind {
161161
; RV64IF: # %bb.0:
162162
; RV64IF-NEXT: addi sp, sp, -16
163163
; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
164-
; RV64IF-NEXT: lui a0, 1048564
165-
; RV64IF-NEXT: fmv.w.x fa5, a0
166-
; RV64IF-NEXT: fmv.x.w a1, fa5
167164
; RV64IF-NEXT: li a0, 1
165+
; RV64IF-NEXT: lui a1, 1048564
168166
; RV64IF-NEXT: call callee_half_in_regs
169167
; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
170168
; RV64IF-NEXT: addi sp, sp, 16
@@ -511,9 +509,8 @@ define half @callee_half_ret() nounwind {
511509
;
512510
; RV64IF-LABEL: callee_half_ret:
513511
; RV64IF: # %bb.0:
514-
; RV64IF-NEXT: lui a0, %hi(.LCPI4_0)
515-
; RV64IF-NEXT: flw fa5, %lo(.LCPI4_0)(a0)
516-
; RV64IF-NEXT: fmv.x.w a0, fa5
512+
; RV64IF-NEXT: lui a0, 1048564
513+
; RV64IF-NEXT: addiw a0, a0, -1024
517514
; RV64IF-NEXT: ret
518515
;
519516
; RV32-ILP32F-LABEL: callee_half_ret:

llvm/test/CodeGen/RISCV/float-imm.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ define float @float_imm() nounwind {
2424
;
2525
; RV64ZFINX-LABEL: float_imm:
2626
; RV64ZFINX: # %bb.0:
27-
; RV64ZFINX-NEXT: lui a0, %hi(.LCPI0_0)
28-
; RV64ZFINX-NEXT: lw a0, %lo(.LCPI0_0)(a0)
27+
; RV64ZFINX-NEXT: lui a0, 263313
28+
; RV64ZFINX-NEXT: addiw a0, a0, -37
2929
; RV64ZFINX-NEXT: ret
3030
ret float 3.14159274101257324218750
3131
}

llvm/test/CodeGen/RISCV/half-imm.ll

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
; RUN: -target-abi lp64f < %s | FileCheck -check-prefixes=CHECKIZFHMIN %s
1616
; RUN: llc -mtriple=riscv32 -mattr=+zhinxmin -verify-machineinstrs \
1717
; RUN: -target-abi ilp32 < %s \
18-
; RUN: | FileCheck -check-prefixes=CHECKIZHINXMIN %s
18+
; RUN: | FileCheck -check-prefixes=CHECKIZHINXMIN,RV32IZHINXMIN %s
1919
; RUN: llc -mtriple=riscv64 -mattr=+zhinxmin -verify-machineinstrs \
2020
; RUN: -target-abi lp64 < %s \
21-
; RUN: | FileCheck -check-prefixes=CHECKIZHINXMIN %s
21+
; RUN: | FileCheck -check-prefixes=CHECKIZHINXMIN,RV64IZHINXMIN %s
2222

2323
; TODO: constant pool shouldn't be necessary for RV32IZfh and RV64IZfh
2424
define half @half_imm() nounwind {
@@ -30,14 +30,14 @@ define half @half_imm() nounwind {
3030
;
3131
; RV32IZHINX-LABEL: half_imm:
3232
; RV32IZHINX: # %bb.0:
33-
; RV32IZHINX-NEXT: lui a0, %hi(.LCPI0_0)
34-
; RV32IZHINX-NEXT: lh a0, %lo(.LCPI0_0)(a0)
33+
; RV32IZHINX-NEXT: lui a0, 4
34+
; RV32IZHINX-NEXT: addi a0, a0, 512
3535
; RV32IZHINX-NEXT: ret
3636
;
3737
; RV64IZHINX-LABEL: half_imm:
3838
; RV64IZHINX: # %bb.0:
39-
; RV64IZHINX-NEXT: lui a0, %hi(.LCPI0_0)
40-
; RV64IZHINX-NEXT: lh a0, %lo(.LCPI0_0)(a0)
39+
; RV64IZHINX-NEXT: lui a0, 4
40+
; RV64IZHINX-NEXT: addiw a0, a0, 512
4141
; RV64IZHINX-NEXT: ret
4242
;
4343
; CHECKIZFHMIN-LABEL: half_imm:
@@ -46,11 +46,17 @@ define half @half_imm() nounwind {
4646
; CHECKIZFHMIN-NEXT: flh fa0, %lo(.LCPI0_0)(a0)
4747
; CHECKIZFHMIN-NEXT: ret
4848
;
49-
; CHECKIZHINXMIN-LABEL: half_imm:
50-
; CHECKIZHINXMIN: # %bb.0:
51-
; CHECKIZHINXMIN-NEXT: lui a0, %hi(.LCPI0_0)
52-
; CHECKIZHINXMIN-NEXT: lh a0, %lo(.LCPI0_0)(a0)
53-
; CHECKIZHINXMIN-NEXT: ret
49+
; RV32IZHINXMIN-LABEL: half_imm:
50+
; RV32IZHINXMIN: # %bb.0:
51+
; RV32IZHINXMIN-NEXT: lui a0, 4
52+
; RV32IZHINXMIN-NEXT: addi a0, a0, 512
53+
; RV32IZHINXMIN-NEXT: ret
54+
;
55+
; RV64IZHINXMIN-LABEL: half_imm:
56+
; RV64IZHINXMIN: # %bb.0:
57+
; RV64IZHINXMIN-NEXT: lui a0, 4
58+
; RV64IZHINXMIN-NEXT: addiw a0, a0, 512
59+
; RV64IZHINXMIN-NEXT: ret
5460
ret half 3.0
5561
}
5662

0 commit comments

Comments
 (0)