blob: d1820414611c78a441e461d733813af47761da2a [file] [log] [blame]
Justin Bognerd2a10ad2017-05-13 05:52:17 +00001; RUN: opt < %s -constprop -S | FileCheck %s
2; RUN: opt < %s -constprop -disable-simplify-libcalls -S | FileCheck %s --check-prefix=FNOBUILTIN
3; REQUIRES: x86
4
5define i1 @test_sse_cvts_exact() nounwind readnone {
6; CHECK-LABEL: @test_sse_cvts_exact(
7; CHECK-NOT: call
8; CHECK: ret i1 true
9entry:
10 %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind
11 %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind
12 %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> <double 7.0, double undef>) nounwind
13 %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> <double 7.0, double undef>) nounwind
14 %sum02 = add i32 %i0, %i2
15 %sum13 = add i64 %i1, %i3
16 %cmp02 = icmp eq i32 %sum02, 10
17 %cmp13 = icmp eq i64 %sum13, 10
18 %b = and i1 %cmp02, %cmp13
19 ret i1 %b
20}
21
22; Inexact values should not fold as they are dependent on rounding mode
23define i1 @test_sse_cvts_inexact() nounwind readnone {
24; CHECK-LABEL: @test_sse_cvts_inexact(
25; CHECK: call
26; CHECK: call
27; CHECK: call
28; CHECK: call
29entry:
30 %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind
31 %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind
32 %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> <double 1.75, double undef>) nounwind
33 %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> <double 1.75, double undef>) nounwind
34 %sum02 = add i32 %i0, %i2
35 %sum13 = add i64 %i1, %i3
36 %cmp02 = icmp eq i32 %sum02, 4
37 %cmp13 = icmp eq i64 %sum13, 4
38 %b = and i1 %cmp02, %cmp13
39 ret i1 %b
40}
41
42; FLT_MAX/DBL_MAX should not fold
43define i1 @test_sse_cvts_max() nounwind readnone {
44; CHECK-LABEL: @test_sse_cvts_max(
45; CHECK: call
46; CHECK: call
47; CHECK: call
48; CHECK: call
49entry:
50 %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float>
51 %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double>
52 %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind
53 %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind
54 %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind
55 %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind
56 %sum02 = add i32 %i0, %i2
57 %sum13 = add i64 %i1, %i3
58 %sum02.sext = sext i32 %sum02 to i64
59 %b = icmp eq i64 %sum02.sext, %sum13
60 ret i1 %b
61}
62
63; INF should not fold
64define i1 @test_sse_cvts_inf() nounwind readnone {
65; CHECK-LABEL: @test_sse_cvts_inf(
66; CHECK: call
67; CHECK: call
68; CHECK: call
69; CHECK: call
70entry:
71 %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float>
72 %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double>
73 %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind
74 %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind
75 %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind
76 %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind
77 %sum02 = add i32 %i0, %i2
78 %sum13 = add i64 %i1, %i3
79 %sum02.sext = sext i32 %sum02 to i64
80 %b = icmp eq i64 %sum02.sext, %sum13
81 ret i1 %b
82}
83
84; NAN should not fold
85define i1 @test_sse_cvts_nan() nounwind readnone {
86; CHECK-LABEL: @test_sse_cvts_nan(
87; CHECK: call
88; CHECK: call
89; CHECK: call
90; CHECK: call
91entry:
92 %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float>
93 %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double>
94 %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind
95 %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind
96 %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind
97 %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind
98 %sum02 = add i32 %i0, %i2
99 %sum13 = add i64 %i1, %i3
100 %sum02.sext = sext i32 %sum02 to i64
101 %b = icmp eq i64 %sum02.sext, %sum13
102 ret i1 %b
103}
104
105define i1 @test_sse_cvtts_exact() nounwind readnone {
106; CHECK-LABEL: @test_sse_cvtts_exact(
107; CHECK-NOT: call
108; CHECK: ret i1 true
109entry:
110 %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind
111 %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind
112 %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> <double 7.0, double undef>) nounwind
113 %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> <double 7.0, double undef>) nounwind
114 %sum02 = add i32 %i0, %i2
115 %sum13 = add i64 %i1, %i3
116 %cmp02 = icmp eq i32 %sum02, 10
117 %cmp13 = icmp eq i64 %sum13, 10
118 %b = and i1 %cmp02, %cmp13
119 ret i1 %b
120}
121
122define i1 @test_sse_cvtts_inexact() nounwind readnone {
123; CHECK-LABEL: @test_sse_cvtts_inexact(
124; CHECK-NOT: call
125; CHECK: ret i1 true
126entry:
127 %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind
128 %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind
129 %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> <double 1.75, double undef>) nounwind
130 %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> <double 1.75, double undef>) nounwind
131 %sum02 = add i32 %i0, %i2
132 %sum13 = add i64 %i1, %i3
133 %cmp02 = icmp eq i32 %sum02, 2
134 %cmp13 = icmp eq i64 %sum13, 2
135 %b = and i1 %cmp02, %cmp13
136 ret i1 %b
137}
138
139; FLT_MAX/DBL_MAX should not fold
140define i1 @test_sse_cvtts_max() nounwind readnone {
141; CHECK-LABEL: @test_sse_cvtts_max(
142; CHECK: call
143; CHECK: call
144; CHECK: call
145; CHECK: call
146entry:
147 %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float>
148 %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double>
149 %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind
150 %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind
151 %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind
152 %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind
153 %sum02 = add i32 %i0, %i2
154 %sum13 = add i64 %i1, %i3
155 %sum02.sext = sext i32 %sum02 to i64
156 %b = icmp eq i64 %sum02.sext, %sum13
157 ret i1 %b
158}
159
160; INF should not fold
161define i1 @test_sse_cvtts_inf() nounwind readnone {
162; CHECK-LABEL: @test_sse_cvtts_inf(
163; CHECK: call
164; CHECK: call
165; CHECK: call
166; CHECK: call
167entry:
168 %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float>
169 %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double>
170 %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind
171 %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind
172 %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind
173 %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind
174 %sum02 = add i32 %i0, %i2
175 %sum13 = add i64 %i1, %i3
176 %sum02.sext = sext i32 %sum02 to i64
177 %b = icmp eq i64 %sum02.sext, %sum13
178 ret i1 %b
179}
180
181; NAN should not fold
182define i1 @test_sse_cvtts_nan() nounwind readnone {
183; CHECK-LABEL: @test_sse_cvtts_nan(
184; CHECK: call
185; CHECK: call
186; CHECK: call
187; CHECK: call
188entry:
189 %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float>
190 %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double>
191 %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind
192 %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind
193 %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind
194 %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind
195 %sum02 = add i32 %i0, %i2
196 %sum13 = add i64 %i1, %i3
197 %sum02.sext = sext i32 %sum02 to i64
198 %b = icmp eq i64 %sum02.sext, %sum13
199 ret i1 %b
200}
201
202declare i32 @llvm.x86.sse.cvtss2si(<4 x float>) nounwind readnone
203declare i32 @llvm.x86.sse.cvttss2si(<4 x float>) nounwind readnone
204declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
205declare i64 @llvm.x86.sse.cvttss2si64(<4 x float>) nounwind readnone
206declare i32 @llvm.x86.sse2.cvtsd2si(<2 x double>) nounwind readnone
207declare i32 @llvm.x86.sse2.cvttsd2si(<2 x double>) nounwind readnone
208declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
209declare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>) nounwind readnone