From cb29ba9c0f8726d768caff29f7c400c19774cbd8 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Fri, 20 Jan 2023 14:10:23 -0500 Subject: [PATCH] [InstCombine] adjust tests for fptoui + trunc; NFC Tests were duplicated for undef-ness, but that's not necessary. There were no tests for bfloat/double. I deleted the fptosi tests for now because those will just be a bitwidth adjustment to the fptoui tests once we settle on the right set of tests. I think it should just be 2 tests on either side of the bitwidth boundary to allow a fold with a couple of extra tests thrown in to show other type constraints are not a factor. Goes with: D142093 --- .../test/Transforms/InstCombine/trunc-fp-to-int.ll | 450 +++++---------------- 1 file changed, 92 insertions(+), 358 deletions(-) diff --git a/llvm/test/Transforms/InstCombine/trunc-fp-to-int.ll b/llvm/test/Transforms/InstCombine/trunc-fp-to-int.ll index e8d16e9..add5194 100644 --- a/llvm/test/Transforms/InstCombine/trunc-fp-to-int.ll +++ b/llvm/test/Transforms/InstCombine/trunc-fp-to-int.ll @@ -1,407 +1,141 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -passes=instcombine -S -o - %s | FileCheck %s -; Negative test. -define i15 @half_fptoui_i32_i15(half %x) { -; CHECK-LABEL: @half_fptoui_i32_i15( -; CHECK-NEXT: [[CONV:%.*]] = fptoui half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i15 -; CHECK-NEXT: ret i15 [[CONV_1]] -; - %conv = fptoui half %x to i32 - %conv.1 = trunc i32 %conv to i15 - ret i15 %conv.1 -} - -; Negative test. -define i15 @half_fptoui_i32_i15_noundef(half noundef %x) { -; CHECK-LABEL: @half_fptoui_i32_i15_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptoui half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i15 -; CHECK-NEXT: ret i15 [[CONV_1]] -; - %conv = fptoui half %x to i32 - %conv.1 = trunc i32 %conv to i15 - ret i15 %conv.1 -} +; Tests if an integer type can cover the entire range of an input +; FP value. If so, we can remove an intermediate cast to a smaller +; int type (remove a truncate). define i16 @half_fptoui_i17_i16(half %x) { ; CHECK-LABEL: @half_fptoui_i17_i16( -; CHECK-NEXT: [[CONV:%.*]] = fptoui half [[X:%.*]] to i17 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i17 [[CONV]] to i16 -; CHECK-NEXT: ret i16 [[CONV_1]] +; CHECK-NEXT: [[I:%.*]] = fptoui half [[X:%.*]] to i17 +; CHECK-NEXT: [[R:%.*]] = trunc i17 [[I]] to i16 +; CHECK-NEXT: ret i16 [[R]] ; - %conv = fptoui half %x to i17 - %conv.1 = trunc i17 %conv to i16 - ret i16 %conv.1 + %i = fptoui half %x to i17 + %r = trunc i17 %i to i16 + ret i16 %r } -define i16 @half_fptoui_i17_i16_noundef(half noundef %x) { -; CHECK-LABEL: @half_fptoui_i17_i16_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptoui half [[X:%.*]] to i17 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i17 [[CONV]] to i16 -; CHECK-NEXT: ret i16 [[CONV_1]] +; Negative test - not enough bits to hold max half value (65504). + +define i15 @half_fptoui_i17_i15(half %x) { +; CHECK-LABEL: @half_fptoui_i17_i15( +; CHECK-NEXT: [[I:%.*]] = fptoui half [[X:%.*]] to i17 +; CHECK-NEXT: [[R:%.*]] = trunc i17 [[I]] to i15 +; CHECK-NEXT: ret i15 [[R]] ; - %conv = fptoui half %x to i17 - %conv.1 = trunc i17 %conv to i16 - ret i16 %conv.1 + %i = fptoui half %x to i17 + %r = trunc i17 %i to i15 + ret i15 %r } +; Wider intermediate type is ok. + define i16 @half_fptoui_i32_i16(half %x) { ; CHECK-LABEL: @half_fptoui_i32_i16( -; CHECK-NEXT: [[CONV:%.*]] = fptoui half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i16 -; CHECK-NEXT: ret i16 [[CONV_1]] +; CHECK-NEXT: [[I:%.*]] = fptoui half [[X:%.*]] to i32 +; CHECK-NEXT: [[R:%.*]] = trunc i32 [[I]] to i16 +; CHECK-NEXT: ret i16 [[R]] ; - %conv = fptoui half %x to i32 - %conv.1 = trunc i32 %conv to i16 - ret i16 %conv.1 + %i = fptoui half %x to i32 + %r = trunc i32 %i to i16 + ret i16 %r } -define i16 @half_fptoui_i32_i16_noundef(half noundef %x) { -; CHECK-LABEL: @half_fptoui_i32_i16_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptoui half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i16 -; CHECK-NEXT: ret i16 [[CONV_1]] -; - %conv = fptoui half %x to i32 - %conv.1 = trunc i32 %conv to i16 - ret i16 %conv.1 -} +; Wider final type is ok. -; TODO: i17 is not explored. define i17 @half_fptoui_i32_i17(half %x) { ; CHECK-LABEL: @half_fptoui_i32_i17( -; CHECK-NEXT: [[CONV:%.*]] = fptoui half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i17 -; CHECK-NEXT: ret i17 [[CONV_1]] +; CHECK-NEXT: [[I:%.*]] = fptoui half [[X:%.*]] to i32 +; CHECK-NEXT: [[R:%.*]] = trunc i32 [[I]] to i17 +; CHECK-NEXT: ret i17 [[R]] ; - %conv = fptoui half %x to i32 - %conv.1 = trunc i32 %conv to i17 - ret i17 %conv.1 + %i = fptoui half %x to i32 + %r = trunc i32 %i to i17 + ret i17 %r } -; TODO: i17 is not explored. -define i17 @half_fptoui_i32_i17_noundef(half noundef %x) { -; CHECK-LABEL: @half_fptoui_i32_i17_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptoui half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i17 -; CHECK-NEXT: ret i17 [[CONV_1]] -; - %conv = fptoui half %x to i32 - %conv.1 = trunc i32 %conv to i17 - ret i17 %conv.1 -} +; Vectors work too. define <4 x i16> @half_fptoui_4xi32_4xi16(<4 x half> %x) { ; CHECK-LABEL: @half_fptoui_4xi32_4xi16( -; CHECK-NEXT: [[CONV:%.*]] = fptoui <4 x half> [[X:%.*]] to <4 x i32> -; CHECK-NEXT: [[CONV_1:%.*]] = trunc <4 x i32> [[CONV]] to <4 x i16> -; CHECK-NEXT: ret <4 x i16> [[CONV_1]] -; - %conv = fptoui <4 x half> %x to <4 x i32> - %conv.1 = trunc <4 x i32> %conv to <4 x i16> - ret <4 x i16> %conv.1 -} - -define <4 x i16> @half_fptoui_4xi32_4xi16_noundef(<4 x half> noundef %x) { -; CHECK-LABEL: @half_fptoui_4xi32_4xi16_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptoui <4 x half> [[X:%.*]] to <4 x i32> -; CHECK-NEXT: [[CONV_1:%.*]] = trunc <4 x i32> [[CONV]] to <4 x i16> -; CHECK-NEXT: ret <4 x i16> [[CONV_1]] -; - %conv = fptoui <4 x half> %x to <4 x i32> - %conv.1 = trunc <4 x i32> %conv to <4 x i16> - ret <4 x i16> %conv.1 -} - -; Negative test. -define i31 @float_fptoui_i64_i31(float %x) { -; CHECK-LABEL: @float_fptoui_i64_i31( -; CHECK-NEXT: [[CONV:%.*]] = fptoui float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i31 -; CHECK-NEXT: ret i31 [[CONV_1]] -; - %conv = fptoui float %x to i64 - %conv.1 = trunc i64 %conv to i31 - ret i31 %conv.1 -} - -; Negative test. -define i31 @float_fptoui_i64_i31_noundef(float noundef %x) { -; CHECK-LABEL: @float_fptoui_i64_i31_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptoui float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i31 -; CHECK-NEXT: ret i31 [[CONV_1]] -; - %conv = fptoui float %x to i64 - %conv.1 = trunc i64 %conv to i31 - ret i31 %conv.1 -} - -; Negative test. -define i32 @float_fptoui_i64_i32(float %x) { -; CHECK-LABEL: @float_fptoui_i64_i32( -; CHECK-NEXT: [[CONV:%.*]] = fptoui float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i32 -; CHECK-NEXT: ret i32 [[CONV_1]] -; - %conv = fptoui float %x to i64 - %conv.1 = trunc i64 %conv to i32 - ret i32 %conv.1 -} - -; Negative test. -define i32 @float_fptoui_i64_i32_noundef(float noundef %x) { -; CHECK-LABEL: @float_fptoui_i64_i32_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptoui float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i32 -; CHECK-NEXT: ret i32 [[CONV_1]] -; - %conv = fptoui float %x to i64 - %conv.1 = trunc i64 %conv to i32 - ret i32 %conv.1 -} - -define i33 @float_fptoui_i64_i33(float %x) { -; CHECK-LABEL: @float_fptoui_i64_i33( -; CHECK-NEXT: [[CONV:%.*]] = fptoui float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i33 -; CHECK-NEXT: ret i33 [[CONV_1]] -; - %conv = fptoui float %x to i64 - %conv.1 = trunc i64 %conv to i33 - ret i33 %conv.1 -} - -define i33 @float_fptoui_i64_i33_noundef(float noundef %x) { -; CHECK-LABEL: @float_fptoui_i64_i33_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptoui float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i33 -; CHECK-NEXT: ret i33 [[CONV_1]] -; - %conv = fptoui float %x to i64 - %conv.1 = trunc i64 %conv to i33 - ret i33 %conv.1 -} - -define i64 @float_fptoui_i128_i64(float %x) { -; CHECK-LABEL: @float_fptoui_i128_i64( -; CHECK-NEXT: [[CONV:%.*]] = fptoui float [[X:%.*]] to i128 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i128 [[CONV]] to i64 -; CHECK-NEXT: ret i64 [[CONV_1]] -; - %conv = fptoui float %x to i128 - %conv.1 = trunc i128 %conv to i64 - ret i64 %conv.1 -} - -define i64 @float_fptoui_i128_i64_noundef(float noundef %x) { -; CHECK-LABEL: @float_fptoui_i128_i64_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptoui float [[X:%.*]] to i128 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i128 [[CONV]] to i64 -; CHECK-NEXT: ret i64 [[CONV_1]] -; - %conv = fptoui float %x to i128 - %conv.1 = trunc i128 %conv to i64 - ret i64 %conv.1 -} - -; Negative test. -define i15 @half_fptosi_i32_i15(half %x) { -; CHECK-LABEL: @half_fptosi_i32_i15( -; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i15 -; CHECK-NEXT: ret i15 [[CONV_1]] -; - %conv = fptosi half %x to i32 - %conv.1 = trunc i32 %conv to i15 - ret i15 %conv.1 -} - -; Negative test. -define i15 @half_fptosi_i32_i15_noundef(half noundef %x) { -; CHECK-LABEL: @half_fptosi_i32_i15_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i15 -; CHECK-NEXT: ret i15 [[CONV_1]] -; - %conv = fptosi half %x to i32 - %conv.1 = trunc i32 %conv to i15 - ret i15 %conv.1 -} - -; Negative test. -define i16 @half_fptosi_i32_i16(half %x) { -; CHECK-LABEL: @half_fptosi_i32_i16( -; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i16 -; CHECK-NEXT: ret i16 [[CONV_1]] -; - %conv = fptosi half %x to i32 - %conv.1 = trunc i32 %conv to i16 - ret i16 %conv.1 -} - -; Negative test. -define i16 @half_fptosi_i32_i16_noundef(half noundef %x) { -; CHECK-LABEL: @half_fptosi_i32_i16_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i16 -; CHECK-NEXT: ret i16 [[CONV_1]] -; - %conv = fptosi half %x to i32 - %conv.1 = trunc i32 %conv to i16 - ret i16 %conv.1 -} - -; TODO: i17 isn't explored. -define i17 @half_fptosi_i32_i17(half %x) { -; CHECK-LABEL: @half_fptosi_i32_i17( -; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i17 -; CHECK-NEXT: ret i17 [[CONV_1]] +; CHECK-NEXT: [[I:%.*]] = fptoui <4 x half> [[X:%.*]] to <4 x i32> +; CHECK-NEXT: [[R:%.*]] = trunc <4 x i32> [[I]] to <4 x i16> +; CHECK-NEXT: ret <4 x i16> [[R]] ; - %conv = fptosi half %x to i32 - %conv.1 = trunc i32 %conv to i17 - ret i17 %conv.1 + %i = fptoui <4 x half> %x to <4 x i32> + %r = trunc <4 x i32> %i to <4 x i16> + ret <4 x i16> %r } -; TODO: i17 isn't explored. -define i17 @half_fptosi_i32_i17_noundef(half noundef %x) { -; CHECK-LABEL: @half_fptosi_i32_i17_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[X:%.*]] to i32 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i32 [[CONV]] to i17 -; CHECK-NEXT: ret i17 [[CONV_1]] +define i128 @bfloat_fptoui_i129_i128(bfloat %x) { +; CHECK-LABEL: @bfloat_fptoui_i129_i128( +; CHECK-NEXT: [[I:%.*]] = fptoui bfloat [[X:%.*]] to i129 +; CHECK-NEXT: [[R:%.*]] = trunc i129 [[I]] to i128 +; CHECK-NEXT: ret i128 [[R]] ; - %conv = fptosi half %x to i32 - %conv.1 = trunc i32 %conv to i17 - ret i17 %conv.1 + %i = fptoui bfloat %x to i129 + %r = trunc i129 %i to i128 + ret i128 %r } -; Negative test. -define <4 x i16> @half_fptosi_4xi32_4xi16(<4 x half> %x) { -; CHECK-LABEL: @half_fptosi_4xi32_4xi16( -; CHECK-NEXT: [[CONV:%.*]] = fptosi <4 x half> [[X:%.*]] to <4 x i32> -; CHECK-NEXT: [[CONV_1:%.*]] = trunc <4 x i32> [[CONV]] to <4 x i16> -; CHECK-NEXT: ret <4 x i16> [[CONV_1]] -; - %conv = fptosi <4 x half> %x to <4 x i32> - %conv.1 = trunc <4 x i32> %conv to <4 x i16> - ret <4 x i16> %conv.1 -} +; Negative test - not enough bits to hold max bfloat value (2**127 * (2 − 2**−7)) -; Negative test. -define <4 x i16> @half_fptosi_4xi32_4xi16_noundef(<4 x half> noundef %x) { -; CHECK-LABEL: @half_fptosi_4xi32_4xi16_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptosi <4 x half> [[X:%.*]] to <4 x i32> -; CHECK-NEXT: [[CONV_1:%.*]] = trunc <4 x i32> [[CONV]] to <4 x i16> -; CHECK-NEXT: ret <4 x i16> [[CONV_1]] +define i127 @bfloat_fptoui_i128_i127(bfloat %x) { +; CHECK-LABEL: @bfloat_fptoui_i128_i127( +; CHECK-NEXT: [[I:%.*]] = fptoui bfloat [[X:%.*]] to i128 +; CHECK-NEXT: [[R:%.*]] = trunc i128 [[I]] to i127 +; CHECK-NEXT: ret i127 [[R]] ; - %conv = fptosi <4 x half> %x to <4 x i32> - %conv.1 = trunc <4 x i32> %conv to <4 x i16> - ret <4 x i16> %conv.1 + %i = fptoui bfloat %x to i128 + %r = trunc i128 %i to i127 + ret i127 %r } -define <4 x i32> @half_fptosi_4xi64_4xi32(<4 x half> %x) { -; CHECK-LABEL: @half_fptosi_4xi64_4xi32( -; CHECK-NEXT: [[CONV:%.*]] = fptosi <4 x half> [[X:%.*]] to <4 x i64> -; CHECK-NEXT: [[CONV_1:%.*]] = trunc <4 x i64> [[CONV]] to <4 x i32> -; CHECK-NEXT: ret <4 x i32> [[CONV_1]] +define i128 @float_fptoui_i129_i128(float %x) { +; CHECK-LABEL: @float_fptoui_i129_i128( +; CHECK-NEXT: [[I:%.*]] = fptoui float [[X:%.*]] to i129 +; CHECK-NEXT: [[R:%.*]] = trunc i129 [[I]] to i128 +; CHECK-NEXT: ret i128 [[R]] ; - %conv = fptosi <4 x half> %x to <4 x i64> - %conv.1 = trunc <4 x i64> %conv to <4 x i32> - ret <4 x i32> %conv.1 + %i = fptoui float %x to i129 + %r = trunc i129 %i to i128 + ret i128 %r } -; Negative test. -define i31 @float_fptosi_i64_i31(float %x) { -; CHECK-LABEL: @float_fptosi_i64_i31( -; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i31 -; CHECK-NEXT: ret i31 [[CONV_1]] -; - %conv = fptosi float %x to i64 - %conv.1 = trunc i64 %conv to i31 - ret i31 %conv.1 -} - -; Negative test. -define i31 @float_fptosi_i64_i31_noundef(float noundef %x) { -; CHECK-LABEL: @float_fptosi_i64_i31_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i31 -; CHECK-NEXT: ret i31 [[CONV_1]] -; - %conv = fptosi float %x to i64 - %conv.1 = trunc i64 %conv to i31 - ret i31 %conv.1 -} +; Negative test - not enough bits to hold max float value (2**127 * (2 − 2**−23)) -; Negative test. -define i32 @float_fptosi_i64_i32(float %x) { -; CHECK-LABEL: @float_fptosi_i64_i32( -; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i32 -; CHECK-NEXT: ret i32 [[CONV_1]] +define i127 @float_fptoui_i128_i127(float %x) { +; CHECK-LABEL: @float_fptoui_i128_i127( +; CHECK-NEXT: [[I:%.*]] = fptoui float [[X:%.*]] to i128 +; CHECK-NEXT: [[R:%.*]] = trunc i128 [[I]] to i127 +; CHECK-NEXT: ret i127 [[R]] ; - %conv = fptosi float %x to i64 - %conv.1 = trunc i64 %conv to i32 - ret i32 %conv.1 + %i = fptoui float %x to i128 + %r = trunc i128 %i to i127 + ret i127 %r } -; Negative test. -define i32 @float_fptosi_i64_i32_noundef(float noundef %x) { -; CHECK-LABEL: @float_fptosi_i64_i32_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i32 -; CHECK-NEXT: ret i32 [[CONV_1]] +define i1024 @float_fptoui_i1025_i1024(double %x) { +; CHECK-LABEL: @float_fptoui_i1025_i1024( +; CHECK-NEXT: [[I:%.*]] = fptoui double [[X:%.*]] to i1025 +; CHECK-NEXT: [[R:%.*]] = trunc i1025 [[I]] to i1024 +; CHECK-NEXT: ret i1024 [[R]] ; - %conv = fptosi float %x to i64 - %conv.1 = trunc i64 %conv to i32 - ret i32 %conv.1 + %i = fptoui double %x to i1025 + %r = trunc i1025 %i to i1024 + ret i1024 %r } -define i33 @float_fptosi_i64_i33(float %x) { -; CHECK-LABEL: @float_fptosi_i64_i33( -; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i33 -; CHECK-NEXT: ret i33 [[CONV_1]] -; - %conv = fptosi float %x to i64 - %conv.1 = trunc i64 %conv to i33 - ret i33 %conv.1 -} - -define i33 @float_fptosi_i64_i33_noundef(float noundef %x) { -; CHECK-LABEL: @float_fptosi_i64_i33_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[X:%.*]] to i64 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i64 [[CONV]] to i33 -; CHECK-NEXT: ret i33 [[CONV_1]] -; - %conv = fptosi float %x to i64 - %conv.1 = trunc i64 %conv to i33 - ret i33 %conv.1 -} - -define i64 @float_fptosi_i128_i64(float %x) { -; CHECK-LABEL: @float_fptosi_i128_i64( -; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[X:%.*]] to i128 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i128 [[CONV]] to i64 -; CHECK-NEXT: ret i64 [[CONV_1]] -; - %conv = fptosi float %x to i128 - %conv.1 = trunc i128 %conv to i64 - ret i64 %conv.1 -} +; Negative test - not enough bits to hold max double value (2**1023 * (2 − 2**−52)) -define i64 @float_fptosi_i128_i64_noundef(float noundef %x) { -; CHECK-LABEL: @float_fptosi_i128_i64_noundef( -; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[X:%.*]] to i128 -; CHECK-NEXT: [[CONV_1:%.*]] = trunc i128 [[CONV]] to i64 -; CHECK-NEXT: ret i64 [[CONV_1]] +define i1023 @float_fptoui_i1024_i1023(float %x) { +; CHECK-LABEL: @float_fptoui_i1024_i1023( +; CHECK-NEXT: [[I:%.*]] = fptoui float [[X:%.*]] to i1024 +; CHECK-NEXT: [[R:%.*]] = trunc i1024 [[I]] to i1023 +; CHECK-NEXT: ret i1023 [[R]] ; - %conv = fptosi float %x to i128 - %conv.1 = trunc i128 %conv to i64 - ret i64 %conv.1 + %i = fptoui float %x to i1024 + %r = trunc i1024 %i to i1023 + ret i1023 %r } -- 2.7.4