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-01.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-vfa-01.s > vect-vfa-01.ll
6 ; ModuleID = 'vect-vfa-01.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 [16 x i32] [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 26, i32 27], align 16
11 @X = global [16 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], align 16
12 @Y = global [16 x i32] zeroinitializer, align 16
14 define void @foo(i32* %in, i32* %out) nounwind uwtable noinline {
18 for.cond: ; preds = %for.inc, %entry
19 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
20 %arrayidx7 = getelementptr i32* %out, i64 %indvar
21 %arrayidx = getelementptr i32* %in, i64 %indvar
22 %exitcond = icmp ne i64 %indvar, 16
23 br i1 %exitcond, label %for.body, label %for.end
25 for.body: ; preds = %for.cond
26 %tmp3 = load i32* %arrayidx, align 4
27 %add = add nsw i32 %tmp3, 2
28 store i32 %add, i32* %arrayidx7, align 4
31 for.inc: ; preds = %for.body
32 %indvar.next = add i64 %indvar, 1
35 for.end: ; preds = %for.cond
39 define i32 @main() nounwind uwtable {
41 call void @check_vect()
42 call void @foo(i32* getelementptr inbounds ([16 x i32]* @X, i64 0, i64 0), i32* getelementptr inbounds ([16 x i32]* @Y, i64 0, i64 0))
45 for.cond: ; preds = %for.inc, %entry
46 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
47 %arrayidx5 = getelementptr [16 x i32]* @result, i64 0, i64 %indvar
48 %arrayidx = getelementptr [16 x i32]* @Y, i64 0, i64 %indvar
49 %i.0 = trunc i64 %indvar to i32
50 %cmp = icmp slt i32 %i.0, 16
51 br i1 %cmp, label %for.body, label %for.end
53 for.body: ; preds = %for.cond
54 %tmp2 = load i32* %arrayidx, align 4
55 %tmp6 = load i32* %arrayidx5, align 4
56 %cmp7 = icmp eq i32 %tmp2, %tmp6
57 br i1 %cmp7, label %if.end, label %if.then
59 if.then: ; preds = %for.body
60 call void @abort() noreturn nounwind
63 if.end: ; preds = %for.body
66 for.inc: ; preds = %if.end
67 %indvar.next = add i64 %indvar, 1
70 for.end: ; preds = %for.cond
74 define internal void @check_vect() nounwind uwtable noinline {
76 %a = alloca i32, align 4
77 %b = alloca i32, align 4
78 %c = alloca i32, align 4
79 %d = alloca i32, align 4
80 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
81 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
82 %tobool = icmp eq i32 %call1, 0
83 br i1 %tobool, label %if.then, label %lor.lhs.false
85 lor.lhs.false: ; preds = %entry
86 %tmp4 = load i32* %d, align 4
87 %and6 = and i32 %tmp4, 67108864
88 %cmp = icmp eq i32 %and6, 0
89 br i1 %cmp, label %if.then, label %if.end
91 if.then: ; preds = %entry, %lor.lhs.false
92 call void @exit(i32 0) noreturn nounwind
95 if.end: ; preds = %lor.lhs.false
96 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
100 declare void @abort() noreturn
102 declare void (i32)* @signal(i32, void (i32)*) nounwind
104 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
106 call void @exit(i32 0) noreturn nounwind
109 return: ; No predecessors!
113 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
115 %and = and i32 %__level, -2147483648
116 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
117 %cmp = icmp ult i32 %call, %__level
118 br i1 %cmp, label %if.then, label %if.end
120 if.then: ; preds = %entry
123 if.end: ; preds = %entry
124 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
125 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
126 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
127 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
128 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
129 store i32 %asmresult, i32* %__eax, align 4
130 store i32 %asmresult8, i32* %__ebx, align 4
131 store i32 %asmresult9, i32* %__ecx, align 4
132 store i32 %asmresult10, i32* %__edx, align 4
135 return: ; preds = %if.end, %if.then
136 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
140 declare void @exit(i32) noreturn
142 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
144 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
145 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
146 %tobool = icmp eq i32* %__sig, null
147 br i1 %tobool, label %if.end, label %if.then
149 if.then: ; preds = %entry
150 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
151 store i32 %asmresult1, i32* %__sig, align 4
154 if.end: ; preds = %entry, %if.then
158 !0 = metadata !{i32 -2147343612, i32 -2147343604}
159 !1 = metadata !{i32 -2147343735, i32 -2147343727}