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-9.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-9.s > vect-9.ll
6 ; ModuleID = 'vect-9.s'
8 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"
9 target triple = "x86_64-unknown-linux-gnu"
11 @sb = global [16 x i16] [i16 0, i16 3, i16 6, i16 9, i16 12, i16 15, i16 18, i16 21, i16 24, i16 27, i16 30, i16 33, i16 36, i16 39, i16 42, i16 45], align 16
12 @ia = 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 %arrayidx5 = getelementptr [16 x i32]* @ia, i64 0, i64 %indvar1
21 %arrayidx = getelementptr [16 x i16]* @sb, 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 i16* %arrayidx, align 2
27 %conv = sext i16 %tmp2 to i32
28 store i32 %conv, i32* %arrayidx5, align 4
31 for.inc: ; preds = %for.body
32 %indvar.next2 = add i64 %indvar1, 1
35 for.end: ; preds = %for.cond
38 for.cond7: ; preds = %for.inc23, %for.end
39 %indvar = phi i64 [ %indvar.next, %for.inc23 ], [ 0, %for.end ]
40 %arrayidx18 = getelementptr [16 x i16]* @sb, i64 0, i64 %indvar
41 %arrayidx14 = getelementptr [16 x i32]* @ia, i64 0, i64 %indvar
42 %i.1 = trunc i64 %indvar to i32
43 %cmp9 = icmp slt i32 %i.1, 16
44 br i1 %cmp9, label %for.body11, label %for.end26
46 for.body11: ; preds = %for.cond7
47 %tmp15 = load i32* %arrayidx14, align 4
48 %tmp19 = load i16* %arrayidx18, align 2
49 %conv20 = sext i16 %tmp19 to i32
50 %cmp21 = icmp eq i32 %tmp15, %conv20
51 br i1 %cmp21, label %if.end, label %if.then
53 if.then: ; preds = %for.body11
54 call void @abort() noreturn nounwind
57 if.end: ; preds = %for.body11
60 for.inc23: ; preds = %if.end
61 %indvar.next = add i64 %indvar, 1
64 for.end26: ; preds = %for.cond7
68 declare void @abort() noreturn
70 define i32 @main() nounwind uwtable {
72 call void @check_vect()
73 %call = call i32 @main1()
77 define internal void @check_vect() nounwind uwtable noinline {
79 %a = alloca i32, align 4
80 %b = alloca i32, align 4
81 %c = alloca i32, align 4
82 %d = alloca i32, align 4
83 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
84 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
85 %tobool = icmp eq i32 %call1, 0
86 br i1 %tobool, label %if.then, label %lor.lhs.false
88 lor.lhs.false: ; preds = %entry
89 %tmp4 = load i32* %d, align 4
90 %and6 = and i32 %tmp4, 67108864
91 %cmp = icmp eq i32 %and6, 0
92 br i1 %cmp, label %if.then, label %if.end
94 if.then: ; preds = %entry, %lor.lhs.false
95 call void @exit(i32 0) noreturn nounwind
98 if.end: ; preds = %lor.lhs.false
99 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
103 declare void (i32)* @signal(i32, void (i32)*) nounwind
105 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
107 call void @exit(i32 0) noreturn nounwind
110 return: ; No predecessors!
114 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
116 %and = and i32 %__level, -2147483648
117 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
118 %cmp = icmp ult i32 %call, %__level
119 br i1 %cmp, label %if.then, label %if.end
121 if.then: ; preds = %entry
124 if.end: ; preds = %entry
125 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
126 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
127 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
128 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
129 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
130 store i32 %asmresult, i32* %__eax, align 4
131 store i32 %asmresult8, i32* %__ebx, align 4
132 store i32 %asmresult9, i32* %__ecx, align 4
133 store i32 %asmresult10, i32* %__edx, align 4
136 return: ; preds = %if.end, %if.then
137 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
141 declare void @exit(i32) noreturn
143 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
145 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
146 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
147 %tobool = icmp eq i32* %__sig, null
148 br i1 %tobool, label %if.end, label %if.then
150 if.then: ; preds = %entry
151 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
152 store i32 %asmresult1, i32* %__sig, align 4
155 if.end: ; preds = %entry, %if.then
159 !0 = metadata !{i32 -2147343632, i32 -2147343624}
160 !1 = metadata !{i32 -2147343755, i32 -2147343747}