b2dcfa63290175fea13f4e34024cb35b437a3561
[oota-llvm.git] / test / Transforms / InstCombine / x86-vector-shifts.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s\r
2 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"\r
3 \r
4 define <2 x i64> @test_sse2_1() nounwind readnone uwtable {\r
5   %S = bitcast i32 1 to i32\r
6   %1 = zext i32 %S to i64\r
7   %2 = insertelement <2 x i64> undef, i64 %1, i32 0\r
8   %3 = insertelement <2 x i64> %2, i64 0, i32 1\r
9   %4 = bitcast <2 x i64> %3 to <8 x i16>\r
10   %5 = tail call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>, <8 x i16> %4)\r
11   %6 = bitcast <8 x i16> %5 to <4 x i32>\r
12   %7 = bitcast <2 x i64> %3 to <4 x i32>\r
13   %8 = tail call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %6, <4 x i32> %7)\r
14   %9 = bitcast <4 x i32> %8 to <2 x i64>\r
15   %10 = tail call <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %9, <2 x i64> %3)\r
16   %11 = bitcast <2 x i64> %10 to <8 x i16>\r
17   %12 = tail call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %11, i32 %S)\r
18   %13 = bitcast <8 x i16> %12 to <4 x i32>\r
19   %14 = tail call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %13, i32 %S)\r
20   %15 = bitcast <4 x i32> %14 to <2 x i64>\r
21   %16 = tail call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %15, i32 %S)\r
22   ret <2 x i64> %16\r
23 ; CHECK: test_sse2_1\r
24 ; CHECK: ret <2 x i64> <i64 72058418680037440, i64 144117112246370624>\r
25 }\r
26 \r
27 define <4 x i64> @test_avx2_1() nounwind readnone uwtable {\r
28   %S = bitcast i32 1 to i32\r
29   %1 = zext i32 %S to i64\r
30   %2 = insertelement <2 x i64> undef, i64 %1, i32 0\r
31   %3 = insertelement <2 x i64> %2, i64 0, i32 1\r
32   %4 = bitcast <2 x i64> %3 to <8 x i16>\r
33   %5 = tail call <16 x i16> @llvm.x86.avx2.psll.w(<16 x i16> <i16 1, i16 0, i16 0, i16 0, i16 2, i16 0, i16 0, i16 0, i16 3, i16 0, i16 0, i16 0, i16 4, i16 0, i16 0, i16 0>, <8 x i16> %4)\r
34   %6 = bitcast <16 x i16> %5 to <8 x i32>\r
35   %7 = bitcast <2 x i64> %3 to <4 x i32>\r
36   %8 = tail call <8 x i32> @llvm.x86.avx2.psll.d(<8 x i32> %6, <4 x i32> %7)\r
37   %9 = bitcast <8 x i32> %8 to <4 x i64>\r
38   %10 = tail call <4 x i64> @llvm.x86.avx2.psll.q(<4 x i64> %9, <2 x i64> %3)\r
39   %11 = bitcast <4 x i64> %10 to <16 x i16>\r
40   %12 = tail call <16 x i16> @llvm.x86.avx2.pslli.w(<16 x i16> %11, i32 %S)\r
41   %13 = bitcast <16 x i16> %12 to <8 x i32>\r
42   %14 = tail call <8 x i32> @llvm.x86.avx2.pslli.d(<8 x i32> %13, i32 %S)\r
43   %15 = bitcast <8 x i32> %14 to <4 x i64>\r
44   %16 = tail call <4 x i64> @llvm.x86.avx2.pslli.q(<4 x i64> %15, i32 %S)\r
45   ret <4 x i64> %16\r
46 ; CHECK: test_avx2_1\r
47 ; CHECK: ret <4 x i64> <i64 64, i64 128, i64 192, i64 256>\r
48 }\r
49 \r
50 define <2 x i64> @test_sse2_0() nounwind readnone uwtable {\r
51   %S = bitcast i32 128 to i32\r
52   %1 = zext i32 %S to i64\r
53   %2 = insertelement <2 x i64> undef, i64 %1, i32 0\r
54   %3 = insertelement <2 x i64> %2, i64 0, i32 1\r
55   %4 = bitcast <2 x i64> %3 to <8 x i16>\r
56   %5 = tail call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>, <8 x i16> %4)\r
57   %6 = bitcast <8 x i16> %5 to <4 x i32>\r
58   %7 = bitcast <2 x i64> %3 to <4 x i32>\r
59   %8 = tail call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %6, <4 x i32> %7)\r
60   %9 = bitcast <4 x i32> %8 to <2 x i64>\r
61   %10 = tail call <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %9, <2 x i64> %3)\r
62   %11 = bitcast <2 x i64> %10 to <8 x i16>\r
63   %12 = tail call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %11, i32 %S)\r
64   %13 = bitcast <8 x i16> %12 to <4 x i32>\r
65   %14 = tail call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %13, i32 %S)\r
66   %15 = bitcast <4 x i32> %14 to <2 x i64>\r
67   %16 = tail call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %15, i32 %S)\r
68   ret <2 x i64> %16\r
69 ; CHECK: test_sse2_0\r
70 ; CHECK: ret <2 x i64> zeroinitializer\r
71 }\r
72 \r
73 define <4 x i64> @test_avx2_0() nounwind readnone uwtable {\r
74   %S = bitcast i32 128 to i32\r
75   %1 = zext i32 %S to i64\r
76   %2 = insertelement <2 x i64> undef, i64 %1, i32 0\r
77   %3 = insertelement <2 x i64> %2, i64 0, i32 1\r
78   %4 = bitcast <2 x i64> %3 to <8 x i16>\r
79   %5 = tail call <16 x i16> @llvm.x86.avx2.psll.w(<16 x i16> <i16 1, i16 0, i16 0, i16 0, i16 2, i16 0, i16 0, i16 0, i16 3, i16 0, i16 0, i16 0, i16 4, i16 0, i16 0, i16 0>, <8 x i16> %4)\r
80   %6 = bitcast <16 x i16> %5 to <8 x i32>\r
81   %7 = bitcast <2 x i64> %3 to <4 x i32>\r
82   %8 = tail call <8 x i32> @llvm.x86.avx2.psll.d(<8 x i32> %6, <4 x i32> %7)\r
83   %9 = bitcast <8 x i32> %8 to <4 x i64>\r
84   %10 = tail call <4 x i64> @llvm.x86.avx2.psll.q(<4 x i64> %9, <2 x i64> %3)\r
85   %11 = bitcast <4 x i64> %10 to <16 x i16>\r
86   %12 = tail call <16 x i16> @llvm.x86.avx2.pslli.w(<16 x i16> %11, i32 %S)\r
87   %13 = bitcast <16 x i16> %12 to <8 x i32>\r
88   %14 = tail call <8 x i32> @llvm.x86.avx2.pslli.d(<8 x i32> %13, i32 %S)\r
89   %15 = bitcast <8 x i32> %14 to <4 x i64>\r
90   %16 = tail call <4 x i64> @llvm.x86.avx2.pslli.q(<4 x i64> %15, i32 %S)\r
91   ret <4 x i64> %16\r
92 ; CHECK: test_avx2_0\r
93 ; CHECK: ret <4 x i64> zeroinitializer\r
94 }\r
95 define <2 x i64> @test_sse2_psrl_1() nounwind readnone uwtable {\r
96   %S = bitcast i32 1 to i32\r
97   %1 = zext i32 %S to i64\r
98   %2 = insertelement <2 x i64> undef, i64 %1, i32 0\r
99   %3 = insertelement <2 x i64> %2, i64 0, i32 1\r
100   %4 = bitcast <2 x i64> %3 to <8 x i16>\r
101   %5 = tail call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> <i16 16, i16 32, i16 64, i16 128, i16 256, i16 512, i16 1024, i16 2048>, <8 x i16> %4)\r
102   %6 = bitcast <8 x i16> %5 to <4 x i32>\r
103   %7 = bitcast <2 x i64> %3 to <4 x i32>\r
104   %8 = tail call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %6, <4 x i32> %7)\r
105   %9 = bitcast <4 x i32> %8 to <2 x i64>\r
106   %10 = tail call <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %9, <2 x i64> %3)\r
107   %11 = bitcast <2 x i64> %10 to <8 x i16>\r
108   %12 = tail call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %11, i32 %S)\r
109   %13 = bitcast <8 x i16> %12 to <4 x i32>\r
110   %14 = tail call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %13, i32 %S)\r
111   %15 = bitcast <4 x i32> %14 to <2 x i64>\r
112   %16 = tail call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %15, i32 %S)\r
113   ret <2 x i64> %16\r
114 ; CHECK: test_sse2_psrl_1\r
115 ; CHECK: ret <2 x i64> <i64 562954248421376, i64 9007267974742020>\r
116 }\r
117 \r
118 define <4 x i64> @test_avx2_psrl_1() nounwind readnone uwtable {\r
119   %S = bitcast i32 1 to i32\r
120   %1 = zext i32 %S to i64\r
121   %2 = insertelement <2 x i64> undef, i64 %1, i32 0\r
122   %3 = insertelement <2 x i64> %2, i64 0, i32 1\r
123   %4 = bitcast <2 x i64> %3 to <8 x i16>\r
124   %5 = tail call <16 x i16> @llvm.x86.avx2.psrl.w(<16 x i16> <i16 1024, i16 0, i16 0, i16 0, i16 2048, i16 0, i16 0, i16 0, i16 4096, i16 0, i16 0, i16 0, i16 8192, i16 0, i16 0, i16 0>, <8 x i16> %4)\r
125   %6 = bitcast <16 x i16> %5 to <8 x i32>\r
126   %7 = bitcast <2 x i64> %3 to <4 x i32>\r
127   %8 = tail call <8 x i32> @llvm.x86.avx2.psrl.d(<8 x i32> %6, <4 x i32> %7)\r
128   %9 = bitcast <8 x i32> %8 to <4 x i64>\r
129   %10 = tail call <4 x i64> @llvm.x86.avx2.psrl.q(<4 x i64> %9, <2 x i64> %3)\r
130   %11 = bitcast <4 x i64> %10 to <16 x i16>\r
131   %12 = tail call <16 x i16> @llvm.x86.avx2.psrli.w(<16 x i16> %11, i32 %S)\r
132   %13 = bitcast <16 x i16> %12 to <8 x i32>\r
133   %14 = tail call <8 x i32> @llvm.x86.avx2.psrli.d(<8 x i32> %13, i32 %S)\r
134   %15 = bitcast <8 x i32> %14 to <4 x i64>\r
135   %16 = tail call <4 x i64> @llvm.x86.avx2.psrli.q(<4 x i64> %15, i32 %S)\r
136   ret <4 x i64> %16\r
137 ; CHECK: test_avx2_psrl_1\r
138 ; CHECK: ret <4 x i64> <i64 16, i64 32, i64 64, i64 128>\r
139 }\r
140 \r
141 define <2 x i64> @test_sse2_psrl_0() nounwind readnone uwtable {\r
142   %S = bitcast i32 128 to i32\r
143   %1 = zext i32 %S to i64\r
144   %2 = insertelement <2 x i64> undef, i64 %1, i32 0\r
145   %3 = insertelement <2 x i64> %2, i64 0, i32 1\r
146   %4 = bitcast <2 x i64> %3 to <8 x i16>\r
147   %5 = tail call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> <i16 32, i16 64, i16 128, i16 256, i16 512, i16 1024, i16 2048, i16 4096>, <8 x i16> %4)\r
148   %6 = bitcast <8 x i16> %5 to <4 x i32>\r
149   %7 = bitcast <2 x i64> %3 to <4 x i32>\r
150   %8 = tail call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %6, <4 x i32> %7)\r
151   %9 = bitcast <4 x i32> %8 to <2 x i64>\r
152   %10 = tail call <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %9, <2 x i64> %3)\r
153   %11 = bitcast <2 x i64> %10 to <8 x i16>\r
154   %12 = tail call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %11, i32 %S)\r
155   %13 = bitcast <8 x i16> %12 to <4 x i32>\r
156   %14 = tail call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %13, i32 %S)\r
157   %15 = bitcast <4 x i32> %14 to <2 x i64>\r
158   %16 = tail call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %15, i32 %S)\r
159   ret <2 x i64> %16\r
160 ; CHECK: test_sse2_psrl_0\r
161 ; CHECK: ret <2 x i64> zeroinitializer\r
162 }\r
163 \r
164 define <4 x i64> @test_avx2_psrl_0() nounwind readnone uwtable {\r
165   %S = bitcast i32 128 to i32\r
166   %1 = zext i32 %S to i64\r
167   %2 = insertelement <2 x i64> undef, i64 %1, i32 0\r
168   %3 = insertelement <2 x i64> %2, i64 0, i32 1\r
169   %4 = bitcast <2 x i64> %3 to <8 x i16>\r
170   %5 = tail call <16 x i16> @llvm.x86.avx2.psrl.w(<16 x i16> <i16 1024, i16 0, i16 0, i16 0, i16 2048, i16 0, i16 0, i16 0, i16 4096, i16 0, i16 0, i16 0, i16 8192, i16 0, i16 0, i16 0>, <8 x i16> %4)\r
171   %6 = bitcast <16 x i16> %5 to <8 x i32>\r
172   %7 = bitcast <2 x i64> %3 to <4 x i32>\r
173   %8 = tail call <8 x i32> @llvm.x86.avx2.psrl.d(<8 x i32> %6, <4 x i32> %7)\r
174   %9 = bitcast <8 x i32> %8 to <4 x i64>\r
175   %10 = tail call <4 x i64> @llvm.x86.avx2.psrl.q(<4 x i64> %9, <2 x i64> %3)\r
176   %11 = bitcast <4 x i64> %10 to <16 x i16>\r
177   %12 = tail call <16 x i16> @llvm.x86.avx2.psrli.w(<16 x i16> %11, i32 %S)\r
178   %13 = bitcast <16 x i16> %12 to <8 x i32>\r
179   %14 = tail call <8 x i32> @llvm.x86.avx2.psrli.d(<8 x i32> %13, i32 %S)\r
180   %15 = bitcast <8 x i32> %14 to <4 x i64>\r
181   %16 = tail call <4 x i64> @llvm.x86.avx2.psrli.q(<4 x i64> %15, i32 %S)\r
182   ret <4 x i64> %16\r
183 ; CHECK: test_avx2_psrl_0\r
184 ; CHECK: ret <4 x i64> zeroinitializer\r
185 }\r
186 \r
187 declare <4 x i64> @llvm.x86.avx2.pslli.q(<4 x i64>, i32) #1\r
188 declare <8 x i32> @llvm.x86.avx2.pslli.d(<8 x i32>, i32) #1\r
189 declare <16 x i16> @llvm.x86.avx2.pslli.w(<16 x i16>, i32) #1\r
190 declare <4 x i64> @llvm.x86.avx2.psll.q(<4 x i64>, <2 x i64>) #1\r
191 declare <8 x i32> @llvm.x86.avx2.psll.d(<8 x i32>, <4 x i32>) #1\r
192 declare <16 x i16> @llvm.x86.avx2.psll.w(<16 x i16>, <8 x i16>) #1\r
193 declare <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64>, i32) #1\r
194 declare <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32>, i32) #1\r
195 declare <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16>, i32) #1\r
196 declare <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64>, <2 x i64>) #1\r
197 declare <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32>, <4 x i32>) #1\r
198 declare <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16>, <8 x i16>) #1\r
199 declare <4 x i64> @llvm.x86.avx2.psrli.q(<4 x i64>, i32) #1\r
200 declare <8 x i32> @llvm.x86.avx2.psrli.d(<8 x i32>, i32) #1\r
201 declare <16 x i16> @llvm.x86.avx2.psrli.w(<16 x i16>, i32) #1\r
202 declare <4 x i64> @llvm.x86.avx2.psrl.q(<4 x i64>, <2 x i64>) #1\r
203 declare <8 x i32> @llvm.x86.avx2.psrl.d(<8 x i32>, <4 x i32>) #1\r
204 declare <16 x i16> @llvm.x86.avx2.psrl.w(<16 x i16>, <8 x i16>) #1\r
205 declare <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64>, i32) #1\r
206 declare <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32>, i32) #1\r
207 declare <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16>, i32) #1\r
208 declare <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64>, <2 x i64>) #1\r
209 declare <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32>, <4 x i32>) #1\r
210 declare <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16>, <8 x i16>) #1\r
211 \r
212 attributes #1 = { nounwind readnone }\r