Skip to content

Commit 9681b01

Browse files
committed
[RISCV] Add DAGCombine for (SplitF64 (ConstantFP x))
The SplitF64 node is used on RV32D to convert an f64 directly to a pair of i32 (necessary as bitcasting to i64 isn't legal). When performed on a ConstantFP, this will result in a FP load from the constant pool followed by a store to the stack and two integer loads from the stack (necessary as there is no way to directly move between f64 FPRs and i32 GPRs on RV32D). It's always cheaper to just materialise integers for the lo and hi parts of the FP constant, so do that instead. llvm-svn: 357341
1 parent d880de2 commit 9681b01

File tree

4 files changed

+40
-47
lines changed

4 files changed

+40
-47
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,17 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
633633
return DCI.CombineTo(N, Op0.getOperand(0), Op0.getOperand(1));
634634

635635
SDLoc DL(N);
636+
637+
// It's cheaper to materialise two 32-bit integers than to load a double
638+
// from the constant pool and transfer it to integer registers through the
639+
// stack.
640+
if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op0)) {
641+
APInt V = C->getValueAPF().bitcastToAPInt();
642+
SDValue Lo = DAG.getConstant(V.trunc(32), DL, MVT::i32);
643+
SDValue Hi = DAG.getConstant(V.lshr(32).trunc(32), DL, MVT::i32);
644+
return DCI.CombineTo(N, Lo, Hi);
645+
}
646+
636647
// This is a target-specific version of a DAGCombine performed in
637648
// DAGCombiner::visitBITCAST. It performs the equivalent of:
638649
// fold (bitconvert (fneg x)) -> (xor (bitconvert x), signbit)

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

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,13 @@ define double @caller_double_inreg() nounwind {
3434
; RV32IFD: # %bb.0:
3535
; RV32IFD-NEXT: addi sp, sp, -16
3636
; RV32IFD-NEXT: sw ra, 12(sp)
37-
; RV32IFD-NEXT: lui a0, %hi(.LCPI1_0)
38-
; RV32IFD-NEXT: addi a0, a0, %lo(.LCPI1_0)
39-
; RV32IFD-NEXT: fld ft0, 0(a0)
40-
; RV32IFD-NEXT: lui a0, %hi(.LCPI1_1)
41-
; RV32IFD-NEXT: addi a0, a0, %lo(.LCPI1_1)
42-
; RV32IFD-NEXT: fld ft1, 0(a0)
43-
; RV32IFD-NEXT: fsd ft1, 0(sp)
44-
; RV32IFD-NEXT: lw a0, 0(sp)
45-
; RV32IFD-NEXT: lw a1, 4(sp)
46-
; RV32IFD-NEXT: fsd ft0, 0(sp)
47-
; RV32IFD-NEXT: lw a2, 0(sp)
48-
; RV32IFD-NEXT: lw a3, 4(sp)
37+
; RV32IFD-NEXT: lui a0, 262236
38+
; RV32IFD-NEXT: addi a1, a0, 655
39+
; RV32IFD-NEXT: lui a0, 377487
40+
; RV32IFD-NEXT: addi a0, a0, 1475
41+
; RV32IFD-NEXT: lui a2, 262364
42+
; RV32IFD-NEXT: addi a3, a2, 655
43+
; RV32IFD-NEXT: mv a2, a0
4944
; RV32IFD-NEXT: call callee_double_inreg
5045
; RV32IFD-NEXT: lw ra, 12(sp)
5146
; RV32IFD-NEXT: addi sp, sp, 16
@@ -78,29 +73,24 @@ define double @callee_double_split_reg_stack(i32 %a, i64 %b, i64 %c, double %d,
7873
define double @caller_double_split_reg_stack() nounwind {
7974
; RV32IFD-LABEL: caller_double_split_reg_stack:
8075
; RV32IFD: # %bb.0:
81-
; RV32IFD-NEXT: addi sp, sp, -32
82-
; RV32IFD-NEXT: sw ra, 28(sp)
83-
; RV32IFD-NEXT: lui a0, %hi(.LCPI3_0)
84-
; RV32IFD-NEXT: addi a0, a0, %lo(.LCPI3_0)
85-
; RV32IFD-NEXT: fld ft0, 0(a0)
86-
; RV32IFD-NEXT: fsd ft0, 16(sp)
87-
; RV32IFD-NEXT: lw a7, 16(sp)
88-
; RV32IFD-NEXT: lw a0, 20(sp)
76+
; RV32IFD-NEXT: addi sp, sp, -16
77+
; RV32IFD-NEXT: sw ra, 12(sp)
78+
; RV32IFD-NEXT: lui a0, 262510
79+
; RV32IFD-NEXT: addi a0, a0, 327
8980
; RV32IFD-NEXT: sw a0, 0(sp)
90-
; RV32IFD-NEXT: lui a0, %hi(.LCPI3_1)
91-
; RV32IFD-NEXT: addi a0, a0, %lo(.LCPI3_1)
92-
; RV32IFD-NEXT: fld ft0, 0(a0)
93-
; RV32IFD-NEXT: fsd ft0, 16(sp)
94-
; RV32IFD-NEXT: lw a5, 16(sp)
95-
; RV32IFD-NEXT: lw a6, 20(sp)
81+
; RV32IFD-NEXT: lui a0, 262446
82+
; RV32IFD-NEXT: addi a6, a0, 327
83+
; RV32IFD-NEXT: lui a0, 713032
84+
; RV32IFD-NEXT: addi a5, a0, -1311
9685
; RV32IFD-NEXT: addi a0, zero, 1
9786
; RV32IFD-NEXT: addi a1, zero, 2
9887
; RV32IFD-NEXT: mv a2, zero
9988
; RV32IFD-NEXT: addi a3, zero, 3
10089
; RV32IFD-NEXT: mv a4, zero
90+
; RV32IFD-NEXT: mv a7, a5
10191
; RV32IFD-NEXT: call callee_double_split_reg_stack
102-
; RV32IFD-NEXT: lw ra, 28(sp)
103-
; RV32IFD-NEXT: addi sp, sp, 32
92+
; RV32IFD-NEXT: lw ra, 12(sp)
93+
; RV32IFD-NEXT: addi sp, sp, 16
10494
; RV32IFD-NEXT: ret
10595
%1 = call double @callee_double_split_reg_stack(i32 1, i64 2, i64 3, double 4.72, double 5.72)
10696
ret double %1

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,10 @@ define double @double_imm() nounwind {
1010
;
1111
; RV32IFD-LABEL: double_imm:
1212
; RV32IFD: # %bb.0:
13-
; RV32IFD-NEXT: addi sp, sp, -16
14-
; RV32IFD-NEXT: lui a0, %hi(.LCPI0_0)
15-
; RV32IFD-NEXT: addi a0, a0, %lo(.LCPI0_0)
16-
; RV32IFD-NEXT: fld ft0, 0(a0)
17-
; RV32IFD-NEXT: fsd ft0, 8(sp)
18-
; RV32IFD-NEXT: lw a0, 8(sp)
19-
; RV32IFD-NEXT: lw a1, 12(sp)
20-
; RV32IFD-NEXT: addi sp, sp, 16
13+
; RV32IFD-NEXT: lui a0, 345155
14+
; RV32IFD-NEXT: addi a0, a0, -744
15+
; RV32IFD-NEXT: lui a1, 262290
16+
; RV32IFD-NEXT: addi a1, a1, 507
2117
; RV32IFD-NEXT: ret
2218
;
2319
; RV64IFD-LABEL: double_imm:

llvm/test/CodeGen/RISCV/double-previous-failure.ll

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,20 @@ define i32 @main() nounwind {
1717
; RV32IFD: # %bb.0: # %entry
1818
; RV32IFD-NEXT: addi sp, sp, -16
1919
; RV32IFD-NEXT: sw ra, 12(sp)
20-
; RV32IFD-NEXT: lui a0, %hi(.LCPI1_0)
21-
; RV32IFD-NEXT: addi a0, a0, %lo(.LCPI1_0)
22-
; RV32IFD-NEXT: fld ft0, 0(a0)
23-
; RV32IFD-NEXT: fsd ft0, 0(sp)
24-
; RV32IFD-NEXT: lw a0, 0(sp)
25-
; RV32IFD-NEXT: lw a1, 4(sp)
20+
; RV32IFD-NEXT: mv a0, zero
21+
; RV32IFD-NEXT: lui a1, 262144
2622
; RV32IFD-NEXT: call test
27-
; RV32IFD-NEXT: lui a2, %hi(.LCPI1_1)
28-
; RV32IFD-NEXT: addi a2, a2, %lo(.LCPI1_1)
29-
; RV32IFD-NEXT: fld ft1, 0(a2)
3023
; RV32IFD-NEXT: sw a0, 0(sp)
3124
; RV32IFD-NEXT: sw a1, 4(sp)
3225
; RV32IFD-NEXT: fld ft0, 0(sp)
26+
; RV32IFD-NEXT: lui a0, %hi(.LCPI1_0)
27+
; RV32IFD-NEXT: addi a0, a0, %lo(.LCPI1_0)
28+
; RV32IFD-NEXT: fld ft1, 0(a0)
3329
; RV32IFD-NEXT: flt.d a0, ft0, ft1
3430
; RV32IFD-NEXT: bnez a0, .LBB1_3
3531
; RV32IFD-NEXT: # %bb.1: # %entry
36-
; RV32IFD-NEXT: lui a0, %hi(.LCPI1_2)
37-
; RV32IFD-NEXT: addi a0, a0, %lo(.LCPI1_2)
32+
; RV32IFD-NEXT: lui a0, %hi(.LCPI1_1)
33+
; RV32IFD-NEXT: addi a0, a0, %lo(.LCPI1_1)
3834
; RV32IFD-NEXT: fld ft1, 0(a0)
3935
; RV32IFD-NEXT: flt.d a0, ft1, ft0
4036
; RV32IFD-NEXT: xori a0, a0, 1

0 commit comments

Comments
 (0)