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-78.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-78.s > vect-78.ll
6 ; ModuleID = 'vect-78.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 @ib = global [16 x i32] [i32 0, i32 1, i32 3, i32 5, i32 7, i32 11, i32 13, i32 17, i32 0, i32 2, i32 6, i32 10, i32 14, i32 22, i32 26, i32 34], align 16
11 @off = global i32 8, align 4
13 define i32 @main1(i32* %ib) nounwind uwtable noinline {
15 %ia = alloca [8 x i32], align 16
18 for.cond: ; preds = %for.inc, %entry
19 %indvar2 = phi i64 [ %indvar.next3, %for.inc ], [ 0, %entry ]
20 %arrayidx7 = getelementptr [8 x i32]* %ia, i64 0, i64 %indvar2
21 %i.0 = trunc i64 %indvar2 to i32
22 %exitcond = icmp ne i64 %indvar2, 8
23 br i1 %exitcond, label %for.body, label %for.end
25 for.body: ; preds = %for.cond
26 %tmp2 = load i32* @off, align 4
27 %add = add i32 %tmp2, %i.0
28 %idxprom = sext i32 %add to i64
29 %arrayidx = getelementptr inbounds i32* %ib, i64 %idxprom
30 %tmp4 = load i32* %arrayidx, align 4
31 store i32 %tmp4, i32* %arrayidx7, align 4
34 for.inc: ; preds = %for.body
35 %indvar.next3 = add i64 %indvar2, 1
38 for.end: ; preds = %for.cond
41 for.cond9: ; preds = %for.inc25, %for.end
42 %indvar = phi i64 [ %indvar.next, %for.inc25 ], [ 0, %for.end ]
43 %i.1 = trunc i64 %indvar to i32
44 %arrayidx15 = getelementptr [8 x i32]* %ia, i64 0, i64 %indvar
45 %cmp11 = icmp slt i32 %i.1, 8
46 br i1 %cmp11, label %for.body12, label %for.end28
48 for.body12: ; preds = %for.cond9
49 %tmp16 = load i32* %arrayidx15, align 4
50 %tmp18 = load i32* @off, align 4
51 %add19 = add i32 %tmp18, %i.1
52 %idxprom20 = sext i32 %add19 to i64
53 %arrayidx22 = getelementptr inbounds i32* %ib, i64 %idxprom20
54 %tmp23 = load i32* %arrayidx22, align 4
55 %cmp24 = icmp eq i32 %tmp16, %tmp23
56 br i1 %cmp24, label %if.end, label %if.then
58 if.then: ; preds = %for.body12
59 call void @abort() noreturn nounwind
62 if.end: ; preds = %for.body12
65 for.inc25: ; preds = %if.end
66 %indvar.next = add i64 %indvar, 1
69 for.end28: ; preds = %for.cond9
73 declare void @abort() noreturn
75 define i32 @main() nounwind uwtable {
77 call void @check_vect()
78 %call = call i32 @main1(i32* getelementptr inbounds ([16 x i32]* @ib, i64 0, i64 0))
82 define internal void @check_vect() nounwind uwtable noinline {
84 %a = alloca i32, align 4
85 %b = alloca i32, align 4
86 %c = alloca i32, align 4
87 %d = alloca i32, align 4
88 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
89 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
90 %tobool = icmp eq i32 %call1, 0
91 br i1 %tobool, label %if.then, label %lor.lhs.false
93 lor.lhs.false: ; preds = %entry
94 %tmp4 = load i32* %d, align 4
95 %and6 = and i32 %tmp4, 67108864
96 %cmp = icmp eq i32 %and6, 0
97 br i1 %cmp, label %if.then, label %if.end
99 if.then: ; preds = %entry, %lor.lhs.false
100 call void @exit(i32 0) noreturn nounwind
103 if.end: ; preds = %lor.lhs.false
104 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
108 declare void (i32)* @signal(i32, void (i32)*) nounwind
110 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
112 call void @exit(i32 0) noreturn nounwind
115 return: ; No predecessors!
119 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
121 %and = and i32 %__level, -2147483648
122 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
123 %cmp = icmp ult i32 %call, %__level
124 br i1 %cmp, label %if.then, label %if.end
126 if.then: ; preds = %entry
129 if.end: ; preds = %entry
130 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
131 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
132 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
133 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
134 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
135 store i32 %asmresult, i32* %__eax, align 4
136 store i32 %asmresult8, i32* %__ebx, align 4
137 store i32 %asmresult9, i32* %__ecx, align 4
138 store i32 %asmresult10, i32* %__edx, align 4
141 return: ; preds = %if.end, %if.then
142 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
146 declare void @exit(i32) noreturn
148 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
150 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
151 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
152 %tobool = icmp eq i32* %__sig, null
153 br i1 %tobool, label %if.end, label %if.then
155 if.then: ; preds = %entry
156 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
157 store i32 %asmresult1, i32* %__sig, align 4
160 if.end: ; preds = %entry, %if.then
164 !0 = metadata !{i32 -2147343436, i32 -2147343428}
165 !1 = metadata !{i32 -2147343559, i32 -2147343551}