xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/X86/gather-node-same-reduced.ll (revision ef1d19b0a58f92241963a1403905e8b0a8484b5f)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux < %s | FileCheck %s
3
4define i64 @test(ptr %p) {
5; CHECK-LABEL: define i64 @test(
6; CHECK-SAME: ptr [[P:%.*]]) {
7; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr [[P]], i64 12
8; CHECK-NEXT:    [[TMP2:%.*]] = xor <4 x i32> zeroinitializer, zeroinitializer
9; CHECK-NEXT:    [[TMP3:%.*]] = xor <4 x i32> [[TMP2]], zeroinitializer
10; CHECK-NEXT:    [[TMP4:%.*]] = xor <4 x i32> [[TMP3]], zeroinitializer
11; CHECK-NEXT:    [[TMP5:%.*]] = xor <4 x i32> [[TMP4]], zeroinitializer
12; CHECK-NEXT:    [[TMP6:%.*]] = xor <4 x i32> [[TMP5]], zeroinitializer
13; CHECK-NEXT:    [[TMP7:%.*]] = xor <4 x i32> [[TMP6]], zeroinitializer
14; CHECK-NEXT:    [[TMP8:%.*]] = xor <4 x i32> [[TMP7]], zeroinitializer
15; CHECK-NEXT:    [[TMP9:%.*]] = xor <4 x i32> [[TMP8]], zeroinitializer
16; CHECK-NEXT:    [[TMP10:%.*]] = xor <4 x i32> [[TMP9]], zeroinitializer
17; CHECK-NEXT:    [[TMP11:%.*]] = xor <4 x i32> [[TMP10]], zeroinitializer
18; CHECK-NEXT:    [[TMP12:%.*]] = trunc <4 x i32> [[TMP11]] to <4 x i8>
19; CHECK-NEXT:    store <4 x i8> [[TMP12]], ptr [[TMP1]], align 1
20; CHECK-NEXT:    ret i64 0
21;
22  %1 = getelementptr i8, ptr %p, i64 13
23  %2 = getelementptr i8, ptr %p, i64 14
24  %3 = getelementptr i8, ptr %p, i64 15
25  %4 = getelementptr i8, ptr %p, i64 12
26  %5 = zext i8 0 to i32
27  %6 = and i32 %5, 0
28  %.not866 = icmp eq i32 %6, 0
29  %7 = select i1 %.not866, i32 0, i32 0
30  %8 = xor i32 0, %7
31  %9 = zext i8 0 to i32
32  %10 = and i32 %9, 0
33  %.not871 = icmp eq i32 %10, 0
34  %11 = select i1 %.not871, i32 0, i32 0
35  %12 = xor i32 0, %11
36  %13 = xor i32 %9, 0
37  %14 = xor i32 %13, 0
38  %15 = xor i32 %14, 0
39  %16 = xor i32 %15, 0
40  %17 = xor i32 %16, 0
41  %18 = xor i32 %17, %12
42  %19 = xor i32 %18, 0
43  %20 = xor i32 %19, 0
44  %21 = xor i32 %20, 0
45  %22 = xor i32 %21, 0
46  %23 = trunc i32 %22 to i8
47  store i8 %23, ptr %4, align 1
48  %24 = xor i32 %9, 0
49  %25 = xor i32 %24, 0
50  %26 = xor i32 %25, 0
51  %27 = xor i32 %26, 0
52  %28 = xor i32 %27, 0
53  %29 = xor i32 %28, %8
54  %30 = xor i32 %29, 0
55  %31 = xor i32 %30, 0
56  %32 = xor i32 %31, 0
57  %33 = xor i32 %32, 0
58  %34 = trunc i32 %33 to i8
59  store i8 %34, ptr %1, align 1
60  %35 = xor i32 0, %5
61  %36 = xor i32 %35, 0
62  %37 = xor i32 %36, 0
63  %38 = xor i32 %37, 0
64  %39 = xor i32 %38, 0
65  %40 = xor i32 %39, %8
66  %41 = xor i32 %40, 0
67  %42 = xor i32 %41, 0
68  %43 = xor i32 %42, 0
69  %44 = xor i32 %43, 0
70  %45 = trunc i32 %44 to i8
71  store i8 %45, ptr %2, align 1
72  %46 = xor i32 %35, 0
73  %47 = xor i32 %46, 0
74  %48 = xor i32 %47, 0
75  %49 = xor i32 %48, 0
76  %50 = xor i32 %49, %8
77  %51 = xor i32 %50, 0
78  %52 = xor i32 %51, 0
79  %53 = xor i32 %52, 0
80  %54 = xor i32 %53, 0
81  %55 = trunc i32 %54 to i8
82  store i8 %55, ptr %3, align 1
83  ret i64 0
84}
85
86define i64 @test1(ptr %p) {
87; CHECK-LABEL: define i64 @test1(
88; CHECK-SAME: ptr [[P:%.*]]) {
89; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr [[P]], i64 12
90; CHECK-NEXT:    [[TMP2:%.*]] = xor <4 x i32> zeroinitializer, zeroinitializer
91; CHECK-NEXT:    [[TMP3:%.*]] = xor <4 x i32> [[TMP2]], zeroinitializer
92; CHECK-NEXT:    [[TMP4:%.*]] = xor <4 x i32> [[TMP3]], zeroinitializer
93; CHECK-NEXT:    [[TMP5:%.*]] = xor <4 x i32> [[TMP4]], zeroinitializer
94; CHECK-NEXT:    [[TMP6:%.*]] = xor <4 x i32> [[TMP5]], zeroinitializer
95; CHECK-NEXT:    [[TMP7:%.*]] = xor <4 x i32> [[TMP6]], zeroinitializer
96; CHECK-NEXT:    [[TMP8:%.*]] = xor <4 x i32> [[TMP7]], zeroinitializer
97; CHECK-NEXT:    [[TMP9:%.*]] = xor <4 x i32> [[TMP8]], zeroinitializer
98; CHECK-NEXT:    [[TMP10:%.*]] = xor <4 x i32> [[TMP9]], zeroinitializer
99; CHECK-NEXT:    [[TMP11:%.*]] = xor <4 x i32> [[TMP10]], zeroinitializer
100; CHECK-NEXT:    [[TMP12:%.*]] = trunc <4 x i32> [[TMP11]] to <4 x i8>
101; CHECK-NEXT:    store <4 x i8> [[TMP12]], ptr [[TMP1]], align 1
102; CHECK-NEXT:    ret i64 0
103;
104  %1 = getelementptr i8, ptr %p, i64 13
105  %2 = getelementptr i8, ptr %p, i64 14
106  %3 = getelementptr i8, ptr %p, i64 15
107  %4 = getelementptr i8, ptr %p, i64 12
108  %5 = zext i8 0 to i32
109  %6 = and i32 %5, 0
110  %.not866 = icmp eq i32 %6, 0
111  %7 = select i1 %.not866, i32 0, i32 0
112  %8 = xor i32 0, %7
113  %9 = zext i8 0 to i32
114  %10 = and i32 %9, 0
115  %.not869 = icmp eq i32 %10, 0
116  %11 = select i1 %.not869, i32 0, i32 0
117  %12 = xor i32 0, %11
118  %13 = zext i8 0 to i32
119  %14 = and i32 %13, 0
120  %.not871 = icmp eq i32 %14, 0
121  %15 = select i1 %.not871, i32 0, i32 0
122  %16 = xor i32 0, %15
123  %17 = zext i8 0 to i32
124  %18 = and i32 %17, 0
125  %.not874 = icmp eq i32 %18, 0
126  %19 = select i1 %.not874, i32 0, i32 0
127  %20 = xor i32 0, %19
128  %21 = xor i32 %13, 0
129  %22 = xor i32 %21, 0
130  %23 = xor i32 %22, 0
131  %24 = xor i32 %23, 0
132  %25 = xor i32 %24, 0
133  %26 = xor i32 %25, 0
134  %27 = xor i32 %26, %8
135  %28 = xor i32 %27, 0
136  %29 = xor i32 %28, 0
137  %30 = xor i32 %29, 0
138  %31 = trunc i32 %30 to i8
139  store i8 %31, ptr %4, align 1
140  %32 = xor i32 %13, 0
141  %33 = xor i32 %32, 0
142  %34 = xor i32 %33, 0
143  %35 = xor i32 %34, 0
144  %36 = xor i32 %35, 0
145  %37 = xor i32 %36, 0
146  %38 = xor i32 %37, %20
147  %39 = xor i32 %38, 0
148  %40 = xor i32 %39, 0
149  %41 = xor i32 %40, 0
150  %42 = trunc i32 %41 to i8
151  store i8 %42, ptr %1, align 1
152  %43 = xor i32 %9, 0
153  %44 = xor i32 %43, 0
154  %45 = xor i32 %44, 0
155  %46 = xor i32 %45, 0
156  %47 = xor i32 %46, 0
157  %48 = xor i32 %47, 0
158  %49 = xor i32 %48, %16
159  %50 = xor i32 %49, 0
160  %51 = xor i32 %50, 0
161  %52 = xor i32 %51, 0
162  %53 = trunc i32 %52 to i8
163  store i8 %53, ptr %2, align 1
164  %54 = xor i32 %43, 0
165  %55 = xor i32 %54, 0
166  %56 = xor i32 %55, 0
167  %57 = xor i32 %56, 0
168  %58 = xor i32 %57, 0
169  %59 = xor i32 %58, %12
170  %60 = xor i32 %59, 0
171  %61 = xor i32 %60, 0
172  %62 = xor i32 %61, 0
173  %63 = trunc i32 %62 to i8
174  store i8 %63, ptr %3, align 1
175  ret i64 0
176}
177