1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -slp-vectorizer -S -o - -mtriple=x86_64-unknown-linux -mcpu=bdver2 -instcombine | FileCheck %s
3
4define <2 x i8> @g(<2 x i8> %x, <2 x i8> %y) {
5; CHECK-LABEL: @g(
6; CHECK-NEXT:    [[X0:%.*]] = extractelement <2 x i8> [[X:%.*]], i32 0
7; CHECK-NEXT:    [[Y1:%.*]] = extractelement <2 x i8> [[Y:%.*]], i32 1
8; CHECK-NEXT:    [[X0X0:%.*]] = mul i8 [[X0]], [[X0]]
9; CHECK-NEXT:    [[Y1Y1:%.*]] = mul i8 [[Y1]], [[Y1]]
10; CHECK-NEXT:    [[INS1:%.*]] = insertelement <2 x i8> undef, i8 [[X0X0]], i32 0
11; CHECK-NEXT:    [[INS2:%.*]] = insertelement <2 x i8> [[INS1]], i8 [[Y1Y1]], i32 1
12; CHECK-NEXT:    ret <2 x i8> [[INS2]]
13;
14  %x0 = extractelement <2 x i8> %x, i32 0
15  %y1 = extractelement <2 x i8> %y, i32 1
16  %x0x0 = mul i8 %x0, %x0
17  %y1y1 = mul i8 %y1, %y1
18  %ins1 = insertelement <2 x i8> undef, i8 %x0x0, i32 0
19  %ins2 = insertelement <2 x i8> %ins1, i8 %y1y1, i32 1
20  ret <2 x i8> %ins2
21}
22
23define <4 x i8> @h(<4 x i8> %x, <4 x i8> %y) {
24; CHECK-LABEL: @h(
25; CHECK-NEXT:    [[X0:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 0
26; CHECK-NEXT:    [[X3:%.*]] = extractelement <4 x i8> [[X]], i32 3
27; CHECK-NEXT:    [[Y1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i32 1
28; CHECK-NEXT:    [[Y2:%.*]] = extractelement <4 x i8> [[Y]], i32 2
29; CHECK-NEXT:    [[X0X0:%.*]] = mul i8 [[X0]], [[X0]]
30; CHECK-NEXT:    [[X3X3:%.*]] = mul i8 [[X3]], [[X3]]
31; CHECK-NEXT:    [[Y1Y1:%.*]] = mul i8 [[Y1]], [[Y1]]
32; CHECK-NEXT:    [[Y2Y2:%.*]] = mul i8 [[Y2]], [[Y2]]
33; CHECK-NEXT:    [[INS1:%.*]] = insertelement <4 x i8> undef, i8 [[X0X0]], i32 0
34; CHECK-NEXT:    [[INS2:%.*]] = insertelement <4 x i8> [[INS1]], i8 [[X3X3]], i32 1
35; CHECK-NEXT:    [[INS3:%.*]] = insertelement <4 x i8> [[INS2]], i8 [[Y1Y1]], i32 2
36; CHECK-NEXT:    [[INS4:%.*]] = insertelement <4 x i8> [[INS3]], i8 [[Y2Y2]], i32 3
37; CHECK-NEXT:    ret <4 x i8> [[INS4]]
38;
39  %x0 = extractelement <4 x i8> %x, i32 0
40  %x3 = extractelement <4 x i8> %x, i32 3
41  %y1 = extractelement <4 x i8> %y, i32 1
42  %y2 = extractelement <4 x i8> %y, i32 2
43  %x0x0 = mul i8 %x0, %x0
44  %x3x3 = mul i8 %x3, %x3
45  %y1y1 = mul i8 %y1, %y1
46  %y2y2 = mul i8 %y2, %y2
47  %ins1 = insertelement <4 x i8> undef, i8 %x0x0, i32 0
48  %ins2 = insertelement <4 x i8> %ins1, i8 %x3x3, i32 1
49  %ins3 = insertelement <4 x i8> %ins2, i8 %y1y1, i32 2
50  %ins4 = insertelement <4 x i8> %ins3, i8 %y2y2, i32 3
51  ret <4 x i8> %ins4
52}
53
54define <4 x i8> @h_undef(<4 x i8> %x, <4 x i8> %y) {
55; CHECK-LABEL: @h_undef(
56; CHECK-NEXT:    [[X3:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 3
57; CHECK-NEXT:    [[Y1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i32 1
58; CHECK-NEXT:    [[Y2:%.*]] = extractelement <4 x i8> [[Y]], i32 2
59; CHECK-NEXT:    [[X3X3:%.*]] = mul i8 [[X3]], [[X3]]
60; CHECK-NEXT:    [[Y1Y1:%.*]] = mul i8 [[Y1]], [[Y1]]
61; CHECK-NEXT:    [[Y2Y2:%.*]] = mul i8 [[Y2]], [[Y2]]
62; CHECK-NEXT:    [[INS2:%.*]] = insertelement <4 x i8> undef, i8 [[X3X3]], i32 1
63; CHECK-NEXT:    [[INS3:%.*]] = insertelement <4 x i8> [[INS2]], i8 [[Y1Y1]], i32 2
64; CHECK-NEXT:    [[INS4:%.*]] = insertelement <4 x i8> [[INS3]], i8 [[Y2Y2]], i32 3
65; CHECK-NEXT:    ret <4 x i8> [[INS4]]
66;
67  %x0 = extractelement <4 x i8> undef, i32 0
68  %x3 = extractelement <4 x i8> %x, i32 3
69  %y1 = extractelement <4 x i8> %y, i32 1
70  %y2 = extractelement <4 x i8> %y, i32 2
71  %x0x0 = mul i8 %x0, %x0
72  %x3x3 = mul i8 %x3, %x3
73  %y1y1 = mul i8 %y1, %y1
74  %y2y2 = mul i8 %y2, %y2
75  %ins1 = insertelement <4 x i8> undef, i8 %x0x0, i32 0
76  %ins2 = insertelement <4 x i8> %ins1, i8 %x3x3, i32 1
77  %ins3 = insertelement <4 x i8> %ins2, i8 %y1y1, i32 2
78  %ins4 = insertelement <4 x i8> %ins3, i8 %y2y2, i32 3
79  ret <4 x i8> %ins4
80}
81
82define i8 @i(<4 x i8> %x, <4 x i8> %y) {
83; CHECK-LABEL: @i(
84; CHECK-NEXT:    [[X0:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 0
85; CHECK-NEXT:    [[X3:%.*]] = extractelement <4 x i8> [[X]], i32 3
86; CHECK-NEXT:    [[Y1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i32 1
87; CHECK-NEXT:    [[Y2:%.*]] = extractelement <4 x i8> [[Y]], i32 2
88; CHECK-NEXT:    [[X0X0:%.*]] = mul i8 [[X0]], [[X0]]
89; CHECK-NEXT:    [[X3X3:%.*]] = mul i8 [[X3]], [[X3]]
90; CHECK-NEXT:    [[Y1Y1:%.*]] = mul i8 [[Y1]], [[Y1]]
91; CHECK-NEXT:    [[Y2Y2:%.*]] = mul i8 [[Y2]], [[Y2]]
92; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X0X0]], [[X3X3]]
93; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[Y1Y1]], [[Y2Y2]]
94; CHECK-NEXT:    [[TMP3:%.*]] = add i8 [[TMP1]], [[TMP2]]
95; CHECK-NEXT:    ret i8 [[TMP3]]
96;
97  %x0 = extractelement <4 x i8> %x, i32 0
98  %x3 = extractelement <4 x i8> %x, i32 3
99  %y1 = extractelement <4 x i8> %y, i32 1
100  %y2 = extractelement <4 x i8> %y, i32 2
101  %x0x0 = mul i8 %x0, %x0
102  %x3x3 = mul i8 %x3, %x3
103  %y1y1 = mul i8 %y1, %y1
104  %y2y2 = mul i8 %y2, %y2
105  %1 = add i8 %x0x0, %x3x3
106  %2 = add i8 %y1y1, %y2y2
107  %3 = add i8 %1, %2
108  ret i8 %3
109}
110
111define i8 @j(<4 x i8> %x, <4 x i8> %y) {
112; CHECK-LABEL: @j(
113; CHECK-NEXT:    [[X0:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 0
114; CHECK-NEXT:    [[X3:%.*]] = extractelement <4 x i8> [[X]], i32 3
115; CHECK-NEXT:    [[Y1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i32 1
116; CHECK-NEXT:    [[Y2:%.*]] = extractelement <4 x i8> [[Y]], i32 2
117; CHECK-NEXT:    [[X0X0:%.*]] = mul i8 [[X0]], [[X0]]
118; CHECK-NEXT:    [[X3X3:%.*]] = mul i8 [[X3]], [[X3]]
119; CHECK-NEXT:    [[Y1Y1:%.*]] = mul i8 [[Y1]], [[Y1]]
120; CHECK-NEXT:    [[Y2Y2:%.*]] = mul i8 [[Y2]], [[Y2]]
121; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X0X0]], [[X3X3]]
122; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[Y1Y1]], [[Y2Y2]]
123; CHECK-NEXT:    [[TMP3:%.*]] = sdiv i8 [[TMP1]], [[TMP2]]
124; CHECK-NEXT:    ret i8 [[TMP3]]
125;
126  %x0 = extractelement <4 x i8> %x, i32 0
127  %x3 = extractelement <4 x i8> %x, i32 3
128  %y1 = extractelement <4 x i8> %y, i32 1
129  %y2 = extractelement <4 x i8> %y, i32 2
130  %x0x0 = mul i8 %x0, %x0
131  %x3x3 = mul i8 %x3, %x3
132  %y1y1 = mul i8 %y1, %y1
133  %y2y2 = mul i8 %y2, %y2
134  %1 = add i8 %x0x0, %x3x3
135  %2 = add i8 %y1y1, %y2y2
136  %3 = sdiv i8 %1, %2
137  ret i8 %3
138}
139
140define i8 @k(<4 x i8> %x) {
141; CHECK-LABEL: @k(
142; CHECK-NEXT:    [[X0:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 0
143; CHECK-NEXT:    [[X3:%.*]] = extractelement <4 x i8> [[X]], i32 3
144; CHECK-NEXT:    [[X1:%.*]] = extractelement <4 x i8> [[X]], i32 1
145; CHECK-NEXT:    [[X2:%.*]] = extractelement <4 x i8> [[X]], i32 2
146; CHECK-NEXT:    [[X0X0:%.*]] = mul i8 [[X0]], [[X0]]
147; CHECK-NEXT:    [[X3X3:%.*]] = mul i8 [[X3]], [[X3]]
148; CHECK-NEXT:    [[X1X1:%.*]] = mul i8 [[X1]], [[X1]]
149; CHECK-NEXT:    [[X2X2:%.*]] = mul i8 [[X2]], [[X2]]
150; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X0X0]], [[X3X3]]
151; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[X1X1]], [[X2X2]]
152; CHECK-NEXT:    [[TMP3:%.*]] = sdiv i8 [[TMP1]], [[TMP2]]
153; CHECK-NEXT:    ret i8 [[TMP3]]
154;
155  %x0 = extractelement <4 x i8> %x, i32 0
156  %x3 = extractelement <4 x i8> %x, i32 3
157  %x1 = extractelement <4 x i8> %x, i32 1
158  %x2 = extractelement <4 x i8> %x, i32 2
159  %x0x0 = mul i8 %x0, %x0
160  %x3x3 = mul i8 %x3, %x3
161  %x1x1 = mul i8 %x1, %x1
162  %x2x2 = mul i8 %x2, %x2
163  %1 = add i8 %x0x0, %x3x3
164  %2 = add i8 %x1x1, %x2x2
165  %3 = sdiv i8 %1, %2
166  ret i8 %3
167}
168
169define i8 @k_bb(<4 x i8> %x) {
170; CHECK-LABEL: @k_bb(
171; CHECK-NEXT:    [[X0:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 0
172; CHECK-NEXT:    br label [[BB1:%.*]]
173; CHECK:       bb1:
174; CHECK-NEXT:    [[X3:%.*]] = extractelement <4 x i8> [[X]], i32 3
175; CHECK-NEXT:    [[X1:%.*]] = extractelement <4 x i8> [[X]], i32 1
176; CHECK-NEXT:    [[X2:%.*]] = extractelement <4 x i8> [[X]], i32 2
177; CHECK-NEXT:    [[X0X0:%.*]] = mul i8 [[X0]], [[X0]]
178; CHECK-NEXT:    [[X3X3:%.*]] = mul i8 [[X3]], [[X3]]
179; CHECK-NEXT:    [[X1X1:%.*]] = mul i8 [[X1]], [[X1]]
180; CHECK-NEXT:    [[X2X2:%.*]] = mul i8 [[X2]], [[X2]]
181; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X0X0]], [[X3X3]]
182; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[X1X1]], [[X2X2]]
183; CHECK-NEXT:    [[TMP3:%.*]] = sdiv i8 [[TMP1]], [[TMP2]]
184; CHECK-NEXT:    ret i8 [[TMP3]]
185;
186  %x0 = extractelement <4 x i8> %x, i32 0
187  br label %bb1
188bb1:
189  %x3 = extractelement <4 x i8> %x, i32 3
190  %x1 = extractelement <4 x i8> %x, i32 1
191  %x2 = extractelement <4 x i8> %x, i32 2
192  %x0x0 = mul i8 %x0, %x0
193  %x3x3 = mul i8 %x3, %x3
194  %x1x1 = mul i8 %x1, %x1
195  %x2x2 = mul i8 %x2, %x2
196  %1 = add i8 %x0x0, %x3x3
197  %2 = add i8 %x1x1, %x2x2
198  %3 = sdiv i8 %1, %2
199  ret i8 %3
200}
201