Skip to content

Commit 43a4442

Browse files
authored
[ExpandFp] Fix incorrect ConstantInt construction (#171861)
Explicitly cast the value to (int) before negating, so it gets properly sign extended. Otherwise we end up with a large unsigned value instead of a negative value for large bit widths. This was found while working on #171456.
1 parent 3383004 commit 43a4442

File tree

3 files changed

+5
-5
lines changed

3 files changed

+5
-5
lines changed

llvm/lib/CodeGen/ExpandFp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,7 @@ static void expandIToFP(Instruction *IToFP) {
811811
Value *Sub24 = Builder.CreateAdd(
812812
FloatWidth == 128 ? Call : Cast,
813813
ConstantInt::getSigned(Builder.getIntNTy(BitWidthNew),
814-
-(BitWidth - FPMantissaWidth - 1)));
814+
-(int)(BitWidth - FPMantissaWidth - 1)));
815815
Value *ShProm25 = Builder.CreateZExt(Sub24, IntTy);
816816
Value *Shl26 = Builder.CreateShl(IsSigned ? Sub : IntVal,
817817
FloatWidth == 128 ? Sub24 : ShProm25);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ define x86_fp80 @si129tox86_fp80(i129 %a) {
315315
; CHECK-NEXT: [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
316316
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
317317
; CHECK: itofp-if-else:
318-
; CHECK-NEXT: [[TMP34:%.*]] = add i129 [[TMP4]], 4294967280
318+
; CHECK-NEXT: [[TMP34:%.*]] = add i129 [[TMP4]], -16
319319
; CHECK-NEXT: [[TMP35:%.*]] = shl i129 [[TMP3]], [[TMP34]]
320320
; CHECK-NEXT: [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
321321
; CHECK-NEXT: [[TMP37:%.*]] = lshr i129 [[TMP35]], 32
@@ -399,7 +399,7 @@ define fp128 @si129tofp128(i129 %a) {
399399
; CHECK-NEXT: [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
400400
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
401401
; CHECK: itofp-if-else:
402-
; CHECK-NEXT: [[TMP34:%.*]] = add i129 [[TMP4]], 4294967280
402+
; CHECK-NEXT: [[TMP34:%.*]] = add i129 [[TMP4]], -16
403403
; CHECK-NEXT: [[TMP35:%.*]] = shl i129 [[TMP3]], [[TMP34]]
404404
; CHECK-NEXT: [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
405405
; CHECK-NEXT: [[TMP37:%.*]] = lshr i129 [[TMP35]], 32

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ define x86_fp80 @ui129tox86_fp80(i129 %a) {
315315
; CHECK-NEXT: [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
316316
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
317317
; CHECK: itofp-if-else:
318-
; CHECK-NEXT: [[TMP34:%.*]] = add i129 [[TMP4]], 4294967280
318+
; CHECK-NEXT: [[TMP34:%.*]] = add i129 [[TMP4]], -16
319319
; CHECK-NEXT: [[TMP35:%.*]] = shl i129 [[A]], [[TMP34]]
320320
; CHECK-NEXT: [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
321321
; CHECK-NEXT: [[TMP37:%.*]] = lshr i129 [[TMP35]], 32
@@ -399,7 +399,7 @@ define fp128 @ui129tofp128(i129 %a) {
399399
; CHECK-NEXT: [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
400400
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
401401
; CHECK: itofp-if-else:
402-
; CHECK-NEXT: [[TMP34:%.*]] = add i129 [[TMP4]], 4294967280
402+
; CHECK-NEXT: [[TMP34:%.*]] = add i129 [[TMP4]], -16
403403
; CHECK-NEXT: [[TMP35:%.*]] = shl i129 [[A]], [[TMP34]]
404404
; CHECK-NEXT: [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
405405
; CHECK-NEXT: [[TMP37:%.*]] = lshr i129 [[TMP35]], 32

0 commit comments

Comments
 (0)