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 vect-65.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-65.s > vect-65.ll
6 ; ModuleID = 'vect-65.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 @main1.ib = internal unnamed_addr constant [4 x [4 x [16 x i32]]] [[4 x [16 x i32]] [[16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45]], [4 x [16 x i32]] [[16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45]], [4 x [16 x i32]] [[16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45]], [4 x [16 x i32]] [[16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45]]], align 16
12 define i32 @main1() nounwind uwtable noinline {
14 %ib = alloca [4 x [4 x [16 x i32]]], align 16
15 %ia = alloca [4 x [4 x [16 x i32]]], align 16
16 %ic = alloca [16 x i32], align 16
17 %tmp = bitcast [4 x [4 x [16 x i32]]]* %ib to i8*
18 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp, i8* bitcast ([4 x [4 x [16 x i32]]]* @main1.ib to i8*), i64 1024, i32 16, i1 false)
21 for.cond: ; preds = %for.inc22, %entry
22 %indvar21 = phi i64 [ %indvar.next22, %for.inc22 ], [ 0, %entry ]
23 %exitcond24 = icmp ne i64 %indvar21, 4
24 br i1 %exitcond24, label %for.body, label %for.end25
26 for.body: ; preds = %for.cond
29 for.cond4: ; preds = %for.inc, %for.body
30 %indvar18 = phi i64 [ %indvar.next19, %for.inc ], [ 0, %for.body ]
31 %arrayidx12 = getelementptr [4 x [4 x [16 x i32]]]* %ib, i64 0, i64 2, i64 %indvar21, i64 %indvar18
32 %arrayidx20 = getelementptr [4 x [4 x [16 x i32]]]* %ia, i64 0, i64 %indvar21, i64 1, i64 %indvar18
33 %exitcond20 = icmp ne i64 %indvar18, 16
34 br i1 %exitcond20, label %for.body7, label %for.end
36 for.body7: ; preds = %for.cond4
37 %tmp13 = load i32* %arrayidx12, align 4
38 store i32 %tmp13, i32* %arrayidx20, align 4
41 for.inc: ; preds = %for.body7
42 %indvar.next19 = add i64 %indvar18, 1
45 for.end: ; preds = %for.cond4
48 for.inc22: ; preds = %for.end
49 %indvar.next22 = add i64 %indvar21, 1
52 for.end25: ; preds = %for.cond
55 for.cond26: ; preds = %for.inc55, %for.end25
56 %indvar14 = phi i64 [ %indvar.next15, %for.inc55 ], [ 0, %for.end25 ]
57 %i.1 = trunc i64 %indvar14 to i32
58 %cmp28 = icmp slt i32 %i.1, 4
59 br i1 %cmp28, label %for.body29, label %for.end58
61 for.body29: ; preds = %for.cond26
64 for.cond30: ; preds = %for.inc51, %for.body29
65 %indvar12 = phi i64 [ %indvar.next13, %for.inc51 ], [ 0, %for.body29 ]
66 %arrayidx40 = getelementptr [4 x [4 x [16 x i32]]]* %ia, i64 0, i64 %indvar14, i64 1, i64 %indvar12
67 %arrayidx48 = getelementptr [4 x [4 x [16 x i32]]]* %ib, i64 0, i64 2, i64 %indvar14, i64 %indvar12
68 %j.1 = trunc i64 %indvar12 to i32
69 %cmp32 = icmp slt i32 %j.1, 16
70 br i1 %cmp32, label %for.body33, label %for.end54
72 for.body33: ; preds = %for.cond30
73 %tmp41 = load i32* %arrayidx40, align 4
74 %tmp49 = load i32* %arrayidx48, align 4
75 %cmp50 = icmp eq i32 %tmp41, %tmp49
76 br i1 %cmp50, label %if.end, label %if.then
78 if.then: ; preds = %for.body33
79 call void @abort() noreturn nounwind
82 if.end: ; preds = %for.body33
85 for.inc51: ; preds = %if.end
86 %indvar.next13 = add i64 %indvar12, 1
89 for.end54: ; preds = %for.cond30
92 for.inc55: ; preds = %for.end54
93 %indvar.next15 = add i64 %indvar14, 1
96 for.end58: ; preds = %for.cond26
99 for.cond59: ; preds = %for.inc82, %for.end58
100 %indvar7 = phi i64 [ %indvar.next8, %for.inc82 ], [ 0, %for.end58 ]
101 %exitcond10 = icmp ne i64 %indvar7, 4
102 br i1 %exitcond10, label %for.body62, label %for.end85
104 for.body62: ; preds = %for.cond59
107 for.cond63: ; preds = %for.inc78, %for.body62
108 %indvar5 = phi i64 [ %indvar.next6, %for.inc78 ], [ 0, %for.body62 ]
109 %arrayidx73 = getelementptr [4 x [4 x [16 x i32]]]* %ib, i64 0, i64 2, i64 %indvar7, i64 %indvar5
110 %arrayidx77 = getelementptr [16 x i32]* %ic, i64 0, i64 %indvar5
111 %exitcond = icmp ne i64 %indvar5, 16
112 br i1 %exitcond, label %for.body66, label %for.end81
114 for.body66: ; preds = %for.cond63
115 %tmp74 = load i32* %arrayidx73, align 4
116 store i32 %tmp74, i32* %arrayidx77, align 4
119 for.inc78: ; preds = %for.body66
120 %indvar.next6 = add i64 %indvar5, 1
123 for.end81: ; preds = %for.cond63
126 for.inc82: ; preds = %for.end81
127 %indvar.next8 = add i64 %indvar7, 1
130 for.end85: ; preds = %for.cond59
133 for.cond86: ; preds = %for.inc113, %for.end85
134 %indvar1 = phi i64 [ %indvar.next2, %for.inc113 ], [ 0, %for.end85 ]
135 %i.3 = trunc i64 %indvar1 to i32
136 %cmp88 = icmp slt i32 %i.3, 4
137 br i1 %cmp88, label %for.body89, label %for.end116
139 for.body89: ; preds = %for.cond86
142 for.cond90: ; preds = %for.inc109, %for.body89
143 %indvar = phi i64 [ %indvar.next, %for.inc109 ], [ 0, %for.body89 ]
144 %arrayidx104 = getelementptr [4 x [4 x [16 x i32]]]* %ib, i64 0, i64 2, i64 %indvar1, i64 %indvar
145 %arrayidx96 = getelementptr [16 x i32]* %ic, i64 0, i64 %indvar
146 %j.3 = trunc i64 %indvar to i32
147 %cmp92 = icmp slt i32 %j.3, 16
148 br i1 %cmp92, label %for.body93, label %for.end112
150 for.body93: ; preds = %for.cond90
151 %tmp97 = load i32* %arrayidx96, align 4
152 %tmp105 = load i32* %arrayidx104, align 4
153 %cmp106 = icmp eq i32 %tmp97, %tmp105
154 br i1 %cmp106, label %if.end108, label %if.then107
156 if.then107: ; preds = %for.body93
157 call void @abort() noreturn nounwind
160 if.end108: ; preds = %for.body93
163 for.inc109: ; preds = %if.end108
164 %indvar.next = add i64 %indvar, 1
167 for.end112: ; preds = %for.cond90
170 for.inc113: ; preds = %for.end112
171 %indvar.next2 = add i64 %indvar1, 1
174 for.end116: ; preds = %for.cond86
178 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
180 declare void @abort() noreturn
182 define i32 @main() nounwind uwtable {
184 call void @check_vect()
185 %call = call i32 @main1()
189 define internal void @check_vect() nounwind uwtable noinline {
191 %a = alloca i32, align 4
192 %b = alloca i32, align 4
193 %c = alloca i32, align 4
194 %d = alloca i32, align 4
195 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
196 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
197 %tobool = icmp eq i32 %call1, 0
198 br i1 %tobool, label %if.then, label %lor.lhs.false
200 lor.lhs.false: ; preds = %entry
201 %tmp4 = load i32* %d, align 4
202 %and6 = and i32 %tmp4, 67108864
203 %cmp = icmp eq i32 %and6, 0
204 br i1 %cmp, label %if.then, label %if.end
206 if.then: ; preds = %entry, %lor.lhs.false
207 call void @exit(i32 0) noreturn nounwind
210 if.end: ; preds = %lor.lhs.false
211 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
215 declare void (i32)* @signal(i32, void (i32)*) nounwind
217 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
219 call void @exit(i32 0) noreturn nounwind
222 return: ; No predecessors!
226 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
228 %and = and i32 %__level, -2147483648
229 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
230 %cmp = icmp ult i32 %call, %__level
231 br i1 %cmp, label %if.then, label %if.end
233 if.then: ; preds = %entry
236 if.end: ; preds = %entry
237 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
238 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
239 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
240 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
241 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
242 store i32 %asmresult, i32* %__eax, align 4
243 store i32 %asmresult8, i32* %__ebx, align 4
244 store i32 %asmresult9, i32* %__ecx, align 4
245 store i32 %asmresult10, i32* %__edx, align 4
248 return: ; preds = %if.end, %if.then
249 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
253 declare void @exit(i32) noreturn
255 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
257 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
258 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
259 %tobool = icmp eq i32* %__sig, null
260 br i1 %tobool, label %if.end, label %if.then
262 if.then: ; preds = %entry
263 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
264 store i32 %asmresult1, i32* %__sig, align 4
267 if.end: ; preds = %entry, %if.then
271 !0 = metadata !{i32 -2147341993, i32 -2147341985}
272 !1 = metadata !{i32 -2147342116, i32 -2147342108}