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-9.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer bb-slp-9.s > bb-slp-9.ll
6 ; ModuleID = 'bb-slp-9.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) nounwind uwtable noinline {
15 %tmp1 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 1), align 4
16 %add = add i32 %tmp1, 23
17 %tmp4 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 2), align 8
18 %add5 = add i32 %tmp4, 142
19 %tmp8 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 3), align 4
20 %add9 = add i32 %tmp8, 2
21 %tmp12 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 4), align 16
22 %add13 = add i32 %tmp12, 31
23 %mul = mul i32 %add, %x
24 store i32 %mul, i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 0), align 16
25 %mul20 = mul i32 %add5, %y
26 store i32 %mul20, i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 1), align 4
27 %mul25 = mul i32 %add9, %x
28 store i32 %mul25, i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 2), align 8
29 %mul30 = mul i32 %add13, %y
30 store i32 %mul30, i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 3), align 4
31 %tmp33 = load i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 0), align 16
32 %tmp34 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 1), align 4
33 %add35 = add i32 %tmp34, 23
34 %mul37 = mul i32 %add35, %x
35 %cmp = icmp eq i32 %tmp33, %mul37
36 br i1 %cmp, label %lor.lhs.false, label %if.then
38 lor.lhs.false: ; preds = %entry
39 %tmp38 = load i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 1), align 4
40 %tmp39 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 2), align 8
41 %add40 = add i32 %tmp39, 142
42 %mul42 = mul i32 %add40, %y
43 %cmp43 = icmp eq i32 %tmp38, %mul42
44 br i1 %cmp43, label %lor.lhs.false44, label %if.then
46 lor.lhs.false44: ; preds = %lor.lhs.false
47 %tmp45 = load i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 2), align 8
48 %tmp46 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 3), align 4
49 %add47 = add i32 %tmp46, 2
50 %mul49 = mul i32 %add47, %x
51 %cmp50 = icmp eq i32 %tmp45, %mul49
52 br i1 %cmp50, label %lor.lhs.false51, label %if.then
54 lor.lhs.false51: ; preds = %lor.lhs.false44
55 %tmp52 = load i32* getelementptr inbounds ([16 x i32]* @out, i64 0, i64 3), align 4
56 %tmp53 = load i32* getelementptr inbounds ([16 x i32]* @in, i64 0, i64 4), align 16
57 %add54 = add i32 %tmp53, 31
58 %mul56 = mul i32 %add54, %y
59 %cmp57 = icmp eq i32 %tmp52, %mul56
60 br i1 %cmp57, label %if.end, label %if.then
62 if.then: ; preds = %lor.lhs.false51, %lor.lhs.false44, %lor.lhs.false, %entry
63 call void @abort() noreturn nounwind
66 if.end: ; preds = %lor.lhs.false51
70 declare void @abort() noreturn
72 define i32 @main() nounwind uwtable {
74 call void @check_vect()
75 %call = call i32 @main1(i32 2, i32 3)
79 define internal void @check_vect() nounwind uwtable noinline {
81 %a = alloca i32, align 4
82 %b = alloca i32, align 4
83 %c = alloca i32, align 4
84 %d = alloca i32, align 4
85 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
86 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
87 %tobool = icmp eq i32 %call1, 0
88 br i1 %tobool, label %if.then, label %lor.lhs.false
90 lor.lhs.false: ; preds = %entry
91 %tmp4 = load i32* %d, align 4
92 %and6 = and i32 %tmp4, 67108864
93 %cmp = icmp eq i32 %and6, 0
94 br i1 %cmp, label %if.then, label %if.end
96 if.then: ; preds = %entry, %lor.lhs.false
97 call void @exit(i32 0) noreturn nounwind
100 if.end: ; preds = %lor.lhs.false
101 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
105 declare void (i32)* @signal(i32, void (i32)*) nounwind
107 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
109 call void @exit(i32 0) noreturn nounwind
112 return: ; No predecessors!
116 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
118 %and = and i32 %__level, -2147483648
119 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
120 %cmp = icmp ult i32 %call, %__level
121 br i1 %cmp, label %if.then, label %if.end
123 if.then: ; preds = %entry
126 if.end: ; preds = %entry
127 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
128 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
129 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
130 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
131 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
132 store i32 %asmresult, i32* %__eax, align 4
133 store i32 %asmresult8, i32* %__ebx, align 4
134 store i32 %asmresult9, i32* %__ecx, align 4
135 store i32 %asmresult10, i32* %__edx, align 4
138 return: ; preds = %if.end, %if.then
139 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
143 declare void @exit(i32) noreturn
145 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
147 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
148 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
149 %tobool = icmp eq i32* %__sig, null
150 br i1 %tobool, label %if.end, label %if.then
152 if.then: ; preds = %entry
153 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
154 store i32 %asmresult1, i32* %__sig, align 4
157 if.end: ; preds = %entry, %if.then
161 !0 = metadata !{i32 -2147343340, i32 -2147343332}
162 !1 = metadata !{i32 -2147343463, i32 -2147343455}