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-1.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer bb-slp-1.s > bb-slp-1.ll
6 ; ModuleID = 'bb-slp-1.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 @out = common global [256 x i32] zeroinitializer, align 16
13 define i32 @main1(i32 %dummy) nounwind uwtable noinline {
17 for.cond: ; preds = %for.inc, %entry
18 %indvar25 = phi i64 [ %indvar.next26, %for.inc ], [ 0, %entry ]
19 %tmp28 = mul i64 %indvar25, 8
20 %tmp29 = add i64 %tmp28, 7
21 %incdec.ptr31 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp29
22 %tmp30 = add i64 %tmp28, 6
23 %incdec.ptr26 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp30
24 %tmp31 = add i64 %tmp28, 5
25 %incdec.ptr21 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp31
26 %tmp33 = add i64 %tmp28, 4
27 %incdec.ptr16 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp33
28 %tmp34 = add i64 %tmp28, 3
29 %incdec.ptr11 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp34
30 %tmp35 = add i64 %tmp28, 2
31 %incdec.ptr6 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp35
32 %tmp36 = add i64 %tmp28, 1
33 %incdec.ptr = getelementptr [256 x i32]* @in, i64 0, i64 %tmp36
34 %pin.0 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp28
35 %i.0 = trunc i64 %indvar25 to i32
36 %incdec.ptr34 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp29
37 %incdec.ptr29 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp30
38 %incdec.ptr24 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp31
39 %incdec.ptr19 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp33
40 %incdec.ptr14 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp34
41 %incdec.ptr9 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp35
42 %incdec.ptr4 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp36
43 %pout.0 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp28
44 %cmp = icmp slt i32 %i.0, 32
45 br i1 %cmp, label %for.body, label %for.end
47 for.body: ; preds = %for.cond
48 %tmp2 = load i32* %pin.0, align 4
49 store i32 %tmp2, i32* %pout.0, align 4
50 %tmp7 = load i32* %incdec.ptr, align 4
51 store i32 %tmp7, i32* %incdec.ptr4, align 4
52 %tmp12 = load i32* %incdec.ptr6, align 4
53 store i32 %tmp12, i32* %incdec.ptr9, align 4
54 %tmp17 = load i32* %incdec.ptr11, align 4
55 store i32 %tmp17, i32* %incdec.ptr14, align 4
56 %tmp22 = load i32* %incdec.ptr16, align 4
57 store i32 %tmp22, i32* %incdec.ptr19, align 4
58 %tmp27 = load i32* %incdec.ptr21, align 4
59 store i32 %tmp27, i32* %incdec.ptr24, align 4
60 %tmp32 = load i32* %incdec.ptr26, align 4
61 store i32 %tmp32, i32* %incdec.ptr29, align 4
62 %tmp37 = load i32* %incdec.ptr31, align 4
63 store i32 %tmp37, i32* %incdec.ptr34, align 4
64 %cmp41 = icmp eq i32 %dummy, 32
65 br i1 %cmp41, label %if.then, label %if.end
67 if.then: ; preds = %for.body
68 call void @abort() noreturn nounwind
71 if.end: ; preds = %for.body
74 for.inc: ; preds = %if.end
75 %indvar.next26 = add i64 %indvar25, 1
78 for.end: ; preds = %for.cond
81 for.cond43: ; preds = %for.inc153, %for.end
82 %indvar = phi i64 [ %indvar.next, %for.inc153 ], [ 0, %for.end ]
83 %tmp = mul i64 %indvar, 8
84 %tmp15 = add i64 %tmp, 7
85 %arrayidx148 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp15
86 %arrayidx142 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp15
87 %tmp16 = add i64 %tmp, 6
88 %arrayidx134 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp16
89 %arrayidx128 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp16
90 %tmp18 = add i64 %tmp, 5
91 %arrayidx120 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp18
92 %arrayidx114 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp18
93 %tmp19 = add i64 %tmp, 4
94 %arrayidx106 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp19
95 %arrayidx100 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp19
96 %tmp20 = add i64 %tmp, 3
97 %arrayidx92 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp20
98 %arrayidx86 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp20
99 %tmp21 = add i64 %tmp, 2
100 %arrayidx78 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp21
101 %arrayidx72 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp21
102 %tmp23 = add i64 %tmp, 1
103 %arrayidx64 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp23
104 %arrayidx58 = getelementptr [256 x i32]* @out, i64 0, i64 %tmp23
105 %arrayidx52 = getelementptr [256 x i32]* @in, i64 0, i64 %tmp
106 %arrayidx = getelementptr [256 x i32]* @out, i64 0, i64 %tmp
107 %i.1 = trunc i64 %indvar to i32
108 %cmp45 = icmp slt i32 %i.1, 32
109 br i1 %cmp45, label %for.body46, label %for.end156
111 for.body46: ; preds = %for.cond43
112 %tmp48 = load i32* %arrayidx, align 16
113 %tmp53 = load i32* %arrayidx52, align 16
114 %cmp54 = icmp eq i32 %tmp48, %tmp53
115 br i1 %cmp54, label %lor.lhs.false, label %if.then151
117 lor.lhs.false: ; preds = %for.body46
118 %tmp59 = load i32* %arrayidx58, align 4
119 %tmp65 = load i32* %arrayidx64, align 4
120 %cmp66 = icmp eq i32 %tmp59, %tmp65
121 br i1 %cmp66, label %lor.lhs.false67, label %if.then151
123 lor.lhs.false67: ; preds = %lor.lhs.false
124 %tmp73 = load i32* %arrayidx72, align 8
125 %tmp79 = load i32* %arrayidx78, align 8
126 %cmp80 = icmp eq i32 %tmp73, %tmp79
127 br i1 %cmp80, label %lor.lhs.false81, label %if.then151
129 lor.lhs.false81: ; preds = %lor.lhs.false67
130 %tmp87 = load i32* %arrayidx86, align 4
131 %tmp93 = load i32* %arrayidx92, align 4
132 %cmp94 = icmp eq i32 %tmp87, %tmp93
133 br i1 %cmp94, label %lor.lhs.false95, label %if.then151
135 lor.lhs.false95: ; preds = %lor.lhs.false81
136 %tmp101 = load i32* %arrayidx100, align 16
137 %tmp107 = load i32* %arrayidx106, align 16
138 %cmp108 = icmp eq i32 %tmp101, %tmp107
139 br i1 %cmp108, label %lor.lhs.false109, label %if.then151
141 lor.lhs.false109: ; preds = %lor.lhs.false95
142 %tmp115 = load i32* %arrayidx114, align 4
143 %tmp121 = load i32* %arrayidx120, align 4
144 %cmp122 = icmp eq i32 %tmp115, %tmp121
145 br i1 %cmp122, label %lor.lhs.false123, label %if.then151
147 lor.lhs.false123: ; preds = %lor.lhs.false109
148 %tmp129 = load i32* %arrayidx128, align 8
149 %tmp135 = load i32* %arrayidx134, align 8
150 %cmp136 = icmp eq i32 %tmp129, %tmp135
151 br i1 %cmp136, label %lor.lhs.false137, label %if.then151
153 lor.lhs.false137: ; preds = %lor.lhs.false123
154 %tmp143 = load i32* %arrayidx142, align 4
155 %tmp149 = load i32* %arrayidx148, align 4
156 %cmp150 = icmp eq i32 %tmp143, %tmp149
157 br i1 %cmp150, label %if.end152, label %if.then151
159 if.then151: ; preds = %lor.lhs.false137, %lor.lhs.false123, %lor.lhs.false109, %lor.lhs.false95, %lor.lhs.false81, %lor.lhs.false67, %lor.lhs.false, %for.body46
160 call void @abort() noreturn nounwind
163 if.end152: ; preds = %lor.lhs.false137
166 for.inc153: ; preds = %if.end152
167 %indvar.next = add i64 %indvar, 1
170 for.end156: ; preds = %for.cond43
174 declare void @abort() noreturn
176 define i32 @main() nounwind uwtable {
178 call void @check_vect()
179 %call = call i32 @main1(i32 33)
183 define internal void @check_vect() nounwind uwtable noinline {
185 %a = alloca i32, align 4
186 %b = alloca i32, align 4
187 %c = alloca i32, align 4
188 %d = alloca i32, align 4
189 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
190 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
191 %tobool = icmp eq i32 %call1, 0
192 br i1 %tobool, label %if.then, label %lor.lhs.false
194 lor.lhs.false: ; preds = %entry
195 %tmp4 = load i32* %d, align 4
196 %and6 = and i32 %tmp4, 67108864
197 %cmp = icmp eq i32 %and6, 0
198 br i1 %cmp, label %if.then, label %if.end
200 if.then: ; preds = %entry, %lor.lhs.false
201 call void @exit(i32 0) noreturn nounwind
204 if.end: ; preds = %lor.lhs.false
205 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
209 declare void (i32)* @signal(i32, void (i32)*) nounwind
211 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
213 call void @exit(i32 0) noreturn nounwind
216 return: ; No predecessors!
220 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
222 %and = and i32 %__level, -2147483648
223 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
224 %cmp = icmp ult i32 %call, %__level
225 br i1 %cmp, label %if.then, label %if.end
227 if.then: ; preds = %entry
230 if.end: ; preds = %entry
231 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
232 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
233 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
234 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
235 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
236 store i32 %asmresult, i32* %__eax, align 4
237 store i32 %asmresult8, i32* %__ebx, align 4
238 store i32 %asmresult9, i32* %__ecx, align 4
239 store i32 %asmresult10, i32* %__edx, align 4
242 return: ; preds = %if.end, %if.then
243 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
247 declare void @exit(i32) noreturn
249 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
251 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
252 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
253 %tobool = icmp eq i32* %__sig, null
254 br i1 %tobool, label %if.end, label %if.then
256 if.then: ; preds = %entry
257 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
258 store i32 %asmresult1, i32* %__sig, align 4
261 if.end: ; preds = %entry, %if.then
265 !0 = metadata !{i32 -2147342396, i32 -2147342388}
266 !1 = metadata !{i32 -2147342519, i32 -2147342511}