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 no-vfa-vect-102a.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer no-vfa-vect-102a.s > no-vfa-vect-102a.ll
6 ; ModuleID = 'no-vfa-vect-102a.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 @a = internal global [9 x i32] [i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9], align 16
11 @foo = common global i32 0, align 4
13 define i32 @main1(i32 %x, i32 %y) nounwind uwtable noinline {
15 %call = call noalias i8* @malloc(i64 72) nounwind
18 for.cond: ; preds = %for.inc, %entry
19 %indvar7 = phi i64 [ %indvar.next8, %for.inc ], [ 0, %entry ]
20 %tmp9 = mul i64 %indvar7, 4
21 %scevgep10 = getelementptr i8* %call, i64 %tmp9
22 %arrayidx6 = bitcast i8* %scevgep10 to i32*
23 %arrayidx = getelementptr [9 x i32]* @a, i64 0, i64 %indvar7
24 %i.0 = trunc i64 %indvar7 to i32
25 %cmp = icmp slt i32 %i.0, 9
26 br i1 %cmp, label %for.body, label %for.end
28 for.body: ; preds = %for.cond
29 %tmp2 = load i32* %arrayidx, align 4
30 store i32 %tmp2, i32* %arrayidx6, align 4
31 %tmp7 = volatile load i32* @foo, align 4
32 %cmp8 = icmp eq i32 %tmp7, 135
33 br i1 %cmp8, label %if.then, label %if.end
35 if.then: ; preds = %for.body
36 call void @abort() noreturn nounwind
39 if.end: ; preds = %for.body
42 for.inc: ; preds = %if.end
43 %indvar.next8 = add i64 %indvar7, 1
46 for.end: ; preds = %for.cond
50 for.cond10: ; preds = %for.inc29, %for.end
51 %tmp14 = phi i32 [ 0, %for.end ], [ %inc31, %for.inc29 ]
52 %add24 = add i32 %tmp4, %tmp14
53 %add = add i32 %x, %tmp14
54 %exitcond = icmp ne i32 %tmp14, 8
55 br i1 %exitcond, label %for.body13, label %for.end32
57 for.body13: ; preds = %for.cond10
58 %idxprom16 = sext i32 %add to i64
59 %a18 = bitcast i8* %call to [9 x i32]*
60 %arrayidx19 = getelementptr inbounds [9 x i32]* %a18, i64 0, i64 %idxprom16
61 %tmp20 = load i32* %arrayidx19, align 4
62 %idxprom25 = sext i32 %add24 to i64
63 %a27 = bitcast i8* %call to [9 x i32]*
64 %arrayidx28 = getelementptr inbounds [9 x i32]* %a27, i64 0, i64 %idxprom25
65 store i32 %tmp20, i32* %arrayidx28, align 4
68 for.inc29: ; preds = %for.body13
69 %inc31 = add nsw i32 %tmp14, 1
72 for.end32: ; preds = %for.cond10
75 for.cond33: ; preds = %for.inc46, %for.end32
76 %indvar = phi i64 [ %indvar.next, %for.inc46 ], [ 0, %for.end32 ]
77 %tmp = mul i64 %indvar, 4
78 %scevgep = getelementptr i8* %call, i64 %tmp
79 %arrayidx41 = bitcast i8* %scevgep to i32*
80 %i.2 = trunc i64 %indvar to i32
81 %cmp35 = icmp slt i32 %i.2, 9
82 br i1 %cmp35, label %for.body36, label %for.end49
84 for.body36: ; preds = %for.cond33
85 %tmp42 = load i32* %arrayidx41, align 4
86 %cmp43 = icmp eq i32 %tmp42, 1
87 br i1 %cmp43, label %if.end45, label %if.then44
89 if.then44: ; preds = %for.body36
90 call void @abort() noreturn nounwind
93 if.end45: ; preds = %for.body36
96 for.inc46: ; preds = %if.end45
97 %indvar.next = add i64 %indvar, 1
100 for.end49: ; preds = %for.cond33
104 declare noalias i8* @malloc(i64) nounwind
106 declare void @abort() noreturn nounwind
108 define i32 @main() nounwind uwtable {
110 call void @check_vect()
111 volatile store i32 0, i32* @foo, align 4
112 %call = call i32 @main1(i32 0, i32 9)
116 define internal void @check_vect() nounwind uwtable noinline {
118 %a = alloca i32, align 4
119 %b = alloca i32, align 4
120 %c = alloca i32, align 4
121 %d = alloca i32, align 4
122 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
123 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
124 %tobool = icmp eq i32 %call1, 0
125 br i1 %tobool, label %if.then, label %lor.lhs.false
127 lor.lhs.false: ; preds = %entry
128 %tmp4 = load i32* %d, align 4
129 %and6 = and i32 %tmp4, 67108864
130 %cmp = icmp eq i32 %and6, 0
131 br i1 %cmp, label %if.then, label %if.end
133 if.then: ; preds = %entry, %lor.lhs.false
134 call void @exit(i32 0) noreturn nounwind
137 if.end: ; preds = %lor.lhs.false
138 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
142 declare void (i32)* @signal(i32, void (i32)*) nounwind
144 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
146 call void @exit(i32 0) noreturn nounwind
149 return: ; No predecessors!
153 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
155 %and = and i32 %__level, -2147483648
156 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
157 %cmp = icmp ult i32 %call, %__level
158 br i1 %cmp, label %if.then, label %if.end
160 if.then: ; preds = %entry
163 if.end: ; preds = %entry
164 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
165 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
166 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
167 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
168 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
169 store i32 %asmresult, i32* %__eax, align 4
170 store i32 %asmresult8, i32* %__ebx, align 4
171 store i32 %asmresult9, i32* %__ecx, align 4
172 store i32 %asmresult10, i32* %__edx, align 4
175 return: ; preds = %if.end, %if.then
176 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
180 declare void @exit(i32) noreturn nounwind
182 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
184 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
185 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
186 %tobool = icmp eq i32* %__sig, null
187 br i1 %tobool, label %if.end, label %if.then
189 if.then: ; preds = %entry
190 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
191 store i32 %asmresult1, i32* %__sig, align 4
194 if.end: ; preds = %entry, %if.then
198 !0 = metadata !{i32 -2147226067, i32 -2147226059}
199 !1 = metadata !{i32 -2147226190, i32 -2147226182}