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-3.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-reduc-3.s > vect-reduc-3.ll
6 ; ModuleID = 'vect-reduc-3.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 @ub = global [16 x i32] [i32 0, 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 @uc = global [16 x i32] [i32 0, 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 i32 @main1(i32 %n, i32 %res) nounwind uwtable noinline {
15 %tmp = icmp sgt i32 %n, 0
16 %smax = select i1 %tmp, i32 %n, i32 0
17 %tmp1 = zext i32 %smax to i64
20 for.cond: ; preds = %for.inc, %entry
21 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
22 %udiff.0 = phi i32 [ 0, %entry ], [ %add, %for.inc ]
23 %arrayidx6 = getelementptr [16 x i32]* @uc, i64 0, i64 %indvar
24 %arrayidx = getelementptr [16 x i32]* @ub, i64 0, i64 %indvar
25 %exitcond = icmp ne i64 %indvar, %tmp1
26 br i1 %exitcond, label %for.body, label %for.end
28 for.body: ; preds = %for.cond
31 for.inc: ; preds = %for.body
32 %tmp7 = load i32* %arrayidx6, align 4
33 %tmp3 = load i32* %arrayidx, align 4
34 %sub = sub i32 %tmp3, %tmp7
35 %add = add i32 %udiff.0, %sub
36 %indvar.next = add i64 %indvar, 1
39 for.end: ; preds = %for.cond
40 %udiff.0.lcssa = phi i32 [ %udiff.0, %for.cond ]
41 %cmp12 = icmp eq i32 %udiff.0.lcssa, %res
42 br i1 %cmp12, label %if.end, label %if.then
44 if.then: ; preds = %for.end
45 call void @abort() noreturn nounwind
48 if.end: ; preds = %for.end
52 declare void @abort() noreturn
54 define i32 @main() nounwind uwtable {
56 call void @check_vect()
57 %call = call i32 @main1(i32 16, i32 240)
58 %call1 = call i32 @main1(i32 15, i32 210)
62 define internal void @check_vect() nounwind uwtable noinline {
64 %a = alloca i32, align 4
65 %b = alloca i32, align 4
66 %c = alloca i32, align 4
67 %d = alloca i32, align 4
68 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
69 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
70 %tobool = icmp eq i32 %call1, 0
71 br i1 %tobool, label %if.then, label %lor.lhs.false
73 lor.lhs.false: ; preds = %entry
74 %tmp4 = load i32* %d, align 4
75 %and6 = and i32 %tmp4, 67108864
76 %cmp = icmp eq i32 %and6, 0
77 br i1 %cmp, label %if.then, label %if.end
79 if.then: ; preds = %entry, %lor.lhs.false
80 call void @exit(i32 0) noreturn nounwind
83 if.end: ; preds = %lor.lhs.false
84 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
88 declare void (i32)* @signal(i32, void (i32)*) nounwind
90 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
92 call void @exit(i32 0) noreturn nounwind
95 return: ; No predecessors!
99 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
101 %and = and i32 %__level, -2147483648
102 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
103 %cmp = icmp ult i32 %call, %__level
104 br i1 %cmp, label %if.then, label %if.end
106 if.then: ; preds = %entry
109 if.end: ; preds = %entry
110 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
111 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
112 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
113 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
114 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
115 store i32 %asmresult, i32* %__eax, align 4
116 store i32 %asmresult8, i32* %__ebx, align 4
117 store i32 %asmresult9, i32* %__ecx, align 4
118 store i32 %asmresult10, i32* %__edx, align 4
121 return: ; preds = %if.end, %if.then
122 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
126 declare void @exit(i32) noreturn
128 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
130 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
131 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
132 %tobool = icmp eq i32* %__sig, null
133 br i1 %tobool, label %if.end, label %if.then
135 if.then: ; preds = %entry
136 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
137 store i32 %asmresult1, i32* %__sig, align 4
140 if.end: ; preds = %entry, %if.then
144 !0 = metadata !{i32 -2147343509, i32 -2147343501}
145 !1 = metadata !{i32 -2147343632, i32 -2147343624}