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