xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/X86/non-power-of-2-order-detection.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -slp-threshold=-1000 < %s | FileCheck %s
3
4define void @e(ptr %c, i64 %0) {
5; CHECK-LABEL: define void @e(
6; CHECK-SAME: ptr [[C:%.*]], i64 [[TMP0:%.*]]) {
7; CHECK-NEXT:  [[ENTRY:.*:]]
8; CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[C]], align 8
9; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i8, ptr [[TMP1]], i64 96
10; CHECK-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr i8, ptr [[TMP1]], i64 104
11; CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[ARRAYIDX]], align 8
12; CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[C]], align 8
13; CHECK-NEXT:    [[TMP18:%.*]] = load <2 x ptr>, ptr [[ARRAYIDX5]], align 8
14; CHECK-NEXT:    [[TMP4:%.*]] = shufflevector <2 x ptr> [[TMP18]], <2 x ptr> poison, <2 x i32> <i32 1, i32 0>
15; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <2 x ptr> poison, ptr [[TMP3]], i32 0
16; CHECK-NEXT:    [[TMP6:%.*]] = shufflevector <2 x ptr> [[TMP5]], <2 x ptr> poison, <2 x i32> zeroinitializer
17; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <6 x ptr> poison, ptr [[TMP2]], i32 2
18; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <6 x ptr> [[TMP7]], ptr [[TMP1]], i32 3
19; CHECK-NEXT:    [[TMP9:%.*]] = call <6 x ptr> @llvm.vector.insert.v6p0.v2p0(<6 x ptr> [[TMP8]], <2 x ptr> [[TMP4]], i64 0)
20; CHECK-NEXT:    [[TMP10:%.*]] = call <6 x ptr> @llvm.vector.insert.v6p0.v2p0(<6 x ptr> [[TMP9]], <2 x ptr> [[TMP6]], i64 4)
21; CHECK-NEXT:    [[TMP11:%.*]] = ptrtoint <6 x ptr> [[TMP10]] to <6 x i64>
22; CHECK-NEXT:    [[TMP12:%.*]] = shufflevector <6 x i64> [[TMP11]], <6 x i64> poison, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 3, i32 3, i32 4, i32 4, i32 4, i32 4, i32 5, i32 5, i32 5>
23; CHECK-NEXT:    [[TMP13:%.*]] = insertelement <32 x i64> poison, i64 [[TMP0]], i32 0
24; CHECK-NEXT:    [[TMP14:%.*]] = shufflevector <32 x i64> [[TMP13]], <32 x i64> poison, <32 x i32> zeroinitializer
25; CHECK-NEXT:    [[TMP15:%.*]] = or <32 x i64> [[TMP14]], [[TMP12]]
26; CHECK-NEXT:    [[TMP16:%.*]] = icmp ult <32 x i64> [[TMP15]], splat (i64 16)
27; CHECK-NEXT:    [[TMP17:%.*]] = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> [[TMP16]])
28; CHECK-NEXT:    br i1 [[TMP17]], label %[[FOR_BODY:.*]], label %[[VECTOR_PH:.*]]
29; CHECK:       [[VECTOR_PH]]:
30; CHECK-NEXT:    ret void
31; CHECK:       [[FOR_BODY]]:
32; CHECK-NEXT:    ret void
33;
34entry:
35  %1 = load ptr, ptr %c, align 8
36  %arrayidx = getelementptr i8, ptr %1, i64 96
37  %arrayidx1 = getelementptr i8, ptr %1, i64 112
38  %2 = load ptr, ptr %arrayidx1, align 8
39  %arrayidx5 = getelementptr i8, ptr %1, i64 104
40  %3 = load ptr, ptr %arrayidx5, align 8
41  %4 = load ptr, ptr %arrayidx, align 8
42  %5 = load ptr, ptr %c, align 8
43  %6 = ptrtoint ptr %5 to i64
44  %7 = ptrtoint ptr %5 to i64
45  %8 = ptrtoint ptr %1 to i64
46  %9 = ptrtoint ptr %4 to i64
47  %10 = ptrtoint ptr %3 to i64
48  %11 = ptrtoint ptr %2 to i64
49  %12 = or i64 %0, %11
50  %dc64 = icmp ult i64 %12, 16
51  %13 = or i64 %0, %11
52  %dc65 = icmp ult i64 %13, 16
53  %cr66 = or i1 %dc64, %dc65
54  %14 = or i64 %0, %11
55  %dc67 = icmp ult i64 %14, 16
56  %cr68 = or i1 %cr66, %dc67
57  %15 = or i64 %0, %11
58  %dc69 = icmp ult i64 %15, 16
59  %cr70 = or i1 %cr68, %dc69
60  %16 = or i64 %0, %11
61  %dc71 = icmp ult i64 %16, 16
62  %cr72 = or i1 %cr70, %dc71
63  %17 = or i64 %0, %11
64  %dc73 = icmp ult i64 %17, 16
65  %cr74 = or i1 %cr72, %dc73
66  %18 = or i64 %0, %11
67  %dc75 = icmp ult i64 %18, 16
68  %cr76 = or i1 %cr74, %dc75
69  %19 = or i64 %0, %10
70  %dc77 = icmp ult i64 %19, 16
71  %cr78 = or i1 %cr76, %dc77
72  %20 = or i64 %0, %10
73  %dc79 = icmp ult i64 %20, 16
74  %cr80 = or i1 %cr78, %dc79
75  %21 = or i64 %0, %10
76  %dc81 = icmp ult i64 %21, 16
77  %cr82 = or i1 %cr80, %dc81
78  %22 = or i64 %0, %10
79  %dc83 = icmp ult i64 %22, 16
80  %cr84 = or i1 %cr82, %dc83
81  %23 = or i64 %0, %10
82  %dc85 = icmp ult i64 %23, 16
83  %cr86 = or i1 %cr84, %dc85
84  %24 = or i64 %0, %10
85  %dc87 = icmp ult i64 %24, 16
86  %cr88 = or i1 %cr86, %dc87
87  %25 = or i64 %0, %10
88  %dc89 = icmp ult i64 %25, 16
89  %cr90 = or i1 %cr88, %dc89
90  %26 = or i64 %0, %9
91  %dc91 = icmp ult i64 %26, 16
92  %cr92 = or i1 %cr90, %dc91
93  %27 = or i64 %0, %9
94  %dc93 = icmp ult i64 %27, 16
95  %cr94 = or i1 %cr92, %dc93
96  %28 = or i64 %0, %9
97  %dc95 = icmp ult i64 %28, 16
98  %cr96 = or i1 %cr94, %dc95
99  %29 = or i64 %0, %9
100  %dc97 = icmp ult i64 %29, 16
101  %cr98 = or i1 %cr96, %dc97
102  %30 = or i64 %0, %9
103  %dc99 = icmp ult i64 %30, 16
104  %cr100 = or i1 %cr98, %dc99
105  %31 = or i64 %0, %9
106  %dc101 = icmp ult i64 %31, 16
107  %cr102 = or i1 %cr100, %dc101
108  %32 = or i64 %0, %8
109  %dc103 = icmp ult i64 %32, 16
110  %cr104 = or i1 %cr102, %dc103
111  %33 = or i64 %0, %8
112  %dc105 = icmp ult i64 %33, 16
113  %cr106 = or i1 %cr104, %dc105
114  %34 = or i64 %0, %8
115  %dc107 = icmp ult i64 %34, 16
116  %cr108 = or i1 %cr106, %dc107
117  %35 = or i64 %0, %8
118  %dc109 = icmp ult i64 %35, 16
119  %cr110 = or i1 %cr108, %dc109
120  %36 = or i64 %0, %8
121  %dc111 = icmp ult i64 %36, 16
122  %cr112 = or i1 %cr110, %dc111
123  %37 = or i64 %0, %7
124  %dc113 = icmp ult i64 %37, 16
125  %cr114 = or i1 %cr112, %dc113
126  %38 = or i64 %0, %7
127  %dc115 = icmp ult i64 %38, 16
128  %cr116 = or i1 %cr114, %dc115
129  %39 = or i64 %0, %7
130  %dc117 = icmp ult i64 %39, 16
131  %cr118 = or i1 %cr116, %dc117
132  %40 = or i64 %0, %7
133  %dc119 = icmp ult i64 %40, 16
134  %cr120 = or i1 %cr118, %dc119
135  %41 = or i64 %0, %6
136  %dc121 = icmp ult i64 %41, 16
137  %cr122 = or i1 %cr120, %dc121
138  %42 = or i64 %0, %6
139  %dc123 = icmp ult i64 %42, 16
140  %cr124 = or i1 %cr122, %dc123
141  %43 = or i64 %0, %6
142  %dc125 = icmp ult i64 %43, 16
143  %cr126 = or i1 %cr124, %dc125
144  br i1 %cr126, label %for.body, label %vector.ph
145
146vector.ph:
147  ret void
148
149for.body:
150  ret void
151}
152