1714286f9SSamuel Parker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2714286f9SSamuel Parker; RUN: opt -passes=instcombine -S -o - %s | FileCheck %s 3714286f9SSamuel Parker 4cb29ba9cSSanjay Patel; Tests if an integer type can cover the entire range of an input 5cb29ba9cSSanjay Patel; FP value. If so, we can remove an intermediate cast to a smaller 6cb29ba9cSSanjay Patel; int type (remove a truncate). 7714286f9SSamuel Parker 8714286f9SSamuel Parkerdefine i16 @half_fptoui_i17_i16(half %x) { 9714286f9SSamuel Parker; CHECK-LABEL: @half_fptoui_i17_i16( 10*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptoui half [[X:%.*]] to i16 11*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret i16 [[I]] 12714286f9SSamuel Parker; 13cb29ba9cSSanjay Patel %i = fptoui half %x to i17 14cb29ba9cSSanjay Patel %r = trunc i17 %i to i16 15cb29ba9cSSanjay Patel ret i16 %r 16714286f9SSamuel Parker} 17714286f9SSamuel Parker 18cb29ba9cSSanjay Patel; Negative test - not enough bits to hold max half value (65504). 19cb29ba9cSSanjay Patel 20cb29ba9cSSanjay Pateldefine i15 @half_fptoui_i17_i15(half %x) { 21cb29ba9cSSanjay Patel; CHECK-LABEL: @half_fptoui_i17_i15( 22cb29ba9cSSanjay Patel; CHECK-NEXT: [[I:%.*]] = fptoui half [[X:%.*]] to i17 23cb29ba9cSSanjay Patel; CHECK-NEXT: [[R:%.*]] = trunc i17 [[I]] to i15 24cb29ba9cSSanjay Patel; CHECK-NEXT: ret i15 [[R]] 25714286f9SSamuel Parker; 26cb29ba9cSSanjay Patel %i = fptoui half %x to i17 27cb29ba9cSSanjay Patel %r = trunc i17 %i to i15 28cb29ba9cSSanjay Patel ret i15 %r 29714286f9SSamuel Parker} 30714286f9SSamuel Parker 31cb29ba9cSSanjay Patel; Wider intermediate type is ok. 32cb29ba9cSSanjay Patel 33714286f9SSamuel Parkerdefine i16 @half_fptoui_i32_i16(half %x) { 34714286f9SSamuel Parker; CHECK-LABEL: @half_fptoui_i32_i16( 35*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptoui half [[X:%.*]] to i16 36*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret i16 [[I]] 37714286f9SSamuel Parker; 38cb29ba9cSSanjay Patel %i = fptoui half %x to i32 39cb29ba9cSSanjay Patel %r = trunc i32 %i to i16 40cb29ba9cSSanjay Patel ret i16 %r 41714286f9SSamuel Parker} 42714286f9SSamuel Parker 43cb29ba9cSSanjay Patel; Wider final type is ok. 446dc8e215SSamuel Parker; TODO: Handle non-simple result type. 45714286f9SSamuel Parker 46714286f9SSamuel Parkerdefine i17 @half_fptoui_i32_i17(half %x) { 47714286f9SSamuel Parker; CHECK-LABEL: @half_fptoui_i32_i17( 48cb29ba9cSSanjay Patel; CHECK-NEXT: [[I:%.*]] = fptoui half [[X:%.*]] to i32 49cb29ba9cSSanjay Patel; CHECK-NEXT: [[R:%.*]] = trunc i32 [[I]] to i17 50cb29ba9cSSanjay Patel; CHECK-NEXT: ret i17 [[R]] 51714286f9SSamuel Parker; 52cb29ba9cSSanjay Patel %i = fptoui half %x to i32 53cb29ba9cSSanjay Patel %r = trunc i32 %i to i17 54cb29ba9cSSanjay Patel ret i17 %r 55714286f9SSamuel Parker} 56714286f9SSamuel Parker 57cb29ba9cSSanjay Patel; Vectors work too. 58714286f9SSamuel Parker 59714286f9SSamuel Parkerdefine <4 x i16> @half_fptoui_4xi32_4xi16(<4 x half> %x) { 60714286f9SSamuel Parker; CHECK-LABEL: @half_fptoui_4xi32_4xi16( 61*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptoui <4 x half> [[X:%.*]] to <4 x i16> 62*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret <4 x i16> [[I]] 63714286f9SSamuel Parker; 64cb29ba9cSSanjay Patel %i = fptoui <4 x half> %x to <4 x i32> 65cb29ba9cSSanjay Patel %r = trunc <4 x i32> %i to <4 x i16> 66cb29ba9cSSanjay Patel ret <4 x i16> %r 67714286f9SSamuel Parker} 68714286f9SSamuel Parker 69cb29ba9cSSanjay Pateldefine i128 @bfloat_fptoui_i129_i128(bfloat %x) { 70cb29ba9cSSanjay Patel; CHECK-LABEL: @bfloat_fptoui_i129_i128( 71*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptoui bfloat [[X:%.*]] to i128 72*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret i128 [[I]] 73714286f9SSamuel Parker; 74cb29ba9cSSanjay Patel %i = fptoui bfloat %x to i129 75cb29ba9cSSanjay Patel %r = trunc i129 %i to i128 76cb29ba9cSSanjay Patel ret i128 %r 77714286f9SSamuel Parker} 78714286f9SSamuel Parker 79cb29ba9cSSanjay Patel; Negative test - not enough bits to hold max bfloat value (2**127 * (2 − 2**−7)) 80cb29ba9cSSanjay Patel 81cb29ba9cSSanjay Pateldefine i127 @bfloat_fptoui_i128_i127(bfloat %x) { 82cb29ba9cSSanjay Patel; CHECK-LABEL: @bfloat_fptoui_i128_i127( 83cb29ba9cSSanjay Patel; CHECK-NEXT: [[I:%.*]] = fptoui bfloat [[X:%.*]] to i128 84cb29ba9cSSanjay Patel; CHECK-NEXT: [[R:%.*]] = trunc i128 [[I]] to i127 85cb29ba9cSSanjay Patel; CHECK-NEXT: ret i127 [[R]] 86714286f9SSamuel Parker; 87cb29ba9cSSanjay Patel %i = fptoui bfloat %x to i128 88cb29ba9cSSanjay Patel %r = trunc i128 %i to i127 89cb29ba9cSSanjay Patel ret i127 %r 90714286f9SSamuel Parker} 91714286f9SSamuel Parker 92cb29ba9cSSanjay Pateldefine i128 @float_fptoui_i129_i128(float %x) { 93cb29ba9cSSanjay Patel; CHECK-LABEL: @float_fptoui_i129_i128( 94*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptoui float [[X:%.*]] to i128 95*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret i128 [[I]] 96714286f9SSamuel Parker; 97cb29ba9cSSanjay Patel %i = fptoui float %x to i129 98cb29ba9cSSanjay Patel %r = trunc i129 %i to i128 99cb29ba9cSSanjay Patel ret i128 %r 100714286f9SSamuel Parker} 101714286f9SSamuel Parker 1026dc8e215SSamuel Parker; TODO: We could transform with multiple users. 1036dc8e215SSamuel Parkerdeclare void @use(i129) 1046dc8e215SSamuel Parkerdefine i128 @float_fptoui_i129_i128_use(float %x) { 1056dc8e215SSamuel Parker; CHECK-LABEL: @float_fptoui_i129_i128_use( 1066dc8e215SSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptoui float [[X:%.*]] to i129 1076dc8e215SSamuel Parker; CHECK-NEXT: call void @use(i129 [[I]]) 1086dc8e215SSamuel Parker; CHECK-NEXT: [[R:%.*]] = trunc i129 [[I]] to i128 1096dc8e215SSamuel Parker; CHECK-NEXT: ret i128 [[R]] 1106dc8e215SSamuel Parker; 1116dc8e215SSamuel Parker %i = fptoui float %x to i129 1126dc8e215SSamuel Parker call void @use(i129 %i) 1136dc8e215SSamuel Parker %r = trunc i129 %i to i128 1146dc8e215SSamuel Parker ret i128 %r 1156dc8e215SSamuel Parker} 1166dc8e215SSamuel Parker 117cb29ba9cSSanjay Patel; Negative test - not enough bits to hold max float value (2**127 * (2 − 2**−23)) 118cb29ba9cSSanjay Patel 119cb29ba9cSSanjay Pateldefine i127 @float_fptoui_i128_i127(float %x) { 120cb29ba9cSSanjay Patel; CHECK-LABEL: @float_fptoui_i128_i127( 121cb29ba9cSSanjay Patel; CHECK-NEXT: [[I:%.*]] = fptoui float [[X:%.*]] to i128 122cb29ba9cSSanjay Patel; CHECK-NEXT: [[R:%.*]] = trunc i128 [[I]] to i127 123cb29ba9cSSanjay Patel; CHECK-NEXT: ret i127 [[R]] 124714286f9SSamuel Parker; 125cb29ba9cSSanjay Patel %i = fptoui float %x to i128 126cb29ba9cSSanjay Patel %r = trunc i128 %i to i127 127cb29ba9cSSanjay Patel ret i127 %r 128714286f9SSamuel Parker} 129714286f9SSamuel Parker 1306dc8e215SSamuel Parkerdefine i1024 @double_fptoui_i1025_i1024(double %x) { 1316dc8e215SSamuel Parker; CHECK-LABEL: @double_fptoui_i1025_i1024( 132*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptoui double [[X:%.*]] to i1024 133*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret i1024 [[I]] 134714286f9SSamuel Parker; 135cb29ba9cSSanjay Patel %i = fptoui double %x to i1025 136cb29ba9cSSanjay Patel %r = trunc i1025 %i to i1024 137cb29ba9cSSanjay Patel ret i1024 %r 138714286f9SSamuel Parker} 139714286f9SSamuel Parker 140cb29ba9cSSanjay Patel; Negative test - not enough bits to hold max double value (2**1023 * (2 − 2**−52)) 141714286f9SSamuel Parker 1426dc8e215SSamuel Parkerdefine i1023 @double_fptoui_i1024_i1023(double %x) { 1436dc8e215SSamuel Parker; CHECK-LABEL: @double_fptoui_i1024_i1023( 1446dc8e215SSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptoui double [[X:%.*]] to i1024 145cb29ba9cSSanjay Patel; CHECK-NEXT: [[R:%.*]] = trunc i1024 [[I]] to i1023 146cb29ba9cSSanjay Patel; CHECK-NEXT: ret i1023 [[R]] 147714286f9SSamuel Parker; 1486dc8e215SSamuel Parker %i = fptoui double %x to i1024 149cb29ba9cSSanjay Patel %r = trunc i1024 %i to i1023 150cb29ba9cSSanjay Patel ret i1023 %r 151714286f9SSamuel Parker} 1526dc8e215SSamuel Parker 1536dc8e215SSamuel Parker; Negative test - not enough bits to hold min half value (-65504). 1546dc8e215SSamuel Parker 1556dc8e215SSamuel Parkerdefine i16 @half_fptosi_i17_i16(half %x) { 1566dc8e215SSamuel Parker; CHECK-LABEL: @half_fptosi_i17_i16( 1576dc8e215SSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi half [[X:%.*]] to i17 1586dc8e215SSamuel Parker; CHECK-NEXT: [[R:%.*]] = trunc i17 [[I]] to i16 1596dc8e215SSamuel Parker; CHECK-NEXT: ret i16 [[R]] 1606dc8e215SSamuel Parker; 1616dc8e215SSamuel Parker %i = fptosi half %x to i17 1626dc8e215SSamuel Parker %r = trunc i17 %i to i16 1636dc8e215SSamuel Parker ret i16 %r 1646dc8e215SSamuel Parker} 1656dc8e215SSamuel Parker 1666dc8e215SSamuel Parkerdefine i17 @half_fptosi_i18_i17(half %x) { 1676dc8e215SSamuel Parker; CHECK-LABEL: @half_fptosi_i18_i17( 168*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi half [[X:%.*]] to i17 169*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret i17 [[I]] 1706dc8e215SSamuel Parker; 1716dc8e215SSamuel Parker %i = fptosi half %x to i18 1726dc8e215SSamuel Parker %r = trunc i18 %i to i17 1736dc8e215SSamuel Parker ret i17 %r 1746dc8e215SSamuel Parker} 1756dc8e215SSamuel Parker 1766dc8e215SSamuel Parker; Wider intermediate type is ok. 1776dc8e215SSamuel Parker; TODO: Handle non-simple result type. 1786dc8e215SSamuel Parker 1796dc8e215SSamuel Parkerdefine i17 @half_fptosi_i32_i17(half %x) { 1806dc8e215SSamuel Parker; CHECK-LABEL: @half_fptosi_i32_i17( 1816dc8e215SSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi half [[X:%.*]] to i32 1826dc8e215SSamuel Parker; CHECK-NEXT: [[R:%.*]] = trunc i32 [[I]] to i17 1836dc8e215SSamuel Parker; CHECK-NEXT: ret i17 [[R]] 1846dc8e215SSamuel Parker; 1856dc8e215SSamuel Parker %i = fptosi half %x to i32 1866dc8e215SSamuel Parker %r = trunc i32 %i to i17 1876dc8e215SSamuel Parker ret i17 %r 1886dc8e215SSamuel Parker} 1896dc8e215SSamuel Parker 1906dc8e215SSamuel Parker; Wider final type is ok. 1916dc8e215SSamuel Parker; TODO: Handle non-simple result type. 1926dc8e215SSamuel Parker 1936dc8e215SSamuel Parkerdefine i18 @half_fptosi_i32_i18(half %x) { 1946dc8e215SSamuel Parker; CHECK-LABEL: @half_fptosi_i32_i18( 1956dc8e215SSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi half [[X:%.*]] to i32 1966dc8e215SSamuel Parker; CHECK-NEXT: [[R:%.*]] = trunc i32 [[I]] to i18 1976dc8e215SSamuel Parker; CHECK-NEXT: ret i18 [[R]] 1986dc8e215SSamuel Parker; 1996dc8e215SSamuel Parker %i = fptosi half %x to i32 2006dc8e215SSamuel Parker %r = trunc i32 %i to i18 2016dc8e215SSamuel Parker ret i18 %r 2026dc8e215SSamuel Parker} 2036dc8e215SSamuel Parker 2046dc8e215SSamuel Parker; Vectors work too. 2056dc8e215SSamuel Parker 2066dc8e215SSamuel Parkerdefine <4 x i17> @half_fptosi_4xi32_4xi17(<4 x half> %x) { 2076dc8e215SSamuel Parker; CHECK-LABEL: @half_fptosi_4xi32_4xi17( 208*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi <4 x half> [[X:%.*]] to <4 x i17> 209*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret <4 x i17> [[I]] 2106dc8e215SSamuel Parker; 2116dc8e215SSamuel Parker %i = fptosi <4 x half> %x to <4 x i32> 2126dc8e215SSamuel Parker %r = trunc <4 x i32> %i to <4 x i17> 2136dc8e215SSamuel Parker ret <4 x i17> %r 2146dc8e215SSamuel Parker} 2156dc8e215SSamuel Parker 2166dc8e215SSamuel Parker; Negative test - not enough bits to hold min float value. 2176dc8e215SSamuel Parker 2186dc8e215SSamuel Parkerdefine i128 @bfloat_fptosi_i129_i128(bfloat %x) { 2196dc8e215SSamuel Parker; CHECK-LABEL: @bfloat_fptosi_i129_i128( 2206dc8e215SSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi bfloat [[X:%.*]] to i129 2216dc8e215SSamuel Parker; CHECK-NEXT: [[R:%.*]] = trunc i129 [[I]] to i128 2226dc8e215SSamuel Parker; CHECK-NEXT: ret i128 [[R]] 2236dc8e215SSamuel Parker; 2246dc8e215SSamuel Parker %i = fptosi bfloat %x to i129 2256dc8e215SSamuel Parker %r = trunc i129 %i to i128 2266dc8e215SSamuel Parker ret i128 %r 2276dc8e215SSamuel Parker} 2286dc8e215SSamuel Parker 2296dc8e215SSamuel Parkerdefine i129 @bfloat_fptosi_i130_i129(bfloat %x) { 2306dc8e215SSamuel Parker; CHECK-LABEL: @bfloat_fptosi_i130_i129( 231*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi bfloat [[X:%.*]] to i129 232*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret i129 [[I]] 2336dc8e215SSamuel Parker; 2346dc8e215SSamuel Parker %i = fptosi bfloat %x to i130 2356dc8e215SSamuel Parker %r = trunc i130 %i to i129 2366dc8e215SSamuel Parker ret i129 %r 2376dc8e215SSamuel Parker} 2386dc8e215SSamuel Parker 2396dc8e215SSamuel Parkerdefine i129 @float_fptosi_i130_i129(float %x) { 2406dc8e215SSamuel Parker; CHECK-LABEL: @float_fptosi_i130_i129( 241*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi float [[X:%.*]] to i129 242*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret i129 [[I]] 2436dc8e215SSamuel Parker; 2446dc8e215SSamuel Parker %i = fptosi float %x to i130 2456dc8e215SSamuel Parker %r = trunc i130 %i to i129 2466dc8e215SSamuel Parker ret i129 %r 2476dc8e215SSamuel Parker} 2486dc8e215SSamuel Parker 2496dc8e215SSamuel Parker; Negative test - not enough bits to hold min float value. 2506dc8e215SSamuel Parker 2516dc8e215SSamuel Parkerdefine i128 @float_fptosi_i129_i128(float %x) { 2526dc8e215SSamuel Parker; CHECK-LABEL: @float_fptosi_i129_i128( 2536dc8e215SSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi float [[X:%.*]] to i129 2546dc8e215SSamuel Parker; CHECK-NEXT: [[R:%.*]] = trunc i129 [[I]] to i128 2556dc8e215SSamuel Parker; CHECK-NEXT: ret i128 [[R]] 2566dc8e215SSamuel Parker; 2576dc8e215SSamuel Parker %i = fptosi float %x to i129 2586dc8e215SSamuel Parker %r = trunc i129 %i to i128 2596dc8e215SSamuel Parker ret i128 %r 2606dc8e215SSamuel Parker} 2616dc8e215SSamuel Parker 2626dc8e215SSamuel Parkerdefine i1025 @double_fptosi_i1026_i1025(double %x) { 2636dc8e215SSamuel Parker; CHECK-LABEL: @double_fptosi_i1026_i1025( 264*b1b7fb6fSSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi double [[X:%.*]] to i1025 265*b1b7fb6fSSamuel Parker; CHECK-NEXT: ret i1025 [[I]] 2666dc8e215SSamuel Parker; 2676dc8e215SSamuel Parker %i = fptosi double %x to i1026 2686dc8e215SSamuel Parker %r = trunc i1026 %i to i1025 2696dc8e215SSamuel Parker ret i1025 %r 2706dc8e215SSamuel Parker} 2716dc8e215SSamuel Parker 2726dc8e215SSamuel Parker; Negative test - not enough bits to hold min double value. 2736dc8e215SSamuel Parker 2746dc8e215SSamuel Parkerdefine i1024 @double_fptosi_i1025_i1024(double %x) { 2756dc8e215SSamuel Parker; CHECK-LABEL: @double_fptosi_i1025_i1024( 2766dc8e215SSamuel Parker; CHECK-NEXT: [[I:%.*]] = fptosi double [[X:%.*]] to i1025 2776dc8e215SSamuel Parker; CHECK-NEXT: [[R:%.*]] = trunc i1025 [[I]] to i1024 2786dc8e215SSamuel Parker; CHECK-NEXT: ret i1024 [[R]] 2796dc8e215SSamuel Parker; 2806dc8e215SSamuel Parker %i = fptosi double %x to i1025 2816dc8e215SSamuel Parker %r = trunc i1025 %i to i1024 2826dc8e215SSamuel Parker ret i1024 %r 2836dc8e215SSamuel Parker} 284