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-scevccp-outer-17.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer no-scevccp-outer-17.s > no-scevccp-outer-17.ll
6 ; ModuleID = 'no-scevccp-outer-17.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 @b = common global [40 x i32] zeroinitializer, align 16
11 @c = common global [40 x i32] zeroinitializer, align 16
12 @a = common global [40 x i32] zeroinitializer, align 16
14 define i32 @foo() nounwind uwtable noinline {
18 for.cond: ; preds = %for.inc28, %entry
19 %indvar1 = phi i64 [ %indvar.next2, %for.inc28 ], [ 0, %entry ]
20 %sum.0 = phi i32 [ 0, %entry ], [ %add27, %for.inc28 ]
21 %arrayidx24 = getelementptr [40 x i32]* @a, i64 0, i64 %indvar1
22 %arrayidx6 = getelementptr [40 x i32]* @c, i64 0, i64 %indvar1
23 %arrayidx = getelementptr [40 x i32]* @b, i64 0, i64 %indvar1
24 %exitcond3 = icmp ne i64 %indvar1, 40
25 br i1 %exitcond3, label %for.body, label %for.end31
27 for.body: ; preds = %for.cond
28 %tmp3 = load i32* %arrayidx, align 4
29 %tmp7 = load i32* %arrayidx6, align 4
32 for.cond8: ; preds = %for.inc, %for.body
33 %indvar = phi i32 [ %indvar.next, %for.inc ], [ 0, %for.body ]
34 %sum_j.0 = phi i32 [ 0, %for.body ], [ %phitmp, %for.inc ]
35 %exitcond = icmp ne i32 %indvar, 40
36 br i1 %exitcond, label %for.body12, label %for.end
38 for.body12: ; preds = %for.cond8
41 for.inc: ; preds = %for.body12
42 %add = add i32 %sum_j.0, %indvar
43 %phitmp = and i32 %add, 65535
44 %indvar.next = add i32 %indvar, 1
47 for.end: ; preds = %for.cond8
48 %sum_j.0.lcssa = phi i32 [ %sum_j.0, %for.cond8 ]
49 %sub = sub nsw i32 %tmp3, %tmp7
50 %add21 = add nsw i32 %sum_j.0.lcssa, 5
51 store i32 %add21, i32* %arrayidx24, align 4
54 for.inc28: ; preds = %for.end
55 %add27 = add nsw i32 %sum.0, %sub
56 %indvar.next2 = add i64 %indvar1, 1
59 for.end31: ; preds = %for.cond
60 %sum.0.lcssa = phi i32 [ %sum.0, %for.cond ]
64 define i32 @main() nounwind uwtable {
66 call void @check_vect()
69 for.cond: ; preds = %for.inc, %entry
70 %indvar4 = phi i64 [ %indvar.next5, %for.inc ], [ 0, %entry ]
71 %tmp = mul i64 %indvar4, 2
72 %mul = trunc i64 %tmp to i32
73 %arrayidx6 = getelementptr [40 x i32]* @c, i64 0, i64 %indvar4
74 %arrayidx = getelementptr [40 x i32]* @b, i64 0, i64 %indvar4
75 %i.0 = trunc i64 %indvar4 to i32
76 %exitcond6 = icmp ne i64 %indvar4, 40
77 br i1 %exitcond6, label %for.body, label %for.end
79 for.body: ; preds = %for.cond
80 store i32 %i.0, i32* %arrayidx, align 4
81 store i32 %mul, i32* %arrayidx6, align 4
84 for.inc: ; preds = %for.body
85 %indvar.next5 = add i64 %indvar4, 1
88 for.end: ; preds = %for.cond
89 %call = call i32 @foo()
92 for.cond8: ; preds = %for.inc45, %for.end
93 %indvar2 = phi i64 [ %indvar.next3, %for.inc45 ], [ 0, %for.end ]
94 %sum.0 = phi i32 [ 0, %for.end ], [ %add, %for.inc45 ]
95 %arrayidx38 = getelementptr [40 x i32]* @a, i64 0, i64 %indvar2
96 %arrayidx18 = getelementptr [40 x i32]* @c, i64 0, i64 %indvar2
97 %arrayidx14 = getelementptr [40 x i32]* @b, i64 0, i64 %indvar2
98 %i.1 = trunc i64 %indvar2 to i32
99 %cmp10 = icmp slt i32 %i.1, 40
100 br i1 %cmp10, label %for.body11, label %for.end48
102 for.body11: ; preds = %for.cond8
103 %tmp15 = load i32* %arrayidx14, align 4
104 %tmp19 = load i32* %arrayidx18, align 4
105 %sub = sub nsw i32 %tmp15, %tmp19
108 for.cond21: ; preds = %for.inc32, %for.body11
109 %indvar = phi i32 [ %indvar.next, %for.inc32 ], [ 0, %for.body11 ]
110 %sum_j.0 = phi i32 [ 0, %for.body11 ], [ %phitmp, %for.inc32 ]
111 %exitcond = icmp ne i32 %indvar, 40
112 br i1 %exitcond, label %for.body25, label %for.end35
114 for.body25: ; preds = %for.cond21
117 for.inc32: ; preds = %for.body25
118 %add30 = add i32 %sum_j.0, %indvar
119 %phitmp = and i32 %add30, 65535
120 %indvar.next = add i32 %indvar, 1
123 for.end35: ; preds = %for.cond21
124 %sum_j.0.lcssa = phi i32 [ %sum_j.0, %for.cond21 ]
125 %add = add nsw i32 %sum.0, %sub
126 %tmp39 = load i32* %arrayidx38, align 4
127 %add42 = add nsw i32 %sum_j.0.lcssa, 5
128 %cmp43 = icmp eq i32 %tmp39, %add42
129 br i1 %cmp43, label %if.end, label %if.then
131 if.then: ; preds = %for.end35
132 call void @abort() noreturn nounwind
135 if.end: ; preds = %for.end35
138 for.inc45: ; preds = %if.end
139 %indvar.next3 = add i64 %indvar2, 1
142 for.end48: ; preds = %for.cond8
143 %sum.0.lcssa = phi i32 [ %sum.0, %for.cond8 ]
144 %cmp51 = icmp eq i32 %call, %sum.0.lcssa
145 br i1 %cmp51, label %if.end54, label %if.then53
147 if.then53: ; preds = %for.end48
148 call void @abort() noreturn nounwind
151 if.end54: ; preds = %for.end48
155 define internal void @check_vect() nounwind uwtable noinline {
157 %a = alloca i32, align 4
158 %b = alloca i32, align 4
159 %c = alloca i32, align 4
160 %d = alloca i32, align 4
161 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
162 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
163 %tobool = icmp eq i32 %call1, 0
164 br i1 %tobool, label %if.then, label %lor.lhs.false
166 lor.lhs.false: ; preds = %entry
167 %tmp4 = load i32* %d, align 4
168 %and6 = and i32 %tmp4, 67108864
169 %cmp = icmp eq i32 %and6, 0
170 br i1 %cmp, label %if.then, label %if.end
172 if.then: ; preds = %entry, %lor.lhs.false
173 call void @exit(i32 0) noreturn nounwind
176 if.end: ; preds = %lor.lhs.false
177 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
181 declare void @abort() noreturn
183 declare void (i32)* @signal(i32, void (i32)*) nounwind
185 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
187 call void @exit(i32 0) noreturn nounwind
190 return: ; No predecessors!
194 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
196 %and = and i32 %__level, -2147483648
197 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
198 %cmp = icmp ult i32 %call, %__level
199 br i1 %cmp, label %if.then, label %if.end
201 if.then: ; preds = %entry
204 if.end: ; preds = %entry
205 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
206 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
207 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
208 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
209 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
210 store i32 %asmresult, i32* %__eax, align 4
211 store i32 %asmresult8, i32* %__ebx, align 4
212 store i32 %asmresult9, i32* %__ecx, align 4
213 store i32 %asmresult10, i32* %__edx, align 4
216 return: ; preds = %if.end, %if.then
217 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
221 declare void @exit(i32) noreturn
223 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
225 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
226 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
227 %tobool = icmp eq i32* %__sig, null
228 br i1 %tobool, label %if.end, label %if.then
230 if.then: ; preds = %entry
231 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
232 store i32 %asmresult1, i32* %__sig, align 4
235 if.end: ; preds = %entry, %if.then
239 !0 = metadata !{i32 -2147343301, i32 -2147343293}
240 !1 = metadata !{i32 -2147343424, i32 -2147343416}