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-02.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-vfa-02.s > vect-vfa-02.ll
6 ; ModuleID = 'vect-vfa-02.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 @resultY = 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 @resultZ = global [16 x i32] [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, i32 28], align 16
12 @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
13 @Y = global [16 x i32] zeroinitializer, align 16
14 @Z = global [16 x i32] zeroinitializer, align 16
16 define void @foo(i32* %in, i32* %out1, i32* %out2) nounwind uwtable noinline {
20 for.cond: ; preds = %for.inc, %entry
21 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
22 %arrayidx17 = getelementptr i32* %out2, i64 %indvar
23 %arrayidx = getelementptr i32* %in, i64 %indvar
24 %arrayidx7 = getelementptr i32* %out1, i64 %indvar
25 %exitcond = icmp ne i64 %indvar, 16
26 br i1 %exitcond, label %for.body, label %for.end
28 for.body: ; preds = %for.cond
29 %tmp3 = load i32* %arrayidx, align 4
30 %add = add nsw i32 %tmp3, 2
31 store i32 %add, i32* %arrayidx7, align 4
32 %tmp12 = load i32* %arrayidx, align 4
33 %add13 = add nsw i32 %tmp12, 3
34 store i32 %add13, i32* %arrayidx17, align 4
37 for.inc: ; preds = %for.body
38 %indvar.next = add i64 %indvar, 1
41 for.end: ; preds = %for.cond
45 define i32 @main() nounwind uwtable {
47 call void @check_vect()
48 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), i32* getelementptr inbounds ([16 x i32]* @Z, i64 0, i64 0))
51 for.cond: ; preds = %for.inc, %entry
52 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
53 %arrayidx14 = getelementptr [16 x i32]* @resultZ, i64 0, i64 %indvar
54 %arrayidx10 = getelementptr [16 x i32]* @Z, i64 0, i64 %indvar
55 %arrayidx5 = getelementptr [16 x i32]* @resultY, i64 0, i64 %indvar
56 %arrayidx = getelementptr [16 x i32]* @Y, i64 0, i64 %indvar
57 %i.0 = trunc i64 %indvar to i32
58 %cmp = icmp slt i32 %i.0, 16
59 br i1 %cmp, label %for.body, label %for.end
61 for.body: ; preds = %for.cond
62 %tmp2 = load i32* %arrayidx, align 4
63 %tmp6 = load i32* %arrayidx5, align 4
64 %cmp7 = icmp eq i32 %tmp2, %tmp6
65 br i1 %cmp7, label %if.end, label %if.then
67 if.then: ; preds = %for.body
68 call void @abort() noreturn nounwind
71 if.end: ; preds = %for.body
72 %tmp11 = load i32* %arrayidx10, align 4
73 %tmp15 = load i32* %arrayidx14, align 4
74 %cmp16 = icmp eq i32 %tmp11, %tmp15
75 br i1 %cmp16, label %if.end18, label %if.then17
77 if.then17: ; preds = %if.end
78 call void @abort() noreturn nounwind
81 if.end18: ; preds = %if.end
84 for.inc: ; preds = %if.end18
85 %indvar.next = add i64 %indvar, 1
88 for.end: ; preds = %for.cond
92 define internal void @check_vect() nounwind uwtable noinline {
94 %a = alloca i32, align 4
95 %b = alloca i32, align 4
96 %c = alloca i32, align 4
97 %d = alloca i32, align 4
98 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
99 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
100 %tobool = icmp eq i32 %call1, 0
101 br i1 %tobool, label %if.then, label %lor.lhs.false
103 lor.lhs.false: ; preds = %entry
104 %tmp4 = load i32* %d, align 4
105 %and6 = and i32 %tmp4, 67108864
106 %cmp = icmp eq i32 %and6, 0
107 br i1 %cmp, label %if.then, label %if.end
109 if.then: ; preds = %entry, %lor.lhs.false
110 call void @exit(i32 0) noreturn nounwind
113 if.end: ; preds = %lor.lhs.false
114 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
118 declare void @abort() noreturn
120 declare void (i32)* @signal(i32, void (i32)*) nounwind
122 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
124 call void @exit(i32 0) noreturn nounwind
127 return: ; No predecessors!
131 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
133 %and = and i32 %__level, -2147483648
134 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
135 %cmp = icmp ult i32 %call, %__level
136 br i1 %cmp, label %if.then, label %if.end
138 if.then: ; preds = %entry
141 if.end: ; preds = %entry
142 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
143 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
144 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
145 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
146 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
147 store i32 %asmresult, i32* %__eax, align 4
148 store i32 %asmresult8, i32* %__ebx, align 4
149 store i32 %asmresult9, i32* %__ecx, align 4
150 store i32 %asmresult10, i32* %__edx, align 4
153 return: ; preds = %if.end, %if.then
154 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
158 declare void @exit(i32) noreturn
160 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
162 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
163 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
164 %tobool = icmp eq i32* %__sig, null
165 br i1 %tobool, label %if.end, label %if.then
167 if.then: ; preds = %entry
168 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
169 store i32 %asmresult1, i32* %__sig, align 4
172 if.end: ; preds = %entry, %if.then
176 !0 = metadata !{i32 -2147343417, i32 -2147343409}
177 !1 = metadata !{i32 -2147343540, i32 -2147343532}