Skip to content

Commit f623adb

Browse files
[ExpandLargeFpConvert] Fix bug in int-to-fp expansion. (#85370)
When deciding whether to perform rounding on the significand, the generated IR was using (width - leading zeros - 1) rather than (width - leading zeros). This is different from how the routine in compiler-rt does it: int sd = srcBits - clzSrcT(a); int e = sd - 1; if (sd > dstMantDig) { This bug means that the following code, when built on -O0: #include <stdio.h> _BitInt(233) v_1037 = 0; int main(void) { v_1037 = 18014398509481982wb; double d = v_1037; printf("d = %f\n", d); return 0; } prints "d = 9007199254740992.000000", which is incorrect. The correct result is "d = 18014398509481982.000000".
1 parent c7fc95b commit f623adb

File tree

3 files changed

+31
-31
lines changed

3 files changed

+31
-31
lines changed

llvm/lib/CodeGen/ExpandLargeFpConvert.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ static void expandIToFP(Instruction *IToFP) {
375375
Value *Sub2 = Builder.CreateSub(Builder.getIntN(BitWidthNew, BitWidth - 1),
376376
FloatWidth == 128 ? Call : Cast);
377377
Value *Cmp3 = Builder.CreateICmpSGT(
378-
Sub2, Builder.getIntN(BitWidthNew, FPMantissaWidth + 1));
378+
Sub1, Builder.getIntN(BitWidthNew, FPMantissaWidth + 1));
379379
Builder.CreateCondBr(Cmp3, IfThen4, IfElse);
380380

381381
// if.then4:

llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-si129tofp.ll

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ define half @si129tohalf(i129 %a) {
1515
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
1616
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 129, [[TMP5]]
1717
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 128, [[TMP5]]
18-
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP7]], 24
18+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
1919
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
2020
; CHECK: itofp-if-then4:
2121
; CHECK-NEXT: switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
22-
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
23-
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
22+
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
23+
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
2424
; CHECK-NEXT: ]
2525
; CHECK: itofp-sw-bb:
2626
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[TMP3]], 1
@@ -100,12 +100,12 @@ define float @si129tofloat(i129 %a) {
100100
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
101101
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 129, [[TMP5]]
102102
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 128, [[TMP5]]
103-
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP7]], 24
103+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
104104
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
105105
; CHECK: itofp-if-then4:
106106
; CHECK-NEXT: switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
107-
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
108-
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
107+
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
108+
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
109109
; CHECK-NEXT: ]
110110
; CHECK: itofp-sw-bb:
111111
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[TMP3]], 1
@@ -184,12 +184,12 @@ define double @si129todouble(i129 %a) {
184184
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
185185
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 129, [[TMP5]]
186186
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 128, [[TMP5]]
187-
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP7]], 53
187+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 53
188188
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
189189
; CHECK: itofp-if-then4:
190190
; CHECK-NEXT: switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
191-
; CHECK-NEXT: i32 54, label [[ITOFP_SW_BB:%.*]]
192-
; CHECK-NEXT: i32 55, label [[ITOFP_SW_EPILOG:%.*]]
191+
; CHECK-NEXT: i32 54, label [[ITOFP_SW_BB:%.*]]
192+
; CHECK-NEXT: i32 55, label [[ITOFP_SW_EPILOG:%.*]]
193193
; CHECK-NEXT: ]
194194
; CHECK: itofp-sw-bb:
195195
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[TMP3]], 1
@@ -273,12 +273,12 @@ define x86_fp80 @si129tox86_fp80(i129 %a) {
273273
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
274274
; CHECK-NEXT: [[TMP6:%.*]] = sub i129 129, [[TMP4]]
275275
; CHECK-NEXT: [[TMP7:%.*]] = sub i129 128, [[TMP4]]
276-
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i129 [[TMP7]], 113
276+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i129 [[TMP6]], 113
277277
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
278278
; CHECK: itofp-if-then4:
279279
; CHECK-NEXT: switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
280-
; CHECK-NEXT: i129 114, label [[ITOFP_SW_BB:%.*]]
281-
; CHECK-NEXT: i129 115, label [[ITOFP_SW_EPILOG:%.*]]
280+
; CHECK-NEXT: i129 114, label [[ITOFP_SW_BB:%.*]]
281+
; CHECK-NEXT: i129 115, label [[ITOFP_SW_EPILOG:%.*]]
282282
; CHECK-NEXT: ]
283283
; CHECK: itofp-sw-bb:
284284
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[TMP3]], 1
@@ -357,12 +357,12 @@ define fp128 @si129tofp128(i129 %a) {
357357
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
358358
; CHECK-NEXT: [[TMP6:%.*]] = sub i129 129, [[TMP4]]
359359
; CHECK-NEXT: [[TMP7:%.*]] = sub i129 128, [[TMP4]]
360-
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i129 [[TMP7]], 113
360+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i129 [[TMP6]], 113
361361
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
362362
; CHECK: itofp-if-then4:
363363
; CHECK-NEXT: switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
364-
; CHECK-NEXT: i129 114, label [[ITOFP_SW_BB:%.*]]
365-
; CHECK-NEXT: i129 115, label [[ITOFP_SW_EPILOG:%.*]]
364+
; CHECK-NEXT: i129 114, label [[ITOFP_SW_BB:%.*]]
365+
; CHECK-NEXT: i129 115, label [[ITOFP_SW_EPILOG:%.*]]
366366
; CHECK-NEXT: ]
367367
; CHECK: itofp-sw-bb:
368368
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[TMP3]], 1

llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-ui129tofp.ll

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ define half @ui129tohalf(i129 %a) {
1515
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
1616
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 129, [[TMP5]]
1717
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 128, [[TMP5]]
18-
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP7]], 24
18+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
1919
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
2020
; CHECK: itofp-if-then4:
2121
; CHECK-NEXT: switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
22-
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
23-
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
22+
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
23+
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
2424
; CHECK-NEXT: ]
2525
; CHECK: itofp-sw-bb:
2626
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[A]], 1
@@ -100,12 +100,12 @@ define float @ui129tofloat(i129 %a) {
100100
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
101101
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 129, [[TMP5]]
102102
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 128, [[TMP5]]
103-
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP7]], 24
103+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
104104
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
105105
; CHECK: itofp-if-then4:
106106
; CHECK-NEXT: switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
107-
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
108-
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
107+
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
108+
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
109109
; CHECK-NEXT: ]
110110
; CHECK: itofp-sw-bb:
111111
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[A]], 1
@@ -184,12 +184,12 @@ define double @ui129todouble(i129 %a) {
184184
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
185185
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 129, [[TMP5]]
186186
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 128, [[TMP5]]
187-
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP7]], 53
187+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 53
188188
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
189189
; CHECK: itofp-if-then4:
190190
; CHECK-NEXT: switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
191-
; CHECK-NEXT: i32 54, label [[ITOFP_SW_BB:%.*]]
192-
; CHECK-NEXT: i32 55, label [[ITOFP_SW_EPILOG:%.*]]
191+
; CHECK-NEXT: i32 54, label [[ITOFP_SW_BB:%.*]]
192+
; CHECK-NEXT: i32 55, label [[ITOFP_SW_EPILOG:%.*]]
193193
; CHECK-NEXT: ]
194194
; CHECK: itofp-sw-bb:
195195
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[A]], 1
@@ -273,12 +273,12 @@ define x86_fp80 @ui129tox86_fp80(i129 %a) {
273273
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
274274
; CHECK-NEXT: [[TMP6:%.*]] = sub i129 129, [[TMP4]]
275275
; CHECK-NEXT: [[TMP7:%.*]] = sub i129 128, [[TMP4]]
276-
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i129 [[TMP7]], 113
276+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i129 [[TMP6]], 113
277277
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
278278
; CHECK: itofp-if-then4:
279279
; CHECK-NEXT: switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
280-
; CHECK-NEXT: i129 114, label [[ITOFP_SW_BB:%.*]]
281-
; CHECK-NEXT: i129 115, label [[ITOFP_SW_EPILOG:%.*]]
280+
; CHECK-NEXT: i129 114, label [[ITOFP_SW_BB:%.*]]
281+
; CHECK-NEXT: i129 115, label [[ITOFP_SW_EPILOG:%.*]]
282282
; CHECK-NEXT: ]
283283
; CHECK: itofp-sw-bb:
284284
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[A]], 1
@@ -357,12 +357,12 @@ define fp128 @ui129tofp128(i129 %a) {
357357
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
358358
; CHECK-NEXT: [[TMP6:%.*]] = sub i129 129, [[TMP4]]
359359
; CHECK-NEXT: [[TMP7:%.*]] = sub i129 128, [[TMP4]]
360-
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i129 [[TMP7]], 113
360+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i129 [[TMP6]], 113
361361
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
362362
; CHECK: itofp-if-then4:
363363
; CHECK-NEXT: switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
364-
; CHECK-NEXT: i129 114, label [[ITOFP_SW_BB:%.*]]
365-
; CHECK-NEXT: i129 115, label [[ITOFP_SW_EPILOG:%.*]]
364+
; CHECK-NEXT: i129 114, label [[ITOFP_SW_BB:%.*]]
365+
; CHECK-NEXT: i129 115, label [[ITOFP_SW_EPILOG:%.*]]
366366
; CHECK-NEXT: ]
367367
; CHECK: itofp-sw-bb:
368368
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[A]], 1

0 commit comments

Comments
 (0)