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-vfa-04.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-vfa-04.s > vect-vfa-04.ll
6 ; ModuleID = 'vect-vfa-04.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 @result = global [18 x i32] [i32 10, i32 11, i32 15, i32 16, i32 20, i32 21, i32 25, i32 26, i32 30, i32 31, i32 35, i32 36, i32 40, i32 41, i32 45, i32 46, i32 50, i32 51], align 16
11 @X = global [18 x i32] [i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 0, i32 0], align 16
13 define void @foo(i32* %in, i32* %out) nounwind uwtable noinline {
17 for.cond: ; preds = %for.inc, %entry
18 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
19 %arrayidx7 = getelementptr i32* %out, i64 %indvar
20 %arrayidx = getelementptr i32* %in, i64 %indvar
21 %exitcond = icmp ne i64 %indvar, 16
22 br i1 %exitcond, label %for.body, label %for.end
24 for.body: ; preds = %for.cond
25 %tmp3 = load i32* %arrayidx, align 4
26 %add = add nsw i32 %tmp3, 5
27 store i32 %add, i32* %arrayidx7, align 4
30 for.inc: ; preds = %for.body
31 %indvar.next = add i64 %indvar, 1
34 for.end: ; preds = %for.cond
38 define i32 @main() nounwind uwtable {
40 call void @check_vect()
41 call void @foo(i32* getelementptr inbounds ([18 x i32]* @X, i64 0, i64 0), i32* getelementptr inbounds ([18 x i32]* @X, i64 0, i64 2))
44 for.cond: ; preds = %for.inc, %entry
45 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
46 %arrayidx5 = getelementptr [18 x i32]* @result, i64 0, i64 %indvar
47 %arrayidx = getelementptr [18 x i32]* @X, i64 0, i64 %indvar
48 %i.0 = trunc i64 %indvar to i32
49 %cmp = icmp slt i32 %i.0, 18
50 br i1 %cmp, label %for.body, label %for.end
52 for.body: ; preds = %for.cond
53 %tmp2 = load i32* %arrayidx, align 4
54 %tmp6 = load i32* %arrayidx5, align 4
55 %cmp7 = icmp eq i32 %tmp2, %tmp6
56 br i1 %cmp7, label %if.end, label %if.then
58 if.then: ; preds = %for.body
59 call void @abort() noreturn nounwind
62 if.end: ; preds = %for.body
65 for.inc: ; preds = %if.end
66 %indvar.next = add i64 %indvar, 1
69 for.end: ; preds = %for.cond
73 define internal void @check_vect() nounwind uwtable noinline {
75 %a = alloca i32, align 4
76 %b = alloca i32, align 4
77 %c = alloca i32, align 4
78 %d = alloca i32, align 4
79 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
80 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
81 %tobool = icmp eq i32 %call1, 0
82 br i1 %tobool, label %if.then, label %lor.lhs.false
84 lor.lhs.false: ; preds = %entry
85 %tmp4 = load i32* %d, align 4
86 %and6 = and i32 %tmp4, 67108864
87 %cmp = icmp eq i32 %and6, 0
88 br i1 %cmp, label %if.then, label %if.end
90 if.then: ; preds = %entry, %lor.lhs.false
91 call void @exit(i32 0) noreturn nounwind
94 if.end: ; preds = %lor.lhs.false
95 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
99 declare void @abort() noreturn
101 declare void (i32)* @signal(i32, void (i32)*) nounwind
103 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
105 call void @exit(i32 0) noreturn nounwind
108 return: ; No predecessors!
112 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
114 %and = and i32 %__level, -2147483648
115 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
116 %cmp = icmp ult i32 %call, %__level
117 br i1 %cmp, label %if.then, label %if.end
119 if.then: ; preds = %entry
122 if.end: ; preds = %entry
123 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
124 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
125 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
126 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
127 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
128 store i32 %asmresult, i32* %__eax, align 4
129 store i32 %asmresult8, i32* %__ebx, align 4
130 store i32 %asmresult9, i32* %__ecx, align 4
131 store i32 %asmresult10, i32* %__edx, align 4
134 return: ; preds = %if.end, %if.then
135 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
139 declare void @exit(i32) noreturn
141 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
143 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
144 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
145 %tobool = icmp eq i32* %__sig, null
146 br i1 %tobool, label %if.end, label %if.then
148 if.then: ; preds = %entry
149 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
150 store i32 %asmresult1, i32* %__sig, align 4
153 if.end: ; preds = %entry, %if.then
157 !0 = metadata !{i32 -2147343604, i32 -2147343596}
158 !1 = metadata !{i32 -2147343727, i32 -2147343719}