xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/X86/non-power-of-2-order-detection.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1100fd0cdSAlexey Bataev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2100fd0cdSAlexey Bataev; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -slp-threshold=-1000 < %s | FileCheck %s
3100fd0cdSAlexey Bataev
4100fd0cdSAlexey Bataevdefine void @e(ptr %c, i64 %0) {
5100fd0cdSAlexey Bataev; CHECK-LABEL: define void @e(
6100fd0cdSAlexey Bataev; CHECK-SAME: ptr [[C:%.*]], i64 [[TMP0:%.*]]) {
7100fd0cdSAlexey Bataev; CHECK-NEXT:  [[ENTRY:.*:]]
8100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[C]], align 8
9100fd0cdSAlexey Bataev; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i8, ptr [[TMP1]], i64 96
104b1b51acSAlexey Bataev; CHECK-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr i8, ptr [[TMP1]], i64 104
114b1b51acSAlexey Bataev; CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[ARRAYIDX]], align 8
12100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[C]], align 8
134b1b51acSAlexey Bataev; CHECK-NEXT:    [[TMP18:%.*]] = load <2 x ptr>, ptr [[ARRAYIDX5]], align 8
144b1b51acSAlexey Bataev; CHECK-NEXT:    [[TMP4:%.*]] = shufflevector <2 x ptr> [[TMP18]], <2 x ptr> poison, <2 x i32> <i32 1, i32 0>
15100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <2 x ptr> poison, ptr [[TMP3]], i32 0
16100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP6:%.*]] = shufflevector <2 x ptr> [[TMP5]], <2 x ptr> poison, <2 x i32> zeroinitializer
17100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <6 x ptr> poison, ptr [[TMP2]], i32 2
18100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <6 x ptr> [[TMP7]], ptr [[TMP1]], i32 3
19100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP9:%.*]] = call <6 x ptr> @llvm.vector.insert.v6p0.v2p0(<6 x ptr> [[TMP8]], <2 x ptr> [[TMP4]], i64 0)
20100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP10:%.*]] = call <6 x ptr> @llvm.vector.insert.v6p0.v2p0(<6 x ptr> [[TMP9]], <2 x ptr> [[TMP6]], i64 4)
21100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP11:%.*]] = ptrtoint <6 x ptr> [[TMP10]] to <6 x i64>
224b1b51acSAlexey Bataev; 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>
23100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP13:%.*]] = insertelement <32 x i64> poison, i64 [[TMP0]], i32 0
24100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP14:%.*]] = shufflevector <32 x i64> [[TMP13]], <32 x i64> poison, <32 x i32> zeroinitializer
25100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP15:%.*]] = or <32 x i64> [[TMP14]], [[TMP12]]
26*38fffa63SPaul Walker; CHECK-NEXT:    [[TMP16:%.*]] = icmp ult <32 x i64> [[TMP15]], splat (i64 16)
27100fd0cdSAlexey Bataev; CHECK-NEXT:    [[TMP17:%.*]] = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> [[TMP16]])
28100fd0cdSAlexey Bataev; CHECK-NEXT:    br i1 [[TMP17]], label %[[FOR_BODY:.*]], label %[[VECTOR_PH:.*]]
29100fd0cdSAlexey Bataev; CHECK:       [[VECTOR_PH]]:
30100fd0cdSAlexey Bataev; CHECK-NEXT:    ret void
31100fd0cdSAlexey Bataev; CHECK:       [[FOR_BODY]]:
32100fd0cdSAlexey Bataev; CHECK-NEXT:    ret void
33100fd0cdSAlexey Bataev;
34100fd0cdSAlexey Bataeventry:
35100fd0cdSAlexey Bataev  %1 = load ptr, ptr %c, align 8
36100fd0cdSAlexey Bataev  %arrayidx = getelementptr i8, ptr %1, i64 96
37100fd0cdSAlexey Bataev  %arrayidx1 = getelementptr i8, ptr %1, i64 112
38100fd0cdSAlexey Bataev  %2 = load ptr, ptr %arrayidx1, align 8
39100fd0cdSAlexey Bataev  %arrayidx5 = getelementptr i8, ptr %1, i64 104
40100fd0cdSAlexey Bataev  %3 = load ptr, ptr %arrayidx5, align 8
41100fd0cdSAlexey Bataev  %4 = load ptr, ptr %arrayidx, align 8
42100fd0cdSAlexey Bataev  %5 = load ptr, ptr %c, align 8
43100fd0cdSAlexey Bataev  %6 = ptrtoint ptr %5 to i64
44100fd0cdSAlexey Bataev  %7 = ptrtoint ptr %5 to i64
45100fd0cdSAlexey Bataev  %8 = ptrtoint ptr %1 to i64
46100fd0cdSAlexey Bataev  %9 = ptrtoint ptr %4 to i64
47100fd0cdSAlexey Bataev  %10 = ptrtoint ptr %3 to i64
48100fd0cdSAlexey Bataev  %11 = ptrtoint ptr %2 to i64
49100fd0cdSAlexey Bataev  %12 = or i64 %0, %11
50100fd0cdSAlexey Bataev  %dc64 = icmp ult i64 %12, 16
51100fd0cdSAlexey Bataev  %13 = or i64 %0, %11
52100fd0cdSAlexey Bataev  %dc65 = icmp ult i64 %13, 16
53100fd0cdSAlexey Bataev  %cr66 = or i1 %dc64, %dc65
54100fd0cdSAlexey Bataev  %14 = or i64 %0, %11
55100fd0cdSAlexey Bataev  %dc67 = icmp ult i64 %14, 16
56100fd0cdSAlexey Bataev  %cr68 = or i1 %cr66, %dc67
57100fd0cdSAlexey Bataev  %15 = or i64 %0, %11
58100fd0cdSAlexey Bataev  %dc69 = icmp ult i64 %15, 16
59100fd0cdSAlexey Bataev  %cr70 = or i1 %cr68, %dc69
60100fd0cdSAlexey Bataev  %16 = or i64 %0, %11
61100fd0cdSAlexey Bataev  %dc71 = icmp ult i64 %16, 16
62100fd0cdSAlexey Bataev  %cr72 = or i1 %cr70, %dc71
63100fd0cdSAlexey Bataev  %17 = or i64 %0, %11
64100fd0cdSAlexey Bataev  %dc73 = icmp ult i64 %17, 16
65100fd0cdSAlexey Bataev  %cr74 = or i1 %cr72, %dc73
66100fd0cdSAlexey Bataev  %18 = or i64 %0, %11
67100fd0cdSAlexey Bataev  %dc75 = icmp ult i64 %18, 16
68100fd0cdSAlexey Bataev  %cr76 = or i1 %cr74, %dc75
69100fd0cdSAlexey Bataev  %19 = or i64 %0, %10
70100fd0cdSAlexey Bataev  %dc77 = icmp ult i64 %19, 16
71100fd0cdSAlexey Bataev  %cr78 = or i1 %cr76, %dc77
72100fd0cdSAlexey Bataev  %20 = or i64 %0, %10
73100fd0cdSAlexey Bataev  %dc79 = icmp ult i64 %20, 16
74100fd0cdSAlexey Bataev  %cr80 = or i1 %cr78, %dc79
75100fd0cdSAlexey Bataev  %21 = or i64 %0, %10
76100fd0cdSAlexey Bataev  %dc81 = icmp ult i64 %21, 16
77100fd0cdSAlexey Bataev  %cr82 = or i1 %cr80, %dc81
78100fd0cdSAlexey Bataev  %22 = or i64 %0, %10
79100fd0cdSAlexey Bataev  %dc83 = icmp ult i64 %22, 16
80100fd0cdSAlexey Bataev  %cr84 = or i1 %cr82, %dc83
81100fd0cdSAlexey Bataev  %23 = or i64 %0, %10
82100fd0cdSAlexey Bataev  %dc85 = icmp ult i64 %23, 16
83100fd0cdSAlexey Bataev  %cr86 = or i1 %cr84, %dc85
84100fd0cdSAlexey Bataev  %24 = or i64 %0, %10
85100fd0cdSAlexey Bataev  %dc87 = icmp ult i64 %24, 16
86100fd0cdSAlexey Bataev  %cr88 = or i1 %cr86, %dc87
87100fd0cdSAlexey Bataev  %25 = or i64 %0, %10
88100fd0cdSAlexey Bataev  %dc89 = icmp ult i64 %25, 16
89100fd0cdSAlexey Bataev  %cr90 = or i1 %cr88, %dc89
90100fd0cdSAlexey Bataev  %26 = or i64 %0, %9
91100fd0cdSAlexey Bataev  %dc91 = icmp ult i64 %26, 16
92100fd0cdSAlexey Bataev  %cr92 = or i1 %cr90, %dc91
93100fd0cdSAlexey Bataev  %27 = or i64 %0, %9
94100fd0cdSAlexey Bataev  %dc93 = icmp ult i64 %27, 16
95100fd0cdSAlexey Bataev  %cr94 = or i1 %cr92, %dc93
96100fd0cdSAlexey Bataev  %28 = or i64 %0, %9
97100fd0cdSAlexey Bataev  %dc95 = icmp ult i64 %28, 16
98100fd0cdSAlexey Bataev  %cr96 = or i1 %cr94, %dc95
99100fd0cdSAlexey Bataev  %29 = or i64 %0, %9
100100fd0cdSAlexey Bataev  %dc97 = icmp ult i64 %29, 16
101100fd0cdSAlexey Bataev  %cr98 = or i1 %cr96, %dc97
102100fd0cdSAlexey Bataev  %30 = or i64 %0, %9
103100fd0cdSAlexey Bataev  %dc99 = icmp ult i64 %30, 16
104100fd0cdSAlexey Bataev  %cr100 = or i1 %cr98, %dc99
105100fd0cdSAlexey Bataev  %31 = or i64 %0, %9
106100fd0cdSAlexey Bataev  %dc101 = icmp ult i64 %31, 16
107100fd0cdSAlexey Bataev  %cr102 = or i1 %cr100, %dc101
108100fd0cdSAlexey Bataev  %32 = or i64 %0, %8
109100fd0cdSAlexey Bataev  %dc103 = icmp ult i64 %32, 16
110100fd0cdSAlexey Bataev  %cr104 = or i1 %cr102, %dc103
111100fd0cdSAlexey Bataev  %33 = or i64 %0, %8
112100fd0cdSAlexey Bataev  %dc105 = icmp ult i64 %33, 16
113100fd0cdSAlexey Bataev  %cr106 = or i1 %cr104, %dc105
114100fd0cdSAlexey Bataev  %34 = or i64 %0, %8
115100fd0cdSAlexey Bataev  %dc107 = icmp ult i64 %34, 16
116100fd0cdSAlexey Bataev  %cr108 = or i1 %cr106, %dc107
117100fd0cdSAlexey Bataev  %35 = or i64 %0, %8
118100fd0cdSAlexey Bataev  %dc109 = icmp ult i64 %35, 16
119100fd0cdSAlexey Bataev  %cr110 = or i1 %cr108, %dc109
120100fd0cdSAlexey Bataev  %36 = or i64 %0, %8
121100fd0cdSAlexey Bataev  %dc111 = icmp ult i64 %36, 16
122100fd0cdSAlexey Bataev  %cr112 = or i1 %cr110, %dc111
123100fd0cdSAlexey Bataev  %37 = or i64 %0, %7
124100fd0cdSAlexey Bataev  %dc113 = icmp ult i64 %37, 16
125100fd0cdSAlexey Bataev  %cr114 = or i1 %cr112, %dc113
126100fd0cdSAlexey Bataev  %38 = or i64 %0, %7
127100fd0cdSAlexey Bataev  %dc115 = icmp ult i64 %38, 16
128100fd0cdSAlexey Bataev  %cr116 = or i1 %cr114, %dc115
129100fd0cdSAlexey Bataev  %39 = or i64 %0, %7
130100fd0cdSAlexey Bataev  %dc117 = icmp ult i64 %39, 16
131100fd0cdSAlexey Bataev  %cr118 = or i1 %cr116, %dc117
132100fd0cdSAlexey Bataev  %40 = or i64 %0, %7
133100fd0cdSAlexey Bataev  %dc119 = icmp ult i64 %40, 16
134100fd0cdSAlexey Bataev  %cr120 = or i1 %cr118, %dc119
135100fd0cdSAlexey Bataev  %41 = or i64 %0, %6
136100fd0cdSAlexey Bataev  %dc121 = icmp ult i64 %41, 16
137100fd0cdSAlexey Bataev  %cr122 = or i1 %cr120, %dc121
138100fd0cdSAlexey Bataev  %42 = or i64 %0, %6
139100fd0cdSAlexey Bataev  %dc123 = icmp ult i64 %42, 16
140100fd0cdSAlexey Bataev  %cr124 = or i1 %cr122, %dc123
141100fd0cdSAlexey Bataev  %43 = or i64 %0, %6
142100fd0cdSAlexey Bataev  %dc125 = icmp ult i64 %43, 16
143100fd0cdSAlexey Bataev  %cr126 = or i1 %cr124, %dc125
144100fd0cdSAlexey Bataev  br i1 %cr126, label %for.body, label %vector.ph
145100fd0cdSAlexey Bataev
146100fd0cdSAlexey Bataevvector.ph:
147100fd0cdSAlexey Bataev  ret void
148100fd0cdSAlexey Bataev
149100fd0cdSAlexey Bataevfor.body:
150100fd0cdSAlexey Bataev  ret void
151100fd0cdSAlexey Bataev}
152