1 ; RUN: opt %loadPolly %defaultOpts -polly-codegen -enable-polly-vector -dce -S %s | FileCheck %s
2 ; Obtained from C source as:
3 ; clang -S -emit-llvm -O0 bb-slp-16.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer bb-slp-16.s > bb-slp-16.ll
6 ; ModuleID = 'bb-slp-16.s'
7 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
8 target triple = "x86_64-unknown-linux-gnu"
10 @in = global [256 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63], align 16
11 @arr = global [32 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0], align 16
12 @out = common global [256 x i32] zeroinitializer, align 16
14 define i32 @main1(i32 %dummy) nounwind uwtable noinline {
18 for.cond: ; preds = %for.inc, %entry
19 %indvar25 = phi i64 [ %indvar.next26, %for.inc ], [ 0, %entry ]
20 %a.0 = phi i32 [ 0, %entry ], [ %a.1, %for.inc ]
21 %tmp27 = mul i64 %indvar25, 8
22 %tmp28 = add i64 %tmp27, 7
23 %incdec.ptr47 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp28
24 %tmp30 = add i64 %tmp27, 6
25 %incdec.ptr40 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp30
26 %tmp31 = add i64 %tmp27, 5
27 %incdec.ptr33 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp31
28 %tmp32 = add i64 %tmp27, 4
29 %incdec.ptr26 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp32
30 %tmp33 = add i64 %tmp27, 3
31 %incdec.ptr19 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp33
32 %tmp34 = add i64 %tmp27, 2
33 %incdec.ptr12 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp34
34 %tmp35 = add i64 %tmp27, 1
35 %incdec.ptr5 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp35
36 %pout.0 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp27
37 %incdec.ptr42 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp28
38 %incdec.ptr35 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp30
39 %incdec.ptr28 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp31
40 %incdec.ptr21 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp32
41 %incdec.ptr14 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp33
42 %incdec.ptr7 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp34
43 %incdec.ptr = getelementptr [256 x i32]* @in, i64 0, i64 %tmp35
44 %pin.0 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp27
45 %i.0 = trunc i64 %indvar25 to i32
46 %arrayidx = getelementptr [32 x i32]* @arr, i64 0, i64 %indvar25
47 %exitcond = icmp ne i64 %indvar25, 32
48 br i1 %exitcond, label %for.body, label %for.end
50 for.body: ; preds = %for.cond
51 %tmp2 = load i32* %pin.0, align 4
52 %add = add i32 %tmp2, %a.0
53 store i32 %add, i32* %pout.0, align 4
54 %tmp8 = load i32* %incdec.ptr, align 4
55 %add10 = add i32 %tmp8, %a.0
56 store i32 %add10, i32* %incdec.ptr5, align 4
57 %tmp15 = load i32* %incdec.ptr7, align 4
58 %add17 = add i32 %tmp15, %a.0
59 store i32 %add17, i32* %incdec.ptr12, align 4
60 %tmp22 = load i32* %incdec.ptr14, align 4
61 %add24 = add i32 %tmp22, %a.0
62 store i32 %add24, i32* %incdec.ptr19, align 4
63 %tmp29 = load i32* %incdec.ptr21, align 4
64 %add31 = add i32 %tmp29, %a.0
65 store i32 %add31, i32* %incdec.ptr26, align 4
66 %tmp36 = load i32* %incdec.ptr28, align 4
67 %add38 = add i32 %tmp36, %a.0
68 store i32 %add38, i32* %incdec.ptr33, align 4
69 %tmp43 = load i32* %incdec.ptr35, align 4
70 %add45 = add i32 %tmp43, %a.0
71 store i32 %add45, i32* %incdec.ptr40, align 4
72 %tmp50 = load i32* %incdec.ptr42, align 4
73 %add52 = add i32 %tmp50, %a.0
74 store i32 %add52, i32* %incdec.ptr47, align 4
75 store i32 %i.0, i32* %arrayidx, align 4
76 %tobool = icmp eq i32 %i.0, 0
77 br i1 %tobool, label %if.else, label %if.then
79 if.then: ; preds = %for.body
82 if.else: ; preds = %for.body
85 if.end: ; preds = %if.else, %if.then
86 %a.1 = phi i32 [ %i.0, %if.then ], [ 2, %if.else ]
89 for.inc: ; preds = %if.end
90 %indvar.next26 = add i64 %indvar25, 1
93 for.end: ; preds = %for.cond
96 for.cond59: ; preds = %for.inc197, %for.end
97 %indvar = phi i64 [ %indvar.next, %for.inc197 ], [ 0, %for.end ]
98 %a.2 = phi i32 [ 0, %for.end ], [ %a.3, %for.inc197 ]
99 %tmp = mul i64 %indvar, 8
100 %tmp16 = add i64 %tmp, 7
101 %arrayidx181 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp16
102 %arrayidx175 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp16
103 %tmp17 = add i64 %tmp, 6
104 %arrayidx165 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp17
105 %arrayidx159 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp17
106 %tmp18 = add i64 %tmp, 5
107 %arrayidx149 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp18
108 %arrayidx143 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp18
109 %tmp19 = add i64 %tmp, 4
110 %arrayidx133 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp19
111 %arrayidx127 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp19
112 %tmp20 = add i64 %tmp, 3
113 %arrayidx117 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp20
114 %arrayidx111 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp20
115 %tmp21 = add i64 %tmp, 2
116 %arrayidx101 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp21
117 %arrayidx95 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp21
118 %tmp23 = add i64 %tmp, 1
119 %arrayidx85 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp23
120 %arrayidx79 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp23
121 %arrayidx70 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp
122 %arrayidx65 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp
123 %i.1 = trunc i64 %indvar to i32
124 %arrayidx191 = getelementptr [32 x i32]* @arr, i64 0, i64 %indvar
125 %cmp61 = icmp slt i32 %i.1, 32
126 br i1 %cmp61, label %for.body62, label %for.end200
128 for.body62: ; preds = %for.cond59
129 %tmp66 = load i32* %arrayidx65, align 16
130 %tmp71 = load i32* %arrayidx70, align 16
131 %add73 = add i32 %tmp71, %a.2
132 %cmp74 = icmp eq i32 %tmp66, %add73
133 br i1 %cmp74, label %lor.lhs.false, label %if.then186
135 lor.lhs.false: ; preds = %for.body62
136 %tmp80 = load i32* %arrayidx79, align 4
137 %tmp86 = load i32* %arrayidx85, align 4
138 %add88 = add i32 %tmp86, %a.2
139 %cmp89 = icmp eq i32 %tmp80, %add88
140 br i1 %cmp89, label %lor.lhs.false90, label %if.then186
142 lor.lhs.false90: ; preds = %lor.lhs.false
143 %tmp96 = load i32* %arrayidx95, align 8
144 %tmp102 = load i32* %arrayidx101, align 8
145 %add104 = add i32 %tmp102, %a.2
146 %cmp105 = icmp eq i32 %tmp96, %add104
147 br i1 %cmp105, label %lor.lhs.false106, label %if.then186
149 lor.lhs.false106: ; preds = %lor.lhs.false90
150 %tmp112 = load i32* %arrayidx111, align 4
151 %tmp118 = load i32* %arrayidx117, align 4
152 %add120 = add i32 %tmp118, %a.2
153 %cmp121 = icmp eq i32 %tmp112, %add120
154 br i1 %cmp121, label %lor.lhs.false122, label %if.then186
156 lor.lhs.false122: ; preds = %lor.lhs.false106
157 %tmp128 = load i32* %arrayidx127, align 16
158 %tmp134 = load i32* %arrayidx133, align 16
159 %add136 = add i32 %tmp134, %a.2
160 %cmp137 = icmp eq i32 %tmp128, %add136
161 br i1 %cmp137, label %lor.lhs.false138, label %if.then186
163 lor.lhs.false138: ; preds = %lor.lhs.false122
164 %tmp144 = load i32* %arrayidx143, align 4
165 %tmp150 = load i32* %arrayidx149, align 4
166 %add152 = add i32 %tmp150, %a.2
167 %cmp153 = icmp eq i32 %tmp144, %add152
168 br i1 %cmp153, label %lor.lhs.false154, label %if.then186
170 lor.lhs.false154: ; preds = %lor.lhs.false138
171 %tmp160 = load i32* %arrayidx159, align 8
172 %tmp166 = load i32* %arrayidx165, align 8
173 %add168 = add i32 %tmp166, %a.2
174 %cmp169 = icmp eq i32 %tmp160, %add168
175 br i1 %cmp169, label %lor.lhs.false170, label %if.then186
177 lor.lhs.false170: ; preds = %lor.lhs.false154
178 %tmp176 = load i32* %arrayidx175, align 4
179 %tmp182 = load i32* %arrayidx181, align 4
180 %add184 = add i32 %tmp182, %a.2
181 %cmp185 = icmp eq i32 %tmp176, %add184
182 br i1 %cmp185, label %if.end187, label %if.then186
184 if.then186: ; preds = %lor.lhs.false170, %lor.lhs.false154, %lor.lhs.false138, %lor.lhs.false122, %lor.lhs.false106, %lor.lhs.false90, %lor.lhs.false, %for.body62
185 call void @abort() noreturn nounwind
188 if.end187: ; preds = %lor.lhs.false170
189 store i32 %i.1, i32* %arrayidx191, align 4
190 %tobool192 = icmp eq i32 %i.1, 0
191 br i1 %tobool192, label %if.else195, label %if.then193
193 if.then193: ; preds = %if.end187
196 if.else195: ; preds = %if.end187
199 if.end196: ; preds = %if.else195, %if.then193
200 %a.3 = phi i32 [ %i.1, %if.then193 ], [ 2, %if.else195 ]
203 for.inc197: ; preds = %if.end196
204 %indvar.next = add i64 %indvar, 1
207 for.end200: ; preds = %for.cond59
211 declare void @abort() noreturn
213 define i32 @main() nounwind uwtable {
215 call void @check_vect()
216 %call = call i32 @main1(i32 33)
220 define internal void @check_vect() nounwind uwtable noinline {
222 %a = alloca i32, align 4
223 %b = alloca i32, align 4
224 %c = alloca i32, align 4
225 %d = alloca i32, align 4
226 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
227 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
228 %tobool = icmp eq i32 %call1, 0
229 br i1 %tobool, label %if.then, label %lor.lhs.false
231 lor.lhs.false: ; preds = %entry
232 %tmp4 = load i32* %d, align 4
233 %and6 = and i32 %tmp4, 67108864
234 %cmp = icmp eq i32 %and6, 0
235 br i1 %cmp, label %if.then, label %if.end
237 if.then: ; preds = %entry, %lor.lhs.false
238 call void @exit(i32 0) noreturn nounwind
241 if.end: ; preds = %lor.lhs.false
242 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
246 declare void (i32)* @signal(i32, void (i32)*) nounwind
248 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
250 call void @exit(i32 0) noreturn nounwind
253 return: ; No predecessors!
257 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
259 %and = and i32 %__level, -2147483648
260 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
261 %cmp = icmp ult i32 %call, %__level
262 br i1 %cmp, label %if.then, label %if.end
264 if.then: ; preds = %entry
267 if.end: ; preds = %entry
268 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
269 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
270 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
271 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
272 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
273 store i32 %asmresult, i32* %__eax, align 4
274 store i32 %asmresult8, i32* %__ebx, align 4
275 store i32 %asmresult9, i32* %__ecx, align 4
276 store i32 %asmresult10, i32* %__edx, align 4
279 return: ; preds = %if.end, %if.then
280 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
284 declare void @exit(i32) noreturn
286 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
288 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
289 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
290 %tobool = icmp eq i32* %__sig, null
291 br i1 %tobool, label %if.end, label %if.then
293 if.then: ; preds = %entry
294 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
295 store i32 %asmresult1, i32* %__sig, align 4
298 if.end: ; preds = %entry, %if.then
302 !0 = metadata !{i32 -2147342213, i32 -2147342205}
303 !1 = metadata !{i32 -2147342336, i32 -2147342328}