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 bb-slp-8.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer bb-slp-8.s > bb-slp-8.ll
6 ; ModuleID = 'bb-slp-8.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 @in = 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
11 @out = common global [16 x i32] zeroinitializer, align 16
13 define i32 @main1(i32 %x, i32 %y, i32* %pin, i32* %pout) nounwind uwtable noinline {
15 %incdec.ptr = getelementptr inbounds i32* %pin, i64 1
16 %tmp1 = load i32* %pin, align 4
17 %add = add i32 %tmp1, 23
18 %incdec.ptr3 = getelementptr inbounds i32* %pin, i64 2
19 %tmp4 = load i32* %incdec.ptr, align 4
20 %add5 = add i32 %tmp4, 142
21 %incdec.ptr7 = getelementptr inbounds i32* %pin, i64 3
22 %tmp8 = load i32* %incdec.ptr3, align 4
23 %add9 = add i32 %tmp8, 2
24 %tmp12 = load i32* %incdec.ptr7, align 4
25 %add13 = add i32 %tmp12, 31
26 %mul = mul i32 %add, %x
27 %incdec.ptr17 = getelementptr inbounds i32* %pout, i64 1
28 store i32 %mul, i32* %pout, align 4
29 %mul20 = mul i32 %add5, %y
30 %incdec.ptr22 = getelementptr inbounds i32* %pout, i64 2
31 store i32 %mul20, i32* %incdec.ptr17, align 4
32 %mul25 = mul i32 %add9, %x
33 %incdec.ptr27 = getelementptr inbounds i32* %pout, i64 3
34 store i32 %mul25, i32* %incdec.ptr22, align 4
35 %mul30 = mul i32 %add13, %y
36 store i32 %mul30, i32* %incdec.ptr27, align 4
37 br i1 undef, label %if.then, label %if.end
39 if.then: ; preds = %entry
40 call void asm sideeffect "", "~{memory},~{dirflag},~{fpsr},~{flags}"() nounwind, !srcloc !0
43 if.end: ; preds = %if.then, %entry
44 %tmp34 = load i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 0), align 16
45 %tmp35 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 0), align 16
46 %add36 = add i32 %tmp35, 23
47 %mul38 = mul i32 %add36, %x
48 %cmp = icmp eq i32 %tmp34, %mul38
49 br i1 %cmp, label %lor.lhs.false, label %if.then59
51 lor.lhs.false: ; preds = %if.end
52 %tmp39 = load i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 1), align 4
53 %tmp40 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 1), align 4
54 %add41 = add i32 %tmp40, 142
55 %mul43 = mul i32 %add41, %y
56 %cmp44 = icmp eq i32 %tmp39, %mul43
57 br i1 %cmp44, label %lor.lhs.false45, label %if.then59
59 lor.lhs.false45: ; preds = %lor.lhs.false
60 %tmp46 = load i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 2), align 8
61 %tmp47 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 2), align 8
62 %add48 = add i32 %tmp47, 2
63 %mul50 = mul i32 %add48, %x
64 %cmp51 = icmp eq i32 %tmp46, %mul50
65 br i1 %cmp51, label %lor.lhs.false52, label %if.then59
67 lor.lhs.false52: ; preds = %lor.lhs.false45
68 %tmp53 = load i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 3), align 4
69 %tmp54 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 3), align 4
70 %add55 = add i32 %tmp54, 31
71 %mul57 = mul i32 %add55, %y
72 %cmp58 = icmp eq i32 %tmp53, %mul57
73 br i1 %cmp58, label %if.end60, label %if.then59
75 if.then59: ; preds = %lor.lhs.false52, %lor.lhs.false45, %lor.lhs.false, %if.end
76 call void @abort() noreturn nounwind
79 if.end60: ; preds = %lor.lhs.false52
83 declare void @abort() noreturn
85 define i32 @main() nounwind uwtable {
87 call void @check_vect()
88 %call = call i32 @main1(i32 2, i32 3, i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 0), i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 0))
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 (i32)* @signal(i32, void (i32)*) nounwind
120 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
122 call void @exit(i32 0) noreturn nounwind
125 return: ; No predecessors!
129 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
131 %and = and i32 %__level, -2147483648
132 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
133 %cmp = icmp ult i32 %call, %__level
134 br i1 %cmp, label %if.then, label %if.end
136 if.then: ; preds = %entry
139 if.end: ; preds = %entry
140 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !1
141 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
142 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
143 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
144 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
145 store i32 %asmresult, i32* %__eax, align 4
146 store i32 %asmresult8, i32* %__ebx, align 4
147 store i32 %asmresult9, i32* %__ecx, align 4
148 store i32 %asmresult10, i32* %__edx, align 4
151 return: ; preds = %if.end, %if.then
152 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
156 declare void @exit(i32) noreturn
158 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
160 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !2
161 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
162 %tobool = icmp eq i32* %__sig, null
163 br i1 %tobool, label %if.end, label %if.then
165 if.then: ; preds = %entry
166 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
167 store i32 %asmresult1, i32* %__sig, align 4
170 if.end: ; preds = %entry, %if.then
174 !0 = metadata !{i32 664}
175 !1 = metadata !{i32 -2147343192, i32 -2147343184}
176 !2 = metadata !{i32 -2147343315, i32 -2147343307}