xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/sitofp.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1
4*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true
5*9880d681SAndroid Build Coastguard Workerdefine i1 @test1(i8 %A) {
6*9880d681SAndroid Build Coastguard Worker  %B = sitofp i8 %A to double
7*9880d681SAndroid Build Coastguard Worker  %C = fcmp ult double %B, 128.0
8*9880d681SAndroid Build Coastguard Worker  ret i1 %C
9*9880d681SAndroid Build Coastguard Worker}
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2
12*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true
13*9880d681SAndroid Build Coastguard Workerdefine i1 @test2(i8 %A) {
14*9880d681SAndroid Build Coastguard Worker  %B = sitofp i8 %A to double
15*9880d681SAndroid Build Coastguard Worker  %C = fcmp ugt double %B, -128.1
16*9880d681SAndroid Build Coastguard Worker  ret i1 %C
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3
20*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true
21*9880d681SAndroid Build Coastguard Workerdefine i1 @test3(i8 %A) {
22*9880d681SAndroid Build Coastguard Worker  %B = sitofp i8 %A to double
23*9880d681SAndroid Build Coastguard Worker  %C = fcmp ule double %B, 127.0
24*9880d681SAndroid Build Coastguard Worker  ret i1 %C
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4
28*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i8 %A, 127
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1
30*9880d681SAndroid Build Coastguard Workerdefine i1 @test4(i8 %A) {
31*9880d681SAndroid Build Coastguard Worker  %B = sitofp i8 %A to double
32*9880d681SAndroid Build Coastguard Worker  %C = fcmp ult double %B, 127.0
33*9880d681SAndroid Build Coastguard Worker  ret i1 %C
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5
37*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32
38*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %A) {
39*9880d681SAndroid Build Coastguard Worker  %B = sitofp i32 %A to double
40*9880d681SAndroid Build Coastguard Worker  %C = fptosi double %B to i32
41*9880d681SAndroid Build Coastguard Worker  %D = uitofp i32 %C to double
42*9880d681SAndroid Build Coastguard Worker  %E = fptoui double %D to i32
43*9880d681SAndroid Build Coastguard Worker  ret i32 %E
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6
47*9880d681SAndroid Build Coastguard Worker; CHECK: and i32 %A, 39
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
49*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %A) {
50*9880d681SAndroid Build Coastguard Worker  %B = and i32 %A, 7
51*9880d681SAndroid Build Coastguard Worker  %C = and i32 %A, 32
52*9880d681SAndroid Build Coastguard Worker  %D = sitofp i32 %B to double
53*9880d681SAndroid Build Coastguard Worker  %E = sitofp i32 %C to double
54*9880d681SAndroid Build Coastguard Worker  %F = fadd double %D, %E
55*9880d681SAndroid Build Coastguard Worker  %G = fptosi double %F to i32
56*9880d681SAndroid Build Coastguard Worker  ret i32 %G
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7
60*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32
61*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %A) nounwind {
62*9880d681SAndroid Build Coastguard Worker  %B = sitofp i32 %A to double
63*9880d681SAndroid Build Coastguard Worker  %C = fptoui double %B to i32
64*9880d681SAndroid Build Coastguard Worker  ret i32 %C
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8
68*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32
69*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %A) nounwind {
70*9880d681SAndroid Build Coastguard Worker  %B = uitofp i32 %A to double
71*9880d681SAndroid Build Coastguard Worker  %C = fptosi double %B to i32
72*9880d681SAndroid Build Coastguard Worker  ret i32 %C
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9
76*9880d681SAndroid Build Coastguard Worker; CHECK: zext i8
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
78*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i8 %A) nounwind {
79*9880d681SAndroid Build Coastguard Worker  %B = sitofp i8 %A to float
80*9880d681SAndroid Build Coastguard Worker  %C = fptoui float %B to i32
81*9880d681SAndroid Build Coastguard Worker  ret i32 %C
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10
85*9880d681SAndroid Build Coastguard Worker; CHECK: sext i8
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
87*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i8 %A) nounwind {
88*9880d681SAndroid Build Coastguard Worker  %B = sitofp i8 %A to float
89*9880d681SAndroid Build Coastguard Worker  %C = fptosi float %B to i32
90*9880d681SAndroid Build Coastguard Worker  ret i32 %C
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker; If the input value is outside of the range of the output cast, it's
94*9880d681SAndroid Build Coastguard Worker; undefined behavior, so we can assume it fits.
95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11
96*9880d681SAndroid Build Coastguard Worker; CHECK: trunc
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8
98*9880d681SAndroid Build Coastguard Workerdefine i8 @test11(i32 %A) nounwind {
99*9880d681SAndroid Build Coastguard Worker  %B = sitofp i32 %A to float
100*9880d681SAndroid Build Coastguard Worker  %C = fptosi float %B to i8
101*9880d681SAndroid Build Coastguard Worker  ret i8 %C
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; If the input value is negative, it'll be outside the range of the
105*9880d681SAndroid Build Coastguard Worker; output cast, and thus undefined behavior.
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12
107*9880d681SAndroid Build Coastguard Worker; CHECK: zext i8
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
109*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i8 %A) nounwind {
110*9880d681SAndroid Build Coastguard Worker  %B = sitofp i8 %A to float
111*9880d681SAndroid Build Coastguard Worker  %C = fptoui float %B to i32
112*9880d681SAndroid Build Coastguard Worker  ret i32 %C
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker; This can't fold because the 25-bit input doesn't fit in the mantissa.
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13
117*9880d681SAndroid Build Coastguard Worker; CHECK: uitofp
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptoui
119*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i25 %A) nounwind {
120*9880d681SAndroid Build Coastguard Worker  %B = uitofp i25 %A to float
121*9880d681SAndroid Build Coastguard Worker  %C = fptoui float %B to i32
122*9880d681SAndroid Build Coastguard Worker  ret i32 %C
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker; But this one can.
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test14
127*9880d681SAndroid Build Coastguard Worker; CHECK: zext i24
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
129*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(i24 %A) nounwind {
130*9880d681SAndroid Build Coastguard Worker  %B = uitofp i24 %A to float
131*9880d681SAndroid Build Coastguard Worker  %C = fptoui float %B to i32
132*9880d681SAndroid Build Coastguard Worker  ret i32 %C
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; And this one can too.
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test15
137*9880d681SAndroid Build Coastguard Worker; CHECK: trunc i32
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i24
139*9880d681SAndroid Build Coastguard Workerdefine i24 @test15(i32 %A) nounwind {
140*9880d681SAndroid Build Coastguard Worker  %B = uitofp i32 %A to float
141*9880d681SAndroid Build Coastguard Worker  %C = fptoui float %B to i24
142*9880d681SAndroid Build Coastguard Worker  ret i24 %C
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; This can fold because the 25-bit input is signed and we disard the sign bit.
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test16
147*9880d681SAndroid Build Coastguard Worker; CHECK: zext
148*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(i25 %A) nounwind {
149*9880d681SAndroid Build Coastguard Worker %B = sitofp i25 %A to float
150*9880d681SAndroid Build Coastguard Worker %C = fptoui float %B to i32
151*9880d681SAndroid Build Coastguard Worker ret i32 %C
152*9880d681SAndroid Build Coastguard Worker}
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker; This can't fold because the 26-bit input won't fit the mantissa
155*9880d681SAndroid Build Coastguard Worker; even after disarding the signed bit.
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test17
157*9880d681SAndroid Build Coastguard Worker; CHECK: sitofp
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptoui
159*9880d681SAndroid Build Coastguard Workerdefine i32 @test17(i26 %A) nounwind {
160*9880d681SAndroid Build Coastguard Worker %B = sitofp i26 %A to float
161*9880d681SAndroid Build Coastguard Worker %C = fptoui float %B to i32
162*9880d681SAndroid Build Coastguard Worker ret i32 %C
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker; This can fold because the 54-bit output is signed and we disard the sign bit.
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test18
167*9880d681SAndroid Build Coastguard Worker; CHECK: trunc
168*9880d681SAndroid Build Coastguard Workerdefine i54 @test18(i64 %A) nounwind {
169*9880d681SAndroid Build Coastguard Worker %B = sitofp i64 %A to double
170*9880d681SAndroid Build Coastguard Worker %C = fptosi double %B to i54
171*9880d681SAndroid Build Coastguard Worker ret i54 %C
172*9880d681SAndroid Build Coastguard Worker}
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker; This can't fold because the 55-bit output won't fit the mantissa
175*9880d681SAndroid Build Coastguard Worker; even after disarding the sign bit.
176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test19
177*9880d681SAndroid Build Coastguard Worker; CHECK: sitofp
178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi
179*9880d681SAndroid Build Coastguard Workerdefine i55 @test19(i64 %A) nounwind {
180*9880d681SAndroid Build Coastguard Worker %B = sitofp i64 %A to double
181*9880d681SAndroid Build Coastguard Worker %C = fptosi double %B to i55
182*9880d681SAndroid Build Coastguard Worker ret i55 %C
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185