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-1.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-cond-1.s > vect-cond-1.ll
6 ; ModuleID = 'vect-cond-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 @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 @check_result = 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
13 @x_in = common global [32 x i32] zeroinitializer, align 16
14 @x_out = common global [32 x i32] zeroinitializer, align 16
16 define void @foo() nounwind uwtable noinline {
20 for.cond: ; preds = %for.inc25, %entry
21 %indvar2 = phi i64 [ %indvar.next3, %for.inc25 ], [ 0, %entry ]
22 %arrayidx24 = getelementptr [32 x i32]* @x_out, i64 0, i64 %indvar2
23 %arrayidx = getelementptr [32 x i32]* @x_in, i64 0, i64 %indvar2
24 %exitcond4 = icmp ne i64 %indvar2, 32
25 br i1 %exitcond4, label %for.body, label %for.end28
27 for.body: ; preds = %for.cond
28 %tmp2 = load i32* %arrayidx, align 4
29 %tmp3 = load i32* getelementptr inbounds ([17 x i32]* @a, i64 0, i64 0), align 16
32 for.cond4: ; preds = %for.inc, %for.body
33 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %for.body ]
34 %curr_a.0 = phi i32 [ %tmp3, %for.body ], [ %cond, %for.inc ]
35 %arrayidx15 = getelementptr [16 x i32]* @c, i64 0, i64 %indvar
36 %tmp = add i64 %indvar, 1
37 %arrayidx10 = getelementptr [17 x i32]* @a, i64 0, i64 %tmp
38 %exitcond = icmp ne i64 %indvar, 16
39 br i1 %exitcond, label %for.body7, label %for.end
41 for.body7: ; preds = %for.cond4
42 %tmp16 = load i32* %arrayidx15, align 4
43 %cmp17 = icmp sgt i32 %tmp2, %tmp16
44 br i1 %cmp17, label %cond.true, label %cond.false
46 cond.true: ; preds = %for.body7
49 cond.false: ; preds = %for.body7
50 %tmp11 = load i32* %arrayidx10, align 4
53 cond.end: ; preds = %cond.false, %cond.true
54 %cond = phi i32 [ %curr_a.0, %cond.true ], [ %tmp11, %cond.false ]
57 for.inc: ; preds = %cond.end
58 %indvar.next = add i64 %indvar, 1
61 for.end: ; preds = %for.cond4
62 %curr_a.0.lcssa = phi i32 [ %curr_a.0, %for.cond4 ]
63 store i32 %curr_a.0.lcssa, i32* %arrayidx24, align 4
66 for.inc25: ; preds = %for.end
67 %indvar.next3 = add i64 %indvar2, 1
70 for.end28: ; preds = %for.cond
74 define i32 @main() nounwind uwtable {
76 call void @check_vect()
79 for.cond: ; preds = %for.inc, %entry
80 %indvar1 = phi i64 [ %indvar.next2, %for.inc ], [ 0, %entry ]
81 %arrayidx = getelementptr [32 x i32]* @x_in, i64 0, i64 %indvar1
82 %j.0 = trunc i64 %indvar1 to i32
83 %exitcond = icmp ne i64 %indvar1, 32
84 br i1 %exitcond, label %for.body, label %for.end
86 for.body: ; preds = %for.cond
87 store i32 %j.0, i32* %arrayidx, align 4
90 for.inc: ; preds = %for.body
91 %indvar.next2 = add i64 %indvar1, 1
94 for.end: ; preds = %for.cond
98 for.cond4: ; preds = %for.inc17, %for.end
99 %indvar = phi i64 [ %indvar.next, %for.inc17 ], [ 0, %for.end ]
100 %arrayidx14 = getelementptr [32 x i32]* @check_result, i64 0, i64 %indvar
101 %arrayidx10 = getelementptr [32 x i32]* @x_out, i64 0, i64 %indvar
102 %j.1 = trunc i64 %indvar to i32
103 %cmp6 = icmp slt i32 %j.1, 32
104 br i1 %cmp6, label %for.body7, label %for.end20
106 for.body7: ; preds = %for.cond4
107 %tmp11 = load i32* %arrayidx10, align 4
108 %tmp15 = load i32* %arrayidx14, align 4
109 %cmp16 = icmp eq i32 %tmp11, %tmp15
110 br i1 %cmp16, label %if.end, label %if.then
112 if.then: ; preds = %for.body7
113 call void @abort() noreturn nounwind
116 if.end: ; preds = %for.body7
119 for.inc17: ; preds = %if.end
120 %indvar.next = add i64 %indvar, 1
123 for.end20: ; preds = %for.cond4
127 define internal void @check_vect() nounwind uwtable noinline {
129 %a = alloca i32, align 4
130 %b = alloca i32, align 4
131 %c = alloca i32, align 4
132 %d = alloca i32, align 4
133 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
134 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
135 %tobool = icmp eq i32 %call1, 0
136 br i1 %tobool, label %if.then, label %lor.lhs.false
138 lor.lhs.false: ; preds = %entry
139 %tmp4 = load i32* %d, align 4
140 %and6 = and i32 %tmp4, 67108864
141 %cmp = icmp eq i32 %and6, 0
142 br i1 %cmp, label %if.then, label %if.end
144 if.then: ; preds = %entry, %lor.lhs.false
145 call void @exit(i32 0) noreturn nounwind
148 if.end: ; preds = %lor.lhs.false
149 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
153 declare void @abort() noreturn nounwind
155 declare void (i32)* @signal(i32, void (i32)*) nounwind
157 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
159 call void @exit(i32 0) noreturn nounwind
162 return: ; No predecessors!
166 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
168 %and = and i32 %__level, -2147483648
169 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
170 %cmp = icmp ult i32 %call, %__level
171 br i1 %cmp, label %if.then, label %if.end
173 if.then: ; preds = %entry
176 if.end: ; preds = %entry
177 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
178 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
179 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
180 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
181 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
182 store i32 %asmresult, i32* %__eax, align 4
183 store i32 %asmresult8, i32* %__ebx, align 4
184 store i32 %asmresult9, i32* %__ecx, align 4
185 store i32 %asmresult10, i32* %__edx, align 4
188 return: ; preds = %if.end, %if.then
189 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
193 declare void @exit(i32) noreturn nounwind
195 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
197 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
198 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
199 %tobool = icmp eq i32* %__sig, null
200 br i1 %tobool, label %if.end, label %if.then
202 if.then: ; preds = %entry
203 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
204 store i32 %asmresult1, i32* %__sig, align 4
207 if.end: ; preds = %entry, %if.then
211 !0 = metadata !{i32 -2147228140, i32 -2147228132}
212 !1 = metadata !{i32 -2147228263, i32 -2147228255}