[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / SLPVectorizer / X86 / matched-shuffled-entries.ll
blob2dbdad91764d6d73c308e236f5059b2f97b42c2e
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -slp-vectorizer -S -o - -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 -slp-threshold=50 -slp-recursion-max-depth=6 < %s | FileCheck %s
4 define i32 @bar() local_unnamed_addr {
5 ; CHECK-LABEL: @bar(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[ADD78_1:%.*]] = add nsw i32 undef, undef
8 ; CHECK-NEXT:    [[SUB86_1:%.*]] = sub nsw i32 undef, undef
9 ; CHECK-NEXT:    [[ADD94_1:%.*]] = add nsw i32 undef, undef
10 ; CHECK-NEXT:    [[SUB102_1:%.*]] = sub nsw i32 undef, undef
11 ; CHECK-NEXT:    [[ADD78_2:%.*]] = add nsw i32 undef, undef
12 ; CHECK-NEXT:    [[SUB102_3:%.*]] = sub nsw i32 undef, undef
13 ; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <16 x i32> poison, i32 [[SUB102_3]], i32 0
14 ; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <16 x i32> [[TMP0]], i32 [[SUB102_1]], i32 1
15 ; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <16 x i32> [[TMP1]], i32 [[ADD94_1]], i32 2
16 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <16 x i32> [[TMP2]], i32 [[ADD78_1]], i32 3
17 ; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <16 x i32> [[TMP3]], i32 [[SUB86_1]], i32 4
18 ; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <16 x i32> [[TMP4]], i32 [[ADD78_2]], i32 5
19 ; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> poison, <16 x i32> <i32 0, i32 undef, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 2, i32 3, i32 4, i32 undef, i32 5, i32 undef, i32 undef, i32 undef, i32 undef>
20 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <16 x i32> poison, i32 [[SUB86_1]], i32 0
21 ; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <16 x i32> [[TMP6]], i32 [[ADD78_1]], i32 1
22 ; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <16 x i32> [[TMP7]], i32 [[ADD94_1]], i32 2
23 ; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <16 x i32> [[TMP8]], i32 [[SUB102_1]], i32 3
24 ; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <16 x i32> [[TMP9]], i32 [[ADD78_2]], i32 4
25 ; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <16 x i32> [[TMP10]], i32 [[SUB102_3]], i32 5
26 ; CHECK-NEXT:    [[SHUFFLE1:%.*]] = shufflevector <16 x i32> [[TMP11]], <16 x i32> poison, <16 x i32> <i32 undef, i32 undef, i32 0, i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 2, i32 3, i32 4, i32 undef, i32 undef, i32 undef, i32 undef, i32 5>
27 ; CHECK-NEXT:    [[TMP12:%.*]] = add nsw <16 x i32> [[SHUFFLE]], [[SHUFFLE1]]
28 ; CHECK-NEXT:    [[TMP13:%.*]] = sub nsw <16 x i32> [[SHUFFLE]], [[SHUFFLE1]]
29 ; CHECK-NEXT:    [[TMP14:%.*]] = shufflevector <16 x i32> [[TMP12]], <16 x i32> [[TMP13]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 21, i32 22, i32 7, i32 24, i32 25, i32 10, i32 27, i32 28, i32 13, i32 30, i32 31>
30 ; CHECK-NEXT:    [[TMP15:%.*]] = lshr <16 x i32> [[TMP14]], <i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15>
31 ; CHECK-NEXT:    [[TMP16:%.*]] = and <16 x i32> [[TMP15]], <i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537, i32 65537>
32 ; CHECK-NEXT:    [[TMP17:%.*]] = mul nuw <16 x i32> [[TMP16]], <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
33 ; CHECK-NEXT:    [[TMP18:%.*]] = add <16 x i32> [[TMP17]], [[TMP14]]
34 ; CHECK-NEXT:    [[TMP19:%.*]] = xor <16 x i32> [[TMP18]], [[TMP17]]
35 ; CHECK-NEXT:    [[TMP20:%.*]] = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> [[TMP19]])
36 ; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 [[TMP20]], 16
37 ; CHECK-NEXT:    [[ADD119:%.*]] = add nuw nsw i32 undef, [[SHR]]
38 ; CHECK-NEXT:    [[SHR120:%.*]] = lshr i32 [[ADD119]], 1
39 ; CHECK-NEXT:    ret i32 [[SHR120]]
41 entry:
42   %add103 = add nsw i32 undef, undef
43   %sub104 = sub nsw i32 undef, undef
44   %add105 = add nsw i32 undef, undef
45   %sub106 = sub nsw i32 undef, undef
46   %shr.i = lshr i32 %add103, 15
47   %and.i = and i32 %shr.i, 65537
48   %mul.i = mul nuw i32 %and.i, 65535
49   %add.i = add i32 %mul.i, %add103
50   %xor.i = xor i32 %add.i, %mul.i
51   %shr.i64 = lshr i32 %add105, 15
52   %and.i65 = and i32 %shr.i64, 65537
53   %mul.i66 = mul nuw i32 %and.i65, 65535
54   %add.i67 = add i32 %mul.i66, %add105
55   %xor.i68 = xor i32 %add.i67, %mul.i66
56   %shr.i69 = lshr i32 %sub104, 15
57   %and.i70 = and i32 %shr.i69, 65537
58   %mul.i71 = mul nuw i32 %and.i70, 65535
59   %add.i72 = add i32 %mul.i71, %sub104
60   %xor.i73 = xor i32 %add.i72, %mul.i71
61   %shr.i74 = lshr i32 %sub106, 15
62   %and.i75 = and i32 %shr.i74, 65537
63   %mul.i76 = mul nuw i32 %and.i75, 65535
64   %add.i77 = add i32 %mul.i76, %sub106
65   %xor.i78 = xor i32 %add.i77, %mul.i76
66   %add110 = add i32 %xor.i68, %xor.i
67   %add112 = add i32 %add110, %xor.i73
68   %add113 = add i32 %add112, %xor.i78
69   %add78.1 = add nsw i32 undef, undef
70   %sub86.1 = sub nsw i32 undef, undef
71   %add94.1 = add nsw i32 undef, undef
72   %sub102.1 = sub nsw i32 undef, undef
73   %add103.1 = add nsw i32 %add94.1, %add78.1
74   %sub104.1 = sub nsw i32 %add78.1, %add94.1
75   %add105.1 = add nsw i32 %sub102.1, %sub86.1
76   %sub106.1 = sub nsw i32 %sub86.1, %sub102.1
77   %shr.i.1 = lshr i32 %add103.1, 15
78   %and.i.1 = and i32 %shr.i.1, 65537
79   %mul.i.1 = mul nuw i32 %and.i.1, 65535
80   %add.i.1 = add i32 %mul.i.1, %add103.1
81   %xor.i.1 = xor i32 %add.i.1, %mul.i.1
82   %shr.i64.1 = lshr i32 %add105.1, 15
83   %and.i65.1 = and i32 %shr.i64.1, 65537
84   %mul.i66.1 = mul nuw i32 %and.i65.1, 65535
85   %add.i67.1 = add i32 %mul.i66.1, %add105.1
86   %xor.i68.1 = xor i32 %add.i67.1, %mul.i66.1
87   %shr.i69.1 = lshr i32 %sub104.1, 15
88   %and.i70.1 = and i32 %shr.i69.1, 65537
89   %mul.i71.1 = mul nuw i32 %and.i70.1, 65535
90   %add.i72.1 = add i32 %mul.i71.1, %sub104.1
91   %xor.i73.1 = xor i32 %add.i72.1, %mul.i71.1
92   %shr.i74.1 = lshr i32 %sub106.1, 15
93   %and.i75.1 = and i32 %shr.i74.1, 65537
94   %mul.i76.1 = mul nuw i32 %and.i75.1, 65535
95   %add.i77.1 = add i32 %mul.i76.1, %sub106.1
96   %xor.i78.1 = xor i32 %add.i77.1, %mul.i76.1
97   %add108.1 = add i32 %xor.i68.1, %add113
98   %add110.1 = add i32 %add108.1, %xor.i.1
99   %add112.1 = add i32 %add110.1, %xor.i73.1
100   %add113.1 = add i32 %add112.1, %xor.i78.1
101   %add78.2 = add nsw i32 undef, undef
102   %add103.2 = add nsw i32 undef, %add78.2
103   %sub104.2 = sub nsw i32 %add78.2, undef
104   %add105.2 = add nsw i32 undef, undef
105   %sub106.2 = sub nsw i32 undef, undef
106   %shr.i.2 = lshr i32 %add103.2, 15
107   %and.i.2 = and i32 %shr.i.2, 65537
108   %mul.i.2 = mul nuw i32 %and.i.2, 65535
109   %add.i.2 = add i32 %mul.i.2, %add103.2
110   %xor.i.2 = xor i32 %add.i.2, %mul.i.2
111   %shr.i64.2 = lshr i32 %add105.2, 15
112   %and.i65.2 = and i32 %shr.i64.2, 65537
113   %mul.i66.2 = mul nuw i32 %and.i65.2, 65535
114   %add.i67.2 = add i32 %mul.i66.2, %add105.2
115   %xor.i68.2 = xor i32 %add.i67.2, %mul.i66.2
116   %shr.i69.2 = lshr i32 %sub104.2, 15
117   %and.i70.2 = and i32 %shr.i69.2, 65537
118   %mul.i71.2 = mul nuw i32 %and.i70.2, 65535
119   %add.i72.2 = add i32 %mul.i71.2, %sub104.2
120   %xor.i73.2 = xor i32 %add.i72.2, %mul.i71.2
121   %shr.i74.2 = lshr i32 %sub106.2, 15
122   %and.i75.2 = and i32 %shr.i74.2, 65537
123   %mul.i76.2 = mul nuw i32 %and.i75.2, 65535
124   %add.i77.2 = add i32 %mul.i76.2, %sub106.2
125   %xor.i78.2 = xor i32 %add.i77.2, %mul.i76.2
126   %add108.2 = add i32 %xor.i68.2, %add113.1
127   %add110.2 = add i32 %add108.2, %xor.i.2
128   %add112.2 = add i32 %add110.2, %xor.i73.2
129   %add113.2 = add i32 %add112.2, %xor.i78.2
130   %sub102.3 = sub nsw i32 undef, undef
131   %add103.3 = add nsw i32 undef, undef
132   %sub104.3 = sub nsw i32 undef, undef
133   %add105.3 = add nsw i32 %sub102.3, undef
134   %sub106.3 = sub nsw i32 undef, %sub102.3
135   %shr.i.3 = lshr i32 %add103.3, 15
136   %and.i.3 = and i32 %shr.i.3, 65537
137   %mul.i.3 = mul nuw i32 %and.i.3, 65535
138   %add.i.3 = add i32 %mul.i.3, %add103.3
139   %xor.i.3 = xor i32 %add.i.3, %mul.i.3
140   %shr.i64.3 = lshr i32 %add105.3, 15
141   %and.i65.3 = and i32 %shr.i64.3, 65537
142   %mul.i66.3 = mul nuw i32 %and.i65.3, 65535
143   %add.i67.3 = add i32 %mul.i66.3, %add105.3
144   %xor.i68.3 = xor i32 %add.i67.3, %mul.i66.3
145   %shr.i69.3 = lshr i32 %sub104.3, 15
146   %and.i70.3 = and i32 %shr.i69.3, 65537
147   %mul.i71.3 = mul nuw i32 %and.i70.3, 65535
148   %add.i72.3 = add i32 %mul.i71.3, %sub104.3
149   %xor.i73.3 = xor i32 %add.i72.3, %mul.i71.3
150   %shr.i74.3 = lshr i32 %sub106.3, 15
151   %and.i75.3 = and i32 %shr.i74.3, 65537
152   %mul.i76.3 = mul nuw i32 %and.i75.3, 65535
153   %add.i77.3 = add i32 %mul.i76.3, %sub106.3
154   %xor.i78.3 = xor i32 %add.i77.3, %mul.i76.3
155   %add108.3 = add i32 %xor.i68.3, %add113.2
156   %add110.3 = add i32 %add108.3, %xor.i.3
157   %add112.3 = add i32 %add110.3, %xor.i73.3
158   %add113.3 = add i32 %add112.3, %xor.i78.3
159   %shr = lshr i32 %add113.3, 16
160   %add119 = add nuw nsw i32 undef, %shr
161   %shr120 = lshr i32 %add119, 1
162   ret i32 %shr120