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-reduc-2.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-reduc-2.s > vect-reduc-2.ll
6 ; ModuleID = 'vect-reduc-2.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 = global [16 x i32] [i32 1, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45], align 16
11 @c = global [16 x i32] [i32 1, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15], align 16
13 define void @main1(i32 %x, i32 %max_result, i32 %min_result) nounwind uwtable noinline {
17 for.cond: ; preds = %for.inc, %entry
18 %indvar4 = phi i64 [ %indvar.next5, %for.inc ], [ 0, %entry ]
19 %diff.0 = phi i32 [ 0, %entry ], [ %add, %for.inc ]
20 %arrayidx8 = getelementptr [16 x i32]* @c, i64 0, i64 %indvar4
21 %arrayidx = getelementptr [16 x i32]* @b, i64 0, i64 %indvar4
22 %exitcond6 = icmp ne i64 %indvar4, 16
23 br i1 %exitcond6, label %for.body, label %for.end
25 for.body: ; preds = %for.cond
28 for.inc: ; preds = %for.body
29 %tmp9 = load i32* %arrayidx8, align 4
30 %tmp5 = load i32* %arrayidx, align 4
31 %sub = sub nsw i32 %tmp5, %tmp9
32 %add = add nsw i32 %diff.0, %sub
33 %indvar.next5 = add i64 %indvar4, 1
36 for.end: ; preds = %for.cond
37 %diff.0.lcssa = phi i32 [ %diff.0, %for.cond ]
40 for.cond12: ; preds = %for.inc27, %for.end
41 %indvar1 = phi i64 [ %indvar.next2, %for.inc27 ], [ 0, %for.end ]
42 %max.0 = phi i32 [ %x, %for.end ], [ %cond, %for.inc27 ]
43 %arrayidx19 = getelementptr [16 x i32]* @c, i64 0, i64 %indvar1
44 %exitcond3 = icmp ne i64 %indvar1, 16
45 br i1 %exitcond3, label %for.body15, label %for.end30
47 for.body15: ; preds = %for.cond12
48 %tmp20 = load i32* %arrayidx19, align 4
49 %cmp21 = icmp slt i32 %max.0, %tmp20
50 br i1 %cmp21, label %cond.true, label %cond.false
52 cond.true: ; preds = %for.body15
53 %tmp25 = load i32* %arrayidx19, align 4
56 cond.false: ; preds = %for.body15
59 cond.end: ; preds = %cond.false, %cond.true
60 %cond = phi i32 [ %tmp25, %cond.true ], [ %max.0, %cond.false ]
63 for.inc27: ; preds = %cond.end
64 %indvar.next2 = add i64 %indvar1, 1
67 for.end30: ; preds = %for.cond12
68 %max.0.lcssa = phi i32 [ %max.0, %for.cond12 ]
71 for.cond31: ; preds = %for.inc50, %for.end30
72 %indvar = phi i64 [ %indvar.next, %for.inc50 ], [ 0, %for.end30 ]
73 %min.0 = phi i32 [ %x, %for.end30 ], [ %cond49, %for.inc50 ]
74 %arrayidx38 = getelementptr [16 x i32]* @c, i64 0, i64 %indvar
75 %exitcond = icmp ne i64 %indvar, 16
76 br i1 %exitcond, label %for.body34, label %for.end53
78 for.body34: ; preds = %for.cond31
79 %tmp39 = load i32* %arrayidx38, align 4
80 %cmp40 = icmp sgt i32 %min.0, %tmp39
81 br i1 %cmp40, label %cond.true41, label %cond.false46
83 cond.true41: ; preds = %for.body34
84 %tmp45 = load i32* %arrayidx38, align 4
87 cond.false46: ; preds = %for.body34
90 cond.end48: ; preds = %cond.false46, %cond.true41
91 %cond49 = phi i32 [ %tmp45, %cond.true41 ], [ %min.0, %cond.false46 ]
94 for.inc50: ; preds = %cond.end48
95 %indvar.next = add i64 %indvar, 1
98 for.end53: ; preds = %for.cond31
99 %min.0.lcssa = phi i32 [ %min.0, %for.cond31 ]
100 %cmp55 = icmp eq i32 %diff.0.lcssa, 240
101 br i1 %cmp55, label %if.end, label %if.then
103 if.then: ; preds = %for.end53
104 call void @abort() noreturn nounwind
107 if.end: ; preds = %for.end53
108 %cmp58 = icmp eq i32 %max.0.lcssa, %max_result
109 br i1 %cmp58, label %if.end60, label %if.then59
111 if.then59: ; preds = %if.end
112 call void @abort() noreturn nounwind
115 if.end60: ; preds = %if.end
116 %cmp63 = icmp eq i32 %min.0.lcssa, %min_result
117 br i1 %cmp63, label %if.end65, label %if.then64
119 if.then64: ; preds = %if.end60
120 call void @abort() noreturn nounwind
123 if.end65: ; preds = %if.end60
127 declare void @abort() noreturn
129 define i32 @main() nounwind uwtable {
131 call void @check_vect()
132 call void @main1(i32 100, i32 100, i32 1)
133 call void @main1(i32 0, i32 15, i32 0)
137 define internal void @check_vect() nounwind uwtable noinline {
139 %a = alloca i32, align 4
140 %b = alloca i32, align 4
141 %c = alloca i32, align 4
142 %d = alloca i32, align 4
143 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
144 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
145 %tobool = icmp eq i32 %call1, 0
146 br i1 %tobool, label %if.then, label %lor.lhs.false
148 lor.lhs.false: ; preds = %entry
149 %tmp4 = load i32* %d, align 4
150 %and6 = and i32 %tmp4, 67108864
151 %cmp = icmp eq i32 %and6, 0
152 br i1 %cmp, label %if.then, label %if.end
154 if.then: ; preds = %entry, %lor.lhs.false
155 call void @exit(i32 0) noreturn nounwind
158 if.end: ; preds = %lor.lhs.false
159 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
163 declare void (i32)* @signal(i32, void (i32)*) nounwind
165 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
167 call void @exit(i32 0) noreturn nounwind
170 return: ; No predecessors!
174 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
176 %and = and i32 %__level, -2147483648
177 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
178 %cmp = icmp ult i32 %call, %__level
179 br i1 %cmp, label %if.then, label %if.end
181 if.then: ; preds = %entry
184 if.end: ; preds = %entry
185 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
186 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
187 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
188 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
189 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
190 store i32 %asmresult, i32* %__eax, align 4
191 store i32 %asmresult8, i32* %__ebx, align 4
192 store i32 %asmresult9, i32* %__ecx, align 4
193 store i32 %asmresult10, i32* %__edx, align 4
196 return: ; preds = %if.end, %if.then
197 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
201 declare void @exit(i32) noreturn
203 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
205 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
206 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
207 %tobool = icmp eq i32* %__sig, null
208 br i1 %tobool, label %if.end, label %if.then
210 if.then: ; preds = %entry
211 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
212 store i32 %asmresult1, i32* %__sig, align 4
215 if.end: ; preds = %entry, %if.then
219 !0 = metadata !{i32 -2147343294, i32 -2147343286}
220 !1 = metadata !{i32 -2147343417, i32 -2147343409}