xref: /llvm-project/llvm/test/Transforms/InstCombine/trunc-fp-to-int.ll (revision b1b7fb6f20b056a7eb5731a98485f9d541c7aabe)
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