Skip to content

Commit bee33b5

Browse files
authored
[RISCV][GISel] Support f32/f64 powi. (#117937)
Need to force libcall legalization to treat the integer argument as signed so that it can be promoted to XLen in call lowering for RV64. Alternatively we could promote the operand before converting to libcall, but going through call lowering is closer to what SelectionDAG does.
1 parent 7318654 commit bee33b5

File tree

5 files changed

+91
-5
lines changed

5 files changed

+91
-5
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1290,9 +1290,10 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
12901290
return UnableToLegalize;
12911291
}
12921292
auto Libcall = getRTLibDesc(MI.getOpcode(), Size);
1293-
std::initializer_list<CallLowering::ArgInfo> Args = {
1293+
SmallVector<CallLowering::ArgInfo, 2> Args = {
12941294
{MI.getOperand(1).getReg(), HLTy, 0},
12951295
{MI.getOperand(2).getReg(), ITy, 1}};
1296+
Args[1].Flags[0].setSExt();
12961297
LegalizeResult Status =
12971298
createLibcall(MIRBuilder, Libcall, {MI.getOperand(0).getReg(), HLTy, 0},
12981299
Args, LocObserver, &MI);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
579579
G_FASIN, G_FATAN, G_FATAN2, G_FCOSH, G_FSINH,
580580
G_FTANH})
581581
.libcallFor({s32, s64});
582+
getActionDefinitionsBuilder(G_FPOWI).libcallFor({{s32, s32}, {s64, s32}});
582583

583584
getActionDefinitionsBuilder(G_VASTART).customFor({p0});
584585

llvm/test/CodeGen/RISCV/GlobalISel/double-intrinsics.ll

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,48 @@ define double @sqrt_f64(double %a) nounwind {
3939
ret double %1
4040
}
4141

42+
define double @powi_f64(double %a, i32 %b) nounwind {
43+
; RV32IFD-LABEL: powi_f64:
44+
; RV32IFD: # %bb.0:
45+
; RV32IFD-NEXT: addi sp, sp, -16
46+
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
47+
; RV32IFD-NEXT: call __powidf2
48+
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
49+
; RV32IFD-NEXT: addi sp, sp, 16
50+
; RV32IFD-NEXT: ret
51+
;
52+
; RV64IFD-LABEL: powi_f64:
53+
; RV64IFD: # %bb.0:
54+
; RV64IFD-NEXT: addi sp, sp, -16
55+
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
56+
; RV64IFD-NEXT: sext.w a0, a0
57+
; RV64IFD-NEXT: call __powidf2
58+
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
59+
; RV64IFD-NEXT: addi sp, sp, 16
60+
; RV64IFD-NEXT: ret
61+
;
62+
; RV32I-LABEL: powi_f64:
63+
; RV32I: # %bb.0:
64+
; RV32I-NEXT: addi sp, sp, -16
65+
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
66+
; RV32I-NEXT: call __powidf2
67+
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
68+
; RV32I-NEXT: addi sp, sp, 16
69+
; RV32I-NEXT: ret
70+
;
71+
; RV64I-LABEL: powi_f64:
72+
; RV64I: # %bb.0:
73+
; RV64I-NEXT: addi sp, sp, -16
74+
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
75+
; RV64I-NEXT: sext.w a1, a1
76+
; RV64I-NEXT: call __powidf2
77+
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
78+
; RV64I-NEXT: addi sp, sp, 16
79+
; RV64I-NEXT: ret
80+
%1 = call double @llvm.powi.f64.i32(double %a, i32 %b)
81+
ret double %1
82+
}
83+
4284
declare double @llvm.sin.f64(double)
4385

4486
define double @sin_f64(double %a) nounwind {
@@ -1001,11 +1043,11 @@ define i1 @isnan_d_fpclass(double %x) {
10011043
; RV32I-NEXT: addi a3, a2, -1
10021044
; RV32I-NEXT: lui a2, 524032
10031045
; RV32I-NEXT: and a1, a1, a3
1004-
; RV32I-NEXT: beq a1, a2, .LBB24_2
1046+
; RV32I-NEXT: beq a1, a2, .LBB25_2
10051047
; RV32I-NEXT: # %bb.1:
10061048
; RV32I-NEXT: sltu a0, a2, a1
10071049
; RV32I-NEXT: ret
1008-
; RV32I-NEXT: .LBB24_2:
1050+
; RV32I-NEXT: .LBB25_2:
10091051
; RV32I-NEXT: snez a0, a0
10101052
; RV32I-NEXT: ret
10111053
;

llvm/test/CodeGen/RISCV/GlobalISel/float-intrinsics.ll

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,48 @@ define float @sqrt_f32(float %a) nounwind {
4848
ret float %1
4949
}
5050

51+
define float @powi_f32(float %a, i32 %b) nounwind {
52+
; RV32IF-LABEL: powi_f32:
53+
; RV32IF: # %bb.0:
54+
; RV32IF-NEXT: addi sp, sp, -16
55+
; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
56+
; RV32IF-NEXT: call __powisf2
57+
; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
58+
; RV32IF-NEXT: addi sp, sp, 16
59+
; RV32IF-NEXT: ret
60+
;
61+
; RV64IF-LABEL: powi_f32:
62+
; RV64IF: # %bb.0:
63+
; RV64IF-NEXT: addi sp, sp, -16
64+
; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
65+
; RV64IF-NEXT: sext.w a0, a0
66+
; RV64IF-NEXT: call __powisf2
67+
; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
68+
; RV64IF-NEXT: addi sp, sp, 16
69+
; RV64IF-NEXT: ret
70+
;
71+
; RV32I-LABEL: powi_f32:
72+
; RV32I: # %bb.0:
73+
; RV32I-NEXT: addi sp, sp, -16
74+
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
75+
; RV32I-NEXT: call __powisf2
76+
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
77+
; RV32I-NEXT: addi sp, sp, 16
78+
; RV32I-NEXT: ret
79+
;
80+
; RV64I-LABEL: powi_f32:
81+
; RV64I: # %bb.0:
82+
; RV64I-NEXT: addi sp, sp, -16
83+
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
84+
; RV64I-NEXT: sext.w a1, a1
85+
; RV64I-NEXT: call __powisf2
86+
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
87+
; RV64I-NEXT: addi sp, sp, 16
88+
; RV64I-NEXT: ret
89+
%1 = call float @llvm.powi.f32.i32(float %a, i32 %b)
90+
ret float %1
91+
}
92+
5193
define float @sin_f32(float %a) nounwind {
5294
; RV32IF-LABEL: sin_f32:
5395
; RV32IF: # %bb.0:

llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -481,8 +481,8 @@
481481
# DEBUG-NEXT: .. the first uncovered type index: 1, OK
482482
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
483483
# DEBUG-NEXT: G_FPOWI (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
484-
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
485-
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
484+
# DEBUG-NEXT: .. the first uncovered type index: 2, OK
485+
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
486486
# DEBUG-NEXT: G_FEXP (opcode {{[0-9]+}}): 1 type index, 0 imm indices
487487
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
488488
# DEBUG-NEXT: .. the first uncovered type index: 1, OK

0 commit comments

Comments
 (0)