Skip to content

Commit ba1d901

Browse files
authored
[RISCV] Set mayRaiseFPException = 0 on FCVT_D_W(U). (#133200)
The input is an integer which can't be NAN so the NV(invalid) exception can't be raised. The conversion is exact so it can't raise NX(inexact), UF(underflow), or OF(overflow). The instructions are not divide so they can't raise DZ(divide by zero). Fixes #133192.
1 parent 38d9a44 commit ba1d901

File tree

4 files changed

+16
-13
lines changed

4 files changed

+16
-13
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoD.td

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,14 @@ foreach Ext = DExts in {
144144
"fcvt.wu.d">,
145145
Sched<[WriteFCvtF64ToI32, ReadFCvtF64ToI32]>;
146146

147-
defm FCVT_D_W : FPUnaryOp_r_frmlegacy_m<0b1101001, 0b00000, Ext, Ext.PrimaryTy, GPR,
148-
"fcvt.d.w">,
147+
let mayRaiseFPException = 0 in
148+
defm FCVT_D_W : FPUnaryOp_r_frmlegacy_m<0b1101001, 0b00000, Ext,
149+
Ext.PrimaryTy, GPR, "fcvt.d.w">,
149150
Sched<[WriteFCvtI32ToF64, ReadFCvtI32ToF64]>;
150151

151-
defm FCVT_D_WU : FPUnaryOp_r_frmlegacy_m<0b1101001, 0b00001, Ext, Ext.PrimaryTy, GPR,
152-
"fcvt.d.wu">,
152+
let mayRaiseFPException = 0 in
153+
defm FCVT_D_WU : FPUnaryOp_r_frmlegacy_m<0b1101001, 0b00001, Ext,
154+
Ext.PrimaryTy, GPR, "fcvt.d.wu">,
153155
Sched<[WriteFCvtI32ToF64, ReadFCvtI32ToF64]>;
154156
} // foreach Ext = DExts
155157

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/itofp-rv32.mir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ body: |
5959
; CHECK: liveins: $x10
6060
; CHECK-NEXT: {{ $}}
6161
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
62-
; CHECK-NEXT: [[FCVT_D_W:%[0-9]+]]:fpr64 = nofpexcept FCVT_D_W [[COPY]], 0
62+
; CHECK-NEXT: [[FCVT_D_W:%[0-9]+]]:fpr64 = FCVT_D_W [[COPY]], 0
6363
; CHECK-NEXT: $f10_d = COPY [[FCVT_D_W]]
6464
; CHECK-NEXT: PseudoRET implicit $f10_d
6565
%0:gprb(s32) = COPY $x10
@@ -81,7 +81,7 @@ body: |
8181
; CHECK: liveins: $x10
8282
; CHECK-NEXT: {{ $}}
8383
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
84-
; CHECK-NEXT: [[FCVT_D_WU:%[0-9]+]]:fpr64 = nofpexcept FCVT_D_WU [[COPY]], 0
84+
; CHECK-NEXT: [[FCVT_D_WU:%[0-9]+]]:fpr64 = FCVT_D_WU [[COPY]], 0
8585
; CHECK-NEXT: $f10_d = COPY [[FCVT_D_WU]]
8686
; CHECK-NEXT: PseudoRET implicit $f10_d
8787
%0:gprb(s32) = COPY $x10

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ define dso_local double @negzero_sel(i16 noundef %a, double noundef %d) nounwind
123123
; CHECK32D-LABEL: negzero_sel:
124124
; CHECK32D: # %bb.0: # %entry
125125
; CHECK32D-NEXT: slli a0, a0, 16
126-
; CHECK32D-NEXT: fcvt.d.w fa5, zero
127126
; CHECK32D-NEXT: beqz a0, .LBB4_2
128127
; CHECK32D-NEXT: # %bb.1: # %entry
128+
; CHECK32D-NEXT: fcvt.d.w fa5, zero
129129
; CHECK32D-NEXT: fneg.d fa0, fa5
130130
; CHECK32D-NEXT: .LBB4_2: # %entry
131131
; CHECK32D-NEXT: ret
@@ -143,10 +143,10 @@ define dso_local double @negzero_sel(i16 noundef %a, double noundef %d) nounwind
143143
; CHECKRV32ZDINX-LABEL: negzero_sel:
144144
; CHECKRV32ZDINX: # %bb.0: # %entry
145145
; CHECKRV32ZDINX-NEXT: slli a0, a0, 16
146-
; CHECKRV32ZDINX-NEXT: fcvt.d.w a4, zero
147146
; CHECKRV32ZDINX-NEXT: beqz a0, .LBB4_2
148147
; CHECKRV32ZDINX-NEXT: # %bb.1: # %entry
149-
; CHECKRV32ZDINX-NEXT: fneg.d a2, a4
148+
; CHECKRV32ZDINX-NEXT: fcvt.d.w a0, zero
149+
; CHECKRV32ZDINX-NEXT: fneg.d a2, a0
150150
; CHECKRV32ZDINX-NEXT: j .LBB4_3
151151
; CHECKRV32ZDINX-NEXT: .LBB4_2:
152152
; CHECKRV32ZDINX-NEXT: mv a3, a2

llvm/test/CodeGen/RISCV/frm-dependency.ll

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,17 @@ define double @fcvt_d_w(i32 %a) nounwind {
8787
; RV32IF-NEXT: liveins: $x10
8888
; RV32IF-NEXT: {{ $}}
8989
; RV32IF-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
90-
; RV32IF-NEXT: %1:fpr64 = nofpexcept FCVT_D_W [[COPY]]
91-
; RV32IF-NEXT: $f10_d = COPY %1
90+
; RV32IF-NEXT: [[FCVT_D_W:%[0-9]+]]:fpr64 = FCVT_D_W [[COPY]], 0
91+
; RV32IF-NEXT: $f10_d = COPY [[FCVT_D_W]]
9292
; RV32IF-NEXT: PseudoRET implicit $f10_d
93+
;
9394
; RV64IF-LABEL: name: fcvt_d_w
9495
; RV64IF: bb.0 (%ir-block.0):
9596
; RV64IF-NEXT: liveins: $x10
9697
; RV64IF-NEXT: {{ $}}
9798
; RV64IF-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
98-
; RV64IF-NEXT: %1:fpr64 = nofpexcept FCVT_D_W [[COPY]]
99-
; RV64IF-NEXT: $f10_d = COPY %1
99+
; RV64IF-NEXT: [[FCVT_D_W:%[0-9]+]]:fpr64 = FCVT_D_W [[COPY]], 0
100+
; RV64IF-NEXT: $f10_d = COPY [[FCVT_D_W]]
100101
; RV64IF-NEXT: PseudoRET implicit $f10_d
101102
%1 = sitofp i32 %a to double
102103
ret double %1

0 commit comments

Comments
 (0)