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-13.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-13.s > vect-13.ll
6 ; ModuleID = 'vect-13.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 @results = global [16 x i32] [i32 0, i32 1, i32 2, i32 3, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 12, i32 13, i32 14, i32 15], align 16
11 @b = global [16 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], align 16
12 @a = common global [16 x i32] zeroinitializer, align 16
14 define i32 @main1() nounwind uwtable noinline {
18 for.cond: ; preds = %for.inc, %entry
19 %indvar1 = phi i64 [ %indvar.next2, %for.inc ], [ 0, %entry ]
20 %arrayidx10 = getelementptr [16 x i32]* @a, i64 0, i64 %indvar1
21 %arrayidx = getelementptr [16 x i32]* @b, i64 0, i64 %indvar1
22 %exitcond = icmp ne i64 %indvar1, 16
23 br i1 %exitcond, label %for.body, label %for.end
25 for.body: ; preds = %for.cond
26 %tmp2 = load i32* %arrayidx, align 4
27 %cmp3 = icmp sgt i32 %tmp2, -1
28 br i1 %cmp3, label %cond.true, label %cond.false
30 cond.true: ; preds = %for.body
31 %tmp7 = load i32* %arrayidx, align 4
34 cond.false: ; preds = %for.body
37 cond.end: ; preds = %cond.false, %cond.true
38 %cond = phi i32 [ %tmp7, %cond.true ], [ 0, %cond.false ]
39 store i32 %cond, i32* %arrayidx10, align 4
42 for.inc: ; preds = %cond.end
43 %indvar.next2 = add i64 %indvar1, 1
46 for.end: ; preds = %for.cond
49 for.cond12: ; preds = %for.inc25, %for.end
50 %indvar = phi i64 [ %indvar.next, %for.inc25 ], [ 0, %for.end ]
51 %arrayidx22 = getelementptr [16 x i32]* @results, i64 0, i64 %indvar
52 %arrayidx18 = getelementptr [16 x i32]* @a, i64 0, i64 %indvar
53 %i.1 = trunc i64 %indvar to i32
54 %cmp14 = icmp slt i32 %i.1, 16
55 br i1 %cmp14, label %for.body15, label %for.end28
57 for.body15: ; preds = %for.cond12
58 %tmp19 = load i32* %arrayidx18, align 4
59 %tmp23 = load i32* %arrayidx22, align 4
60 %cmp24 = icmp eq i32 %tmp19, %tmp23
61 br i1 %cmp24, label %if.end, label %if.then
63 if.then: ; preds = %for.body15
64 call void @abort() noreturn nounwind
67 if.end: ; preds = %for.body15
70 for.inc25: ; preds = %if.end
71 %indvar.next = add i64 %indvar, 1
74 for.end28: ; preds = %for.cond12
78 declare void @abort() noreturn
80 define i32 @main() nounwind uwtable {
82 call void @check_vect()
83 %call = call i32 @main1()
87 define internal void @check_vect() nounwind uwtable noinline {
89 %a = alloca i32, align 4
90 %b = alloca i32, align 4
91 %c = alloca i32, align 4
92 %d = alloca i32, align 4
93 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
94 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
95 %tobool = icmp eq i32 %call1, 0
96 br i1 %tobool, label %if.then, label %lor.lhs.false
98 lor.lhs.false: ; preds = %entry
99 %tmp4 = load i32* %d, align 4
100 %and6 = and i32 %tmp4, 67108864
101 %cmp = icmp eq i32 %and6, 0
102 br i1 %cmp, label %if.then, label %if.end
104 if.then: ; preds = %entry, %lor.lhs.false
105 call void @exit(i32 0) noreturn nounwind
108 if.end: ; preds = %lor.lhs.false
109 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
113 declare void (i32)* @signal(i32, void (i32)*) nounwind
115 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
117 call void @exit(i32 0) noreturn nounwind
120 return: ; No predecessors!
124 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
126 %and = and i32 %__level, -2147483648
127 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
128 %cmp = icmp ult i32 %call, %__level
129 br i1 %cmp, label %if.then, label %if.end
131 if.then: ; preds = %entry
134 if.end: ; preds = %entry
135 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
136 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
137 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
138 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
139 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
140 store i32 %asmresult, i32* %__eax, align 4
141 store i32 %asmresult8, i32* %__ebx, align 4
142 store i32 %asmresult9, i32* %__ecx, align 4
143 store i32 %asmresult10, i32* %__edx, align 4
146 return: ; preds = %if.end, %if.then
147 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
151 declare void @exit(i32) noreturn
153 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
155 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
156 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
157 %tobool = icmp eq i32* %__sig, null
158 br i1 %tobool, label %if.end, label %if.then
160 if.then: ; preds = %entry
161 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
162 store i32 %asmresult1, i32* %__sig, align 4
165 if.end: ; preds = %entry, %if.then
169 !0 = metadata !{i32 -2147343529, i32 -2147343521}
170 !1 = metadata !{i32 -2147343652, i32 -2147343644}