xref: /llvm-project/llvm/test/Transforms/InstSimplify/ConstProp/sse.ll (revision b280ee1dd7e9b36ae7aaa3953556e4b7a7f31a29)
1*b280ee1dSBjorn Pettersson; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
2486ed885SArthur Eubanks; REQUIRES: x86-registered-target
3486ed885SArthur Eubanks
4486ed885SArthur Eubanksdefine i1 @test_sse_cvts_exact() nounwind readnone {
5486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvts_exact(
6486ed885SArthur Eubanks; CHECK-NOT: call
7486ed885SArthur Eubanks; CHECK: ret i1 true
8486ed885SArthur Eubanksentry:
9486ed885SArthur Eubanks  %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind
10486ed885SArthur Eubanks  %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind
11486ed885SArthur Eubanks  %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> <double 7.0, double undef>) nounwind
12486ed885SArthur Eubanks  %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> <double 7.0, double undef>) nounwind
13486ed885SArthur Eubanks  %sum02 = add i32 %i0, %i2
14486ed885SArthur Eubanks  %sum13 = add i64 %i1, %i3
15486ed885SArthur Eubanks  %cmp02 = icmp eq i32 %sum02, 10
16486ed885SArthur Eubanks  %cmp13 = icmp eq i64 %sum13, 10
17486ed885SArthur Eubanks  %b = and i1 %cmp02, %cmp13
18486ed885SArthur Eubanks  ret i1 %b
19486ed885SArthur Eubanks}
20486ed885SArthur Eubanks
21486ed885SArthur Eubanks; Inexact values should not fold as they are dependent on rounding mode
22486ed885SArthur Eubanksdefine i1 @test_sse_cvts_inexact() nounwind readnone {
23486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvts_inexact(
24486ed885SArthur Eubanks; CHECK: call
25486ed885SArthur Eubanks; CHECK: call
26486ed885SArthur Eubanks; CHECK: call
27486ed885SArthur Eubanks; CHECK: call
28486ed885SArthur Eubanksentry:
29486ed885SArthur Eubanks  %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind
30486ed885SArthur Eubanks  %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind
31486ed885SArthur Eubanks  %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> <double 1.75, double undef>) nounwind
32486ed885SArthur Eubanks  %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> <double 1.75, double undef>) nounwind
33486ed885SArthur Eubanks  %sum02 = add i32 %i0, %i2
34486ed885SArthur Eubanks  %sum13 = add i64 %i1, %i3
35486ed885SArthur Eubanks  %cmp02 = icmp eq i32 %sum02, 4
36486ed885SArthur Eubanks  %cmp13 = icmp eq i64 %sum13, 4
37486ed885SArthur Eubanks  %b = and i1 %cmp02, %cmp13
38486ed885SArthur Eubanks  ret i1 %b
39486ed885SArthur Eubanks}
40486ed885SArthur Eubanks
41486ed885SArthur Eubanks; FLT_MAX/DBL_MAX should not fold
42486ed885SArthur Eubanksdefine i1 @test_sse_cvts_max() nounwind readnone {
43486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvts_max(
44486ed885SArthur Eubanks; CHECK: call
45486ed885SArthur Eubanks; CHECK: call
46486ed885SArthur Eubanks; CHECK: call
47486ed885SArthur Eubanks; CHECK: call
48486ed885SArthur Eubanksentry:
49486ed885SArthur Eubanks  %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float>
50486ed885SArthur Eubanks  %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double>
51486ed885SArthur Eubanks  %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind
52486ed885SArthur Eubanks  %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind
53486ed885SArthur Eubanks  %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind
54486ed885SArthur Eubanks  %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind
55486ed885SArthur Eubanks  %sum02 = add i32 %i0, %i2
56486ed885SArthur Eubanks  %sum13 = add i64 %i1, %i3
57486ed885SArthur Eubanks  %sum02.sext = sext i32 %sum02 to i64
58486ed885SArthur Eubanks  %b = icmp eq i64 %sum02.sext, %sum13
59486ed885SArthur Eubanks  ret i1 %b
60486ed885SArthur Eubanks}
61486ed885SArthur Eubanks
62486ed885SArthur Eubanks; INF should not fold
63486ed885SArthur Eubanksdefine i1 @test_sse_cvts_inf() nounwind readnone {
64486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvts_inf(
65486ed885SArthur Eubanks; CHECK: call
66486ed885SArthur Eubanks; CHECK: call
67486ed885SArthur Eubanks; CHECK: call
68486ed885SArthur Eubanks; CHECK: call
69486ed885SArthur Eubanksentry:
70486ed885SArthur Eubanks  %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float>
71486ed885SArthur Eubanks  %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double>
72486ed885SArthur Eubanks  %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind
73486ed885SArthur Eubanks  %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind
74486ed885SArthur Eubanks  %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind
75486ed885SArthur Eubanks  %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind
76486ed885SArthur Eubanks  %sum02 = add i32 %i0, %i2
77486ed885SArthur Eubanks  %sum13 = add i64 %i1, %i3
78486ed885SArthur Eubanks  %sum02.sext = sext i32 %sum02 to i64
79486ed885SArthur Eubanks  %b = icmp eq i64 %sum02.sext, %sum13
80486ed885SArthur Eubanks  ret i1 %b
81486ed885SArthur Eubanks}
82486ed885SArthur Eubanks
83486ed885SArthur Eubanks; NAN should not fold
84486ed885SArthur Eubanksdefine i1 @test_sse_cvts_nan() nounwind readnone {
85486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvts_nan(
86486ed885SArthur Eubanks; CHECK: call
87486ed885SArthur Eubanks; CHECK: call
88486ed885SArthur Eubanks; CHECK: call
89486ed885SArthur Eubanks; CHECK: call
90486ed885SArthur Eubanksentry:
91486ed885SArthur Eubanks  %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float>
92486ed885SArthur Eubanks  %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double>
93486ed885SArthur Eubanks  %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind
94486ed885SArthur Eubanks  %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind
95486ed885SArthur Eubanks  %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind
96486ed885SArthur Eubanks  %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind
97486ed885SArthur Eubanks  %sum02 = add i32 %i0, %i2
98486ed885SArthur Eubanks  %sum13 = add i64 %i1, %i3
99486ed885SArthur Eubanks  %sum02.sext = sext i32 %sum02 to i64
100486ed885SArthur Eubanks  %b = icmp eq i64 %sum02.sext, %sum13
101486ed885SArthur Eubanks  ret i1 %b
102486ed885SArthur Eubanks}
103486ed885SArthur Eubanks
104486ed885SArthur Eubanksdefine i1 @test_sse_cvtts_exact() nounwind readnone {
105486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvtts_exact(
106486ed885SArthur Eubanks; CHECK-NOT: call
107486ed885SArthur Eubanks; CHECK: ret i1 true
108486ed885SArthur Eubanksentry:
109486ed885SArthur Eubanks  %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind
110486ed885SArthur Eubanks  %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind
111486ed885SArthur Eubanks  %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> <double 7.0, double undef>) nounwind
112486ed885SArthur Eubanks  %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> <double 7.0, double undef>) nounwind
113486ed885SArthur Eubanks  %sum02 = add i32 %i0, %i2
114486ed885SArthur Eubanks  %sum13 = add i64 %i1, %i3
115486ed885SArthur Eubanks  %cmp02 = icmp eq i32 %sum02, 10
116486ed885SArthur Eubanks  %cmp13 = icmp eq i64 %sum13, 10
117486ed885SArthur Eubanks  %b = and i1 %cmp02, %cmp13
118486ed885SArthur Eubanks  ret i1 %b
119486ed885SArthur Eubanks}
120486ed885SArthur Eubanks
121486ed885SArthur Eubanksdefine i1 @test_sse_cvtts_inexact() nounwind readnone {
122486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvtts_inexact(
123486ed885SArthur Eubanks; CHECK-NOT: call
124486ed885SArthur Eubanks; CHECK: ret i1 true
125486ed885SArthur Eubanksentry:
126486ed885SArthur Eubanks  %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind
127486ed885SArthur Eubanks  %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind
128486ed885SArthur Eubanks  %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> <double 1.75, double undef>) nounwind
129486ed885SArthur Eubanks  %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> <double 1.75, double undef>) nounwind
130486ed885SArthur Eubanks  %sum02 = add i32 %i0, %i2
131486ed885SArthur Eubanks  %sum13 = add i64 %i1, %i3
132486ed885SArthur Eubanks  %cmp02 = icmp eq i32 %sum02, 2
133486ed885SArthur Eubanks  %cmp13 = icmp eq i64 %sum13, 2
134486ed885SArthur Eubanks  %b = and i1 %cmp02, %cmp13
135486ed885SArthur Eubanks  ret i1 %b
136486ed885SArthur Eubanks}
137486ed885SArthur Eubanks
138486ed885SArthur Eubanks; FLT_MAX/DBL_MAX should not fold
139486ed885SArthur Eubanksdefine i1 @test_sse_cvtts_max() nounwind readnone {
140486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvtts_max(
141486ed885SArthur Eubanks; CHECK: call
142486ed885SArthur Eubanks; CHECK: call
143486ed885SArthur Eubanks; CHECK: call
144486ed885SArthur Eubanks; CHECK: call
145486ed885SArthur Eubanksentry:
146486ed885SArthur Eubanks  %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float>
147486ed885SArthur Eubanks  %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double>
148486ed885SArthur Eubanks  %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind
149486ed885SArthur Eubanks  %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind
150486ed885SArthur Eubanks  %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind
151486ed885SArthur Eubanks  %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind
152486ed885SArthur Eubanks  %sum02 = add i32 %i0, %i2
153486ed885SArthur Eubanks  %sum13 = add i64 %i1, %i3
154486ed885SArthur Eubanks  %sum02.sext = sext i32 %sum02 to i64
155486ed885SArthur Eubanks  %b = icmp eq i64 %sum02.sext, %sum13
156486ed885SArthur Eubanks  ret i1 %b
157486ed885SArthur Eubanks}
158486ed885SArthur Eubanks
159486ed885SArthur Eubanks; INF should not fold
160486ed885SArthur Eubanksdefine i1 @test_sse_cvtts_inf() nounwind readnone {
161486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvtts_inf(
162486ed885SArthur Eubanks; CHECK: call
163486ed885SArthur Eubanks; CHECK: call
164486ed885SArthur Eubanks; CHECK: call
165486ed885SArthur Eubanks; CHECK: call
166486ed885SArthur Eubanksentry:
167486ed885SArthur Eubanks  %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float>
168486ed885SArthur Eubanks  %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double>
169486ed885SArthur Eubanks  %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind
170486ed885SArthur Eubanks  %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind
171486ed885SArthur Eubanks  %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind
172486ed885SArthur Eubanks  %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind
173486ed885SArthur Eubanks  %sum02 = add i32 %i0, %i2
174486ed885SArthur Eubanks  %sum13 = add i64 %i1, %i3
175486ed885SArthur Eubanks  %sum02.sext = sext i32 %sum02 to i64
176486ed885SArthur Eubanks  %b = icmp eq i64 %sum02.sext, %sum13
177486ed885SArthur Eubanks  ret i1 %b
178486ed885SArthur Eubanks}
179486ed885SArthur Eubanks
180486ed885SArthur Eubanks; NAN should not fold
181486ed885SArthur Eubanksdefine i1 @test_sse_cvtts_nan() nounwind readnone {
182486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvtts_nan(
183486ed885SArthur Eubanks; CHECK: call
184486ed885SArthur Eubanks; CHECK: call
185486ed885SArthur Eubanks; CHECK: call
186486ed885SArthur Eubanks; CHECK: call
187486ed885SArthur Eubanksentry:
188486ed885SArthur Eubanks  %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float>
189486ed885SArthur Eubanks  %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double>
190486ed885SArthur Eubanks  %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind
191486ed885SArthur Eubanks  %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind
192486ed885SArthur Eubanks  %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind
193486ed885SArthur Eubanks  %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind
194486ed885SArthur Eubanks  %sum02 = add i32 %i0, %i2
195486ed885SArthur Eubanks  %sum13 = add i64 %i1, %i3
196486ed885SArthur Eubanks  %sum02.sext = sext i32 %sum02 to i64
197486ed885SArthur Eubanks  %b = icmp eq i64 %sum02.sext, %sum13
198486ed885SArthur Eubanks  ret i1 %b
199486ed885SArthur Eubanks}
200486ed885SArthur Eubanks
201486ed885SArthur Eubanksdeclare i32 @llvm.x86.sse.cvtss2si(<4 x float>) nounwind readnone
202486ed885SArthur Eubanksdeclare i32 @llvm.x86.sse.cvttss2si(<4 x float>) nounwind readnone
203486ed885SArthur Eubanksdeclare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
204486ed885SArthur Eubanksdeclare i64 @llvm.x86.sse.cvttss2si64(<4 x float>) nounwind readnone
205486ed885SArthur Eubanksdeclare i32 @llvm.x86.sse2.cvtsd2si(<2 x double>) nounwind readnone
206486ed885SArthur Eubanksdeclare i32 @llvm.x86.sse2.cvttsd2si(<2 x double>) nounwind readnone
207486ed885SArthur Eubanksdeclare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
208486ed885SArthur Eubanksdeclare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>) nounwind readnone
209