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-3.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-cond-3.s > vect-cond-3.ll
6 ; ModuleID = 'vect-cond-3.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() nounwind uwtable noinline {
23 for.cond: ; preds = %for.inc44, %entry
24 %indvar2 = phi i64 [ %indvar.next3, %for.inc44 ], [ 0, %entry ]
25 %arrayidx43 = getelementptr [32 x i32]* @x_out_b, i64 0, i64 %indvar2
26 %arrayidx39 = getelementptr [32 x i32]* @x_out_a, i64 0, i64 %indvar2
27 %arrayidx = getelementptr [32 x i32]* @x_in, i64 0, i64 %indvar2
28 %exitcond4 = icmp ne i64 %indvar2, 32
29 br i1 %exitcond4, label %for.body, label %for.end47
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 ], [ %cond34, %for.inc ]
41 %tmp = add i64 %indvar, 1
42 %arrayidx22 = getelementptr [17 x i32]* @b, i64 0, i64 %tmp
43 %arrayidx17 = getelementptr [17 x i32]* @a, i64 0, i64 %tmp
44 %arrayidx12 = getelementptr [16 x i32]* @c, i64 0, i64 %indvar
45 %exitcond = icmp ne i64 %indvar, 16
46 br i1 %exitcond, label %for.body8, label %for.end
48 for.body8: ; preds = %for.cond5
49 %tmp13 = load i32* %arrayidx12, align 4
50 %cmp14 = icmp sgt i32 %tmp2, %tmp13
51 %tmp23 = load i32* %arrayidx22, align 4
52 br i1 %cmp14, label %cond.true, label %cond.false
54 cond.true: ; preds = %for.body8
57 cond.false: ; preds = %for.body8
58 %tmp18 = load i32* %arrayidx17, align 4
61 cond.end: ; preds = %cond.false, %cond.true
62 %cond = phi i32 [ %curr_a.0, %cond.true ], [ %tmp18, %cond.false ]
63 br i1 %cmp14, label %cond.true29, label %cond.false31
65 cond.true29: ; preds = %cond.end
68 cond.false31: ; preds = %cond.end
71 cond.end33: ; preds = %cond.false31, %cond.true29
72 %cond34 = phi i32 [ %tmp23, %cond.true29 ], [ %curr_b.0, %cond.false31 ]
75 for.inc: ; preds = %cond.end33
76 %indvar.next = add i64 %indvar, 1
79 for.end: ; preds = %for.cond5
80 %curr_b.0.lcssa = phi i32 [ %curr_b.0, %for.cond5 ]
81 %curr_a.0.lcssa = phi i32 [ %curr_a.0, %for.cond5 ]
82 store i32 %curr_a.0.lcssa, i32* %arrayidx39, align 4
83 store i32 %curr_b.0.lcssa, i32* %arrayidx43, align 4
86 for.inc44: ; preds = %for.end
87 %indvar.next3 = add i64 %indvar2, 1
90 for.end47: ; preds = %for.cond
94 define i32 @main() nounwind uwtable {
96 call void @check_vect()
99 for.cond: ; preds = %for.inc, %entry
100 %indvar1 = phi i64 [ %indvar.next2, %for.inc ], [ 0, %entry ]
101 %arrayidx = getelementptr [32 x i32]* @x_in, i64 0, i64 %indvar1
102 %j.0 = trunc i64 %indvar1 to i32
103 %exitcond = icmp ne i64 %indvar1, 32
104 br i1 %exitcond, label %for.body, label %for.end
106 for.body: ; preds = %for.cond
107 store i32 %j.0, i32* %arrayidx, align 4
110 for.inc: ; preds = %for.body
111 %indvar.next2 = add i64 %indvar1, 1
114 for.end: ; preds = %for.cond
118 for.cond4: ; preds = %for.inc26, %for.end
119 %indvar = phi i64 [ %indvar.next, %for.inc26 ], [ 0, %for.end ]
120 %arrayidx23 = getelementptr [32 x i32]* @check_result_b, i64 0, i64 %indvar
121 %arrayidx19 = getelementptr [32 x i32]* @x_out_b, i64 0, i64 %indvar
122 %arrayidx14 = getelementptr [32 x i32]* @check_result_a, i64 0, i64 %indvar
123 %arrayidx10 = getelementptr [32 x i32]* @x_out_a, i64 0, i64 %indvar
124 %j.1 = trunc i64 %indvar to i32
125 %cmp6 = icmp slt i32 %j.1, 32
126 br i1 %cmp6, label %for.body7, label %for.end29
128 for.body7: ; preds = %for.cond4
129 %tmp11 = load i32* %arrayidx10, align 4
130 %tmp15 = load i32* %arrayidx14, align 4
131 %cmp16 = icmp eq i32 %tmp11, %tmp15
132 br i1 %cmp16, label %lor.lhs.false, label %if.then
134 lor.lhs.false: ; preds = %for.body7
135 %tmp20 = load i32* %arrayidx19, align 4
136 %tmp24 = load i32* %arrayidx23, align 4
137 %cmp25 = icmp eq i32 %tmp20, %tmp24
138 br i1 %cmp25, label %if.end, label %if.then
140 if.then: ; preds = %lor.lhs.false, %for.body7
141 call void @abort() noreturn nounwind
144 if.end: ; preds = %lor.lhs.false
147 for.inc26: ; preds = %if.end
148 %indvar.next = add i64 %indvar, 1
151 for.end29: ; preds = %for.cond4
155 define internal void @check_vect() nounwind uwtable noinline {
157 %a = alloca i32, align 4
158 %b = alloca i32, align 4
159 %c = alloca i32, align 4
160 %d = alloca i32, align 4
161 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
162 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
163 %tobool = icmp eq i32 %call1, 0
164 br i1 %tobool, label %if.then, label %lor.lhs.false
166 lor.lhs.false: ; preds = %entry
167 %tmp4 = load i32* %d, align 4
168 %and6 = and i32 %tmp4, 67108864
169 %cmp = icmp eq i32 %and6, 0
170 br i1 %cmp, label %if.then, label %if.end
172 if.then: ; preds = %entry, %lor.lhs.false
173 call void @exit(i32 0) noreturn nounwind
176 if.end: ; preds = %lor.lhs.false
177 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
181 declare void @abort() noreturn nounwind
183 declare void (i32)* @signal(i32, void (i32)*) nounwind
185 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
187 call void @exit(i32 0) noreturn nounwind
190 return: ; No predecessors!
194 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
196 %and = and i32 %__level, -2147483648
197 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
198 %cmp = icmp ult i32 %call, %__level
199 br i1 %cmp, label %if.then, label %if.end
201 if.then: ; preds = %entry
204 if.end: ; preds = %entry
205 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
206 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
207 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
208 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
209 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
210 store i32 %asmresult, i32* %__eax, align 4
211 store i32 %asmresult8, i32* %__ebx, align 4
212 store i32 %asmresult9, i32* %__ecx, align 4
213 store i32 %asmresult10, i32* %__edx, align 4
216 return: ; preds = %if.end, %if.then
217 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
221 declare void @exit(i32) noreturn nounwind
223 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
225 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
226 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
227 %tobool = icmp eq i32* %__sig, null
228 br i1 %tobool, label %if.end, label %if.then
230 if.then: ; preds = %entry
231 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
232 store i32 %asmresult1, i32* %__sig, align 4
235 if.end: ; preds = %entry, %if.then
239 !0 = metadata !{i32 -2147227761, i32 -2147227753}
240 !1 = metadata !{i32 -2147227884, i32 -2147227876}