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-cond-4.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-cond-4.s > vect-cond-4.ll
6 ; ModuleID = 'vect-cond-4.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 @c = global [16 x i32] [i32 3, i32 2, i32 1, i32 10, i32 1, i32 42, i32 3, i32 4, i32 50, i32 9, i32 32, i32 8, i32 11, i32 10, i32 1, i32 2], align 16
11 @a = global [17 x i32] [i32 0, i32 16, i32 32, i32 48, i32 64, i32 128, i32 256, i32 512, i32 0, i32 16, i32 32, i32 48, i32 64, i32 128, i32 256, i32 512, i32 1024], align 16
12 @b = global [17 x i32] [i32 17, i32 16, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1], align 16
13 @check_result_a = global [32 x i32] [i32 1024, i32 1024, i32 1024, i32 256, i32 256, i32 256, i32 256, i32 256, i32 256, i32 256, i32 256, i32 128, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48], align 16
14 @check_result_b = global [32 x i32] [i32 17, i32 17, i32 2, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1], align 16
15 @x_in = common global [32 x i32] zeroinitializer, align 16
16 @x_out_a = common global [32 x i32] zeroinitializer, align 16
17 @x_out_b = common global [32 x i32] zeroinitializer, align 16
19 define void @foo(i32 %z) nounwind uwtable noinline {
23 for.cond: ; preds = %for.inc37, %entry
24 %indvar1 = phi i64 [ %indvar.next2, %for.inc37 ], [ 0, %entry ]
25 %arrayidx36 = getelementptr [32 x i32]* @x_out_b, i64 0, i64 %indvar1
26 %arrayidx32 = getelementptr [32 x i32]* @x_out_a, i64 0, i64 %indvar1
27 %arrayidx = getelementptr [32 x i32]* @x_in, i64 0, i64 %indvar1
28 %exitcond3 = icmp ne i64 %indvar1, 32
29 br i1 %exitcond3, label %for.body, label %for.end40
31 for.body: ; preds = %for.cond
32 %tmp2 = load i32* %arrayidx, align 4
33 %tmp3 = load i32* getelementptr inbounds ([17 x i32]* @a, i64 0, i64 0), align 16
34 %tmp4 = load i32* getelementptr inbounds ([17 x i32]* @b, i64 0, i64 0), align 16
37 for.cond5: ; preds = %for.inc, %for.body
38 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %for.body ]
39 %curr_a.0 = phi i32 [ %tmp3, %for.body ], [ %cond, %for.inc ]
40 %curr_b.0 = phi i32 [ %tmp4, %for.body ], [ %cond27, %for.inc ]
41 %arrayidx12 = getelementptr [16 x i32]* @c, i64 0, i64 %indvar
42 %exitcond = icmp ne i64 %indvar, 16
43 br i1 %exitcond, label %for.body8, label %for.end
45 for.body8: ; preds = %for.cond5
46 %tmp13 = load i32* %arrayidx12, align 4
47 %cmp14 = icmp sgt i32 %tmp2, %tmp13
48 br i1 %cmp14, label %cond.true, label %cond.false
50 cond.true: ; preds = %for.body8
53 cond.false: ; preds = %for.body8
56 cond.end: ; preds = %cond.false, %cond.true
57 %cond = phi i32 [ %curr_a.0, %cond.true ], [ %z, %cond.false ]
58 %tmp21 = load i32* %arrayidx12, align 4
59 %cmp22 = icmp sgt i32 %tmp2, %tmp21
60 br i1 %cmp22, label %cond.true23, label %cond.false25
62 cond.true23: ; preds = %cond.end
65 cond.false25: ; preds = %cond.end
68 cond.end26: ; preds = %cond.false25, %cond.true23
69 %cond27 = phi i32 [ %curr_b.0, %cond.true23 ], [ 5, %cond.false25 ]
72 for.inc: ; preds = %cond.end26
73 %indvar.next = add i64 %indvar, 1
76 for.end: ; preds = %for.cond5
77 %curr_b.0.lcssa = phi i32 [ %curr_b.0, %for.cond5 ]
78 %curr_a.0.lcssa = phi i32 [ %curr_a.0, %for.cond5 ]
79 store i32 %curr_a.0.lcssa, i32* %arrayidx32, align 4
80 store i32 %curr_b.0.lcssa, i32* %arrayidx36, align 4
83 for.inc37: ; preds = %for.end
84 %indvar.next2 = add i64 %indvar1, 1
87 for.end40: ; preds = %for.cond
91 define i32 @main() nounwind uwtable {
93 call void @check_vect()
96 for.cond: ; preds = %for.inc, %entry
97 %indvar1 = phi i64 [ %indvar.next2, %for.inc ], [ 0, %entry ]
98 %arrayidx = getelementptr [32 x i32]* @x_in, i64 0, i64 %indvar1
99 %j.0 = trunc i64 %indvar1 to i32
100 %exitcond = icmp ne i64 %indvar1, 32
101 br i1 %exitcond, label %for.body, label %for.end
103 for.body: ; preds = %for.cond
104 store i32 %j.0, i32* %arrayidx, align 4
107 for.inc: ; preds = %for.body
108 %indvar.next2 = add i64 %indvar1, 1
111 for.end: ; preds = %for.cond
112 call void @foo(i32 125)
115 for.cond4: ; preds = %for.inc18, %for.end
116 %indvar = phi i64 [ %indvar.next, %for.inc18 ], [ 0, %for.end ]
117 %arrayidx15 = getelementptr [32 x i32]* @x_out_b, i64 0, i64 %indvar
118 %arrayidx10 = getelementptr [32 x i32]* @x_out_a, i64 0, i64 %indvar
119 %j.1 = trunc i64 %indvar to i32
120 %cmp6 = icmp slt i32 %j.1, 32
121 br i1 %cmp6, label %for.body7, label %for.end21
123 for.body7: ; preds = %for.cond4
124 %tmp11 = load i32* %arrayidx10, align 4
125 %cmp12 = icmp eq i32 %tmp11, 125
126 br i1 %cmp12, label %lor.lhs.false, label %if.then
128 lor.lhs.false: ; preds = %for.body7
129 %tmp16 = load i32* %arrayidx15, align 4
130 %cmp17 = icmp eq i32 %tmp16, 5
131 br i1 %cmp17, label %if.end, label %if.then
133 if.then: ; preds = %lor.lhs.false, %for.body7
134 call void @abort() noreturn nounwind
137 if.end: ; preds = %lor.lhs.false
140 for.inc18: ; preds = %if.end
141 %indvar.next = add i64 %indvar, 1
144 for.end21: ; preds = %for.cond4
148 define internal void @check_vect() nounwind uwtable noinline {
150 %a = alloca i32, align 4
151 %b = alloca i32, align 4
152 %c = alloca i32, align 4
153 %d = alloca i32, align 4
154 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
155 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
156 %tobool = icmp eq i32 %call1, 0
157 br i1 %tobool, label %if.then, label %lor.lhs.false
159 lor.lhs.false: ; preds = %entry
160 %tmp4 = load i32* %d, align 4
161 %and6 = and i32 %tmp4, 67108864
162 %cmp = icmp eq i32 %and6, 0
163 br i1 %cmp, label %if.then, label %if.end
165 if.then: ; preds = %entry, %lor.lhs.false
166 call void @exit(i32 0) noreturn nounwind
169 if.end: ; preds = %lor.lhs.false
170 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
174 declare void @abort() noreturn nounwind
176 declare void (i32)* @signal(i32, void (i32)*) nounwind
178 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
180 call void @exit(i32 0) noreturn nounwind
183 return: ; No predecessors!
187 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
189 %and = and i32 %__level, -2147483648
190 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
191 %cmp = icmp ult i32 %call, %__level
192 br i1 %cmp, label %if.then, label %if.end
194 if.then: ; preds = %entry
197 if.end: ; preds = %entry
198 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
199 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
200 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
201 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
202 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
203 store i32 %asmresult, i32* %__eax, align 4
204 store i32 %asmresult8, i32* %__ebx, align 4
205 store i32 %asmresult9, i32* %__ecx, align 4
206 store i32 %asmresult10, i32* %__edx, align 4
209 return: ; preds = %if.end, %if.then
210 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
214 declare void @exit(i32) noreturn nounwind
216 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
218 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
219 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
220 %tobool = icmp eq i32* %__sig, null
221 br i1 %tobool, label %if.end, label %if.then
223 if.then: ; preds = %entry
224 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
225 store i32 %asmresult1, i32* %__sig, align 4
228 if.end: ; preds = %entry, %if.then
232 !0 = metadata !{i32 -2147227888, i32 -2147227880}
233 !1 = metadata !{i32 -2147228011, i32 -2147228003}