xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/X86/pr52275.ll (revision 580210a0c938531ef9fd79f9ffedb93eeb2e66c2)
11c2ad70fSAnton Afanasyev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
23be72f40SBjorn Pettersson; RUN: opt < %s -passes=slp-vectorizer -S -mcpu=core-i7 | FileCheck %s
33be72f40SBjorn Pettersson; RUN: opt < %s -passes=slp-vectorizer -slp-threshold=-100 -S -mcpu=core-i7 | FileCheck %s --check-prefix=FORCE_SLP
41c2ad70fSAnton Afanasyev
5*580210a0SNikita Popovdefine  <4 x i8> @test(<4 x i8> %v, ptr %x) {
6f16a9dffSAnton Afanasyev; CHECK-LABEL: @test(
7*580210a0SNikita Popov; CHECK-NEXT:    [[X0:%.*]] = load i8, ptr [[X:%.*]], align 4
8*580210a0SNikita Popov; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 1
9*580210a0SNikita Popov; CHECK-NEXT:    [[X1:%.*]] = load i8, ptr [[G1]], align 4
10b7574b09SAnton Afanasyev; CHECK-NEXT:    [[V0:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[X0]], i64 0
11b7574b09SAnton Afanasyev; CHECK-NEXT:    [[V1:%.*]] = insertelement <4 x i8> [[V0]], i8 [[X1]], i64 1
12b7574b09SAnton Afanasyev; CHECK-NEXT:    [[V2:%.*]] = add <4 x i8> [[V0]], [[V1]]
131c2ad70fSAnton Afanasyev; CHECK-NEXT:    ret <4 x i8> [[V2]]
141c2ad70fSAnton Afanasyev;
15f16a9dffSAnton Afanasyev; FORCE_SLP-LABEL: @test(
16*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[X0:%.*]] = load i8, ptr [[X:%.*]], align 4
17*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[G1:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 1
18*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[X1:%.*]] = load i8, ptr [[G1]], align 4
19b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[V0:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[X0]], i64 0
20b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[V1:%.*]] = insertelement <4 x i8> [[V0]], i8 [[X1]], i64 1
21b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[V2:%.*]] = add <4 x i8> [[V0]], [[V1]]
22f16a9dffSAnton Afanasyev; FORCE_SLP-NEXT:    ret <4 x i8> [[V2]]
23f16a9dffSAnton Afanasyev;
24*580210a0SNikita Popov  %x0 = load i8, ptr %x, align 4
25*580210a0SNikita Popov  %g1 = getelementptr inbounds i8, ptr %x, i64 1
26*580210a0SNikita Popov  %x1 = load i8, ptr %g1, align 4
271c2ad70fSAnton Afanasyev  %v0 = insertelement <4 x i8> %v, i8 %x0, i64 0
281c2ad70fSAnton Afanasyev  %v1 = insertelement <4 x i8> %v0, i8 %x1, i64 1
291c2ad70fSAnton Afanasyev  %v2 = add <4 x i8> %v0, %v1
301c2ad70fSAnton Afanasyev  ret <4 x i8> %v2
311c2ad70fSAnton Afanasyev}
32f16a9dffSAnton Afanasyev
33*580210a0SNikita Popovdefine  <2 x i8> @test2(<2 x i8> %t6, ptr %t1) {
34f16a9dffSAnton Afanasyev; CHECK-LABEL: @test2(
35*580210a0SNikita Popov; CHECK-NEXT:    [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4
36*580210a0SNikita Popov; CHECK-NEXT:    [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1
37*580210a0SNikita Popov; CHECK-NEXT:    [[T5:%.*]] = load i32, ptr [[T4]], align 4
38b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T7:%.*]] = trunc i32 [[T3]] to i8
39b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T8:%.*]] = insertelement <2 x i8> [[T6:%.*]], i8 [[T7]], i64 0
40b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T9:%.*]] = trunc i32 [[T5]] to i8
41b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T10:%.*]] = insertelement <2 x i8> [[T8]], i8 [[T9]], i64 1
42b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T11:%.*]] = add <2 x i8> [[T10]], [[T8]]
43f16a9dffSAnton Afanasyev; CHECK-NEXT:    ret <2 x i8> [[T11]]
44f16a9dffSAnton Afanasyev;
45f16a9dffSAnton Afanasyev; FORCE_SLP-LABEL: @test2(
46*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4
47*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1
48*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T5:%.*]] = load i32, ptr [[T4]], align 4
49b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T7:%.*]] = trunc i32 [[T3]] to i8
50b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T8:%.*]] = insertelement <2 x i8> [[T6:%.*]], i8 [[T7]], i64 0
51b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T9:%.*]] = trunc i32 [[T5]] to i8
52b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T10:%.*]] = insertelement <2 x i8> [[T8]], i8 [[T9]], i64 1
53b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T11:%.*]] = add <2 x i8> [[T10]], [[T8]]
54f16a9dffSAnton Afanasyev; FORCE_SLP-NEXT:    ret <2 x i8> [[T11]]
55f16a9dffSAnton Afanasyev;
56*580210a0SNikita Popov  %t3 = load i32, ptr %t1, align 4
57*580210a0SNikita Popov  %t4 = getelementptr inbounds i32, ptr %t1, i64 1
58*580210a0SNikita Popov  %t5 = load i32, ptr %t4, align 4
59f16a9dffSAnton Afanasyev  %t7 = trunc i32 %t3 to i8
60f16a9dffSAnton Afanasyev  %t8 = insertelement <2 x i8> %t6, i8 %t7, i64 0
61f16a9dffSAnton Afanasyev  %t9 = trunc i32 %t5 to i8
62f16a9dffSAnton Afanasyev  %t10 = insertelement <2 x i8> %t8, i8 %t9, i64 1
63f16a9dffSAnton Afanasyev  %t11 = add <2 x i8> %t10, %t8
64f16a9dffSAnton Afanasyev  ret <2 x i8> %t11
65f16a9dffSAnton Afanasyev}
66f16a9dffSAnton Afanasyev
67*580210a0SNikita Popovdefine  <2 x i8> @test_reorder(<2 x i8> %t6, ptr %t1) {
68f16a9dffSAnton Afanasyev; CHECK-LABEL: @test_reorder(
69*580210a0SNikita Popov; CHECK-NEXT:    [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4
70*580210a0SNikita Popov; CHECK-NEXT:    [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1
71*580210a0SNikita Popov; CHECK-NEXT:    [[T5:%.*]] = load i32, ptr [[T4]], align 4
72b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T7:%.*]] = trunc i32 [[T3]] to i8
73b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T8:%.*]] = insertelement <2 x i8> [[T6:%.*]], i8 [[T7]], i64 1
74b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T9:%.*]] = trunc i32 [[T5]] to i8
75b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T10:%.*]] = insertelement <2 x i8> [[T8]], i8 [[T9]], i64 0
76b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T11:%.*]] = add <2 x i8> [[T10]], [[T8]]
77f16a9dffSAnton Afanasyev; CHECK-NEXT:    ret <2 x i8> [[T11]]
78f16a9dffSAnton Afanasyev;
79f16a9dffSAnton Afanasyev; FORCE_SLP-LABEL: @test_reorder(
80*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4
81*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1
82*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T5:%.*]] = load i32, ptr [[T4]], align 4
83b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T7:%.*]] = trunc i32 [[T3]] to i8
84b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T8:%.*]] = insertelement <2 x i8> [[T6:%.*]], i8 [[T7]], i64 1
85b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T9:%.*]] = trunc i32 [[T5]] to i8
86b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T10:%.*]] = insertelement <2 x i8> [[T8]], i8 [[T9]], i64 0
87b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T11:%.*]] = add <2 x i8> [[T10]], [[T8]]
88f16a9dffSAnton Afanasyev; FORCE_SLP-NEXT:    ret <2 x i8> [[T11]]
89f16a9dffSAnton Afanasyev;
90*580210a0SNikita Popov  %t3 = load i32, ptr %t1, align 4
91*580210a0SNikita Popov  %t4 = getelementptr inbounds i32, ptr %t1, i64 1
92*580210a0SNikita Popov  %t5 = load i32, ptr %t4, align 4
93f16a9dffSAnton Afanasyev  %t7 = trunc i32 %t3 to i8
94f16a9dffSAnton Afanasyev  %t8 = insertelement <2 x i8> %t6, i8 %t7, i64 1
95f16a9dffSAnton Afanasyev  %t9 = trunc i32 %t5 to i8
96f16a9dffSAnton Afanasyev  %t10 = insertelement <2 x i8> %t8, i8 %t9, i64 0
97f16a9dffSAnton Afanasyev  %t11 = add <2 x i8> %t10, %t8
98f16a9dffSAnton Afanasyev  ret <2 x i8> %t11
99f16a9dffSAnton Afanasyev}
100f16a9dffSAnton Afanasyev
101*580210a0SNikita Popovdefine  <4 x i8> @test_subvector(<4 x i8> %t6, ptr %t1) {
102f16a9dffSAnton Afanasyev; CHECK-LABEL: @test_subvector(
103*580210a0SNikita Popov; CHECK-NEXT:    [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4
104*580210a0SNikita Popov; CHECK-NEXT:    [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1
105*580210a0SNikita Popov; CHECK-NEXT:    [[T5:%.*]] = load i32, ptr [[T4]], align 4
106b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T7:%.*]] = trunc i32 [[T3]] to i8
107b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T8:%.*]] = insertelement <4 x i8> [[T6:%.*]], i8 [[T7]], i64 0
108b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T9:%.*]] = trunc i32 [[T5]] to i8
109b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T10:%.*]] = insertelement <4 x i8> [[T8]], i8 [[T9]], i64 1
110b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T11:%.*]] = add <4 x i8> [[T10]], [[T8]]
111f16a9dffSAnton Afanasyev; CHECK-NEXT:    ret <4 x i8> [[T11]]
112f16a9dffSAnton Afanasyev;
113f16a9dffSAnton Afanasyev; FORCE_SLP-LABEL: @test_subvector(
114*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4
115*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1
116*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T5:%.*]] = load i32, ptr [[T4]], align 4
117b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T7:%.*]] = trunc i32 [[T3]] to i8
118b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T8:%.*]] = insertelement <4 x i8> [[T6:%.*]], i8 [[T7]], i64 0
119b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T9:%.*]] = trunc i32 [[T5]] to i8
120b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T10:%.*]] = insertelement <4 x i8> [[T8]], i8 [[T9]], i64 1
121b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T11:%.*]] = add <4 x i8> [[T10]], [[T8]]
122f16a9dffSAnton Afanasyev; FORCE_SLP-NEXT:    ret <4 x i8> [[T11]]
123f16a9dffSAnton Afanasyev;
124*580210a0SNikita Popov  %t3 = load i32, ptr %t1, align 4
125*580210a0SNikita Popov  %t4 = getelementptr inbounds i32, ptr %t1, i64 1
126*580210a0SNikita Popov  %t5 = load i32, ptr %t4, align 4
127f16a9dffSAnton Afanasyev  %t7 = trunc i32 %t3 to i8
128f16a9dffSAnton Afanasyev  %t8 = insertelement <4 x i8> %t6, i8 %t7, i64 0
129f16a9dffSAnton Afanasyev  %t9 = trunc i32 %t5 to i8
130f16a9dffSAnton Afanasyev  %t10 = insertelement <4 x i8> %t8, i8 %t9, i64 1
131f16a9dffSAnton Afanasyev  %t11 = add <4 x i8> %t10, %t8
132f16a9dffSAnton Afanasyev  ret <4 x i8> %t11
133f16a9dffSAnton Afanasyev}
134f16a9dffSAnton Afanasyev
135*580210a0SNikita Popovdefine  <4 x i8> @test_subvector_reorder(<4 x i8> %t6, ptr %t1) {
136f16a9dffSAnton Afanasyev; CHECK-LABEL: @test_subvector_reorder(
137*580210a0SNikita Popov; CHECK-NEXT:    [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4
138*580210a0SNikita Popov; CHECK-NEXT:    [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1
139*580210a0SNikita Popov; CHECK-NEXT:    [[T5:%.*]] = load i32, ptr [[T4]], align 4
140b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T7:%.*]] = trunc i32 [[T3]] to i8
141b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T8:%.*]] = insertelement <4 x i8> [[T6:%.*]], i8 [[T7]], i64 3
142b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T9:%.*]] = trunc i32 [[T5]] to i8
143b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T10:%.*]] = insertelement <4 x i8> [[T8]], i8 [[T9]], i64 2
144b7574b09SAnton Afanasyev; CHECK-NEXT:    [[T11:%.*]] = add <4 x i8> [[T10]], [[T8]]
145f16a9dffSAnton Afanasyev; CHECK-NEXT:    ret <4 x i8> [[T11]]
146f16a9dffSAnton Afanasyev;
147f16a9dffSAnton Afanasyev; FORCE_SLP-LABEL: @test_subvector_reorder(
148*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4
149*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1
150*580210a0SNikita Popov; FORCE_SLP-NEXT:    [[T5:%.*]] = load i32, ptr [[T4]], align 4
151b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T7:%.*]] = trunc i32 [[T3]] to i8
152b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T8:%.*]] = insertelement <4 x i8> [[T6:%.*]], i8 [[T7]], i64 3
153b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T9:%.*]] = trunc i32 [[T5]] to i8
154b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T10:%.*]] = insertelement <4 x i8> [[T8]], i8 [[T9]], i64 2
155b7574b09SAnton Afanasyev; FORCE_SLP-NEXT:    [[T11:%.*]] = add <4 x i8> [[T10]], [[T8]]
156f16a9dffSAnton Afanasyev; FORCE_SLP-NEXT:    ret <4 x i8> [[T11]]
157f16a9dffSAnton Afanasyev;
158*580210a0SNikita Popov  %t3 = load i32, ptr %t1, align 4
159*580210a0SNikita Popov  %t4 = getelementptr inbounds i32, ptr %t1, i64 1
160*580210a0SNikita Popov  %t5 = load i32, ptr %t4, align 4
161f16a9dffSAnton Afanasyev  %t7 = trunc i32 %t3 to i8
162f16a9dffSAnton Afanasyev  %t8 = insertelement <4 x i8> %t6, i8 %t7, i64 3
163f16a9dffSAnton Afanasyev  %t9 = trunc i32 %t5 to i8
164f16a9dffSAnton Afanasyev  %t10 = insertelement <4 x i8> %t8, i8 %t9, i64 2
165f16a9dffSAnton Afanasyev  %t11 = add <4 x i8> %t10, %t8
166f16a9dffSAnton Afanasyev  ret <4 x i8> %t11
167f16a9dffSAnton Afanasyev}
168