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-108.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-108.s > vect-108.ll
6 ; ModuleID = 'vect-108.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 @ic = 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 @ib = 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
12 @ia = common global [16 x i32] zeroinitializer, align 16
14 define i32 @main1() nounwind uwtable noinline {
18 for.cond: ; preds = %for.inc, %entry
19 %indvar1 = phi i64 [ %indvar.next2, %for.inc ], [ 0, %entry ]
20 %arrayidx9 = getelementptr [16 x i32]* @ia, i64 0, i64 %indvar1
21 %arrayidx5 = getelementptr [16 x i32]* @ic, i64 0, i64 %indvar1
22 %arrayidx = getelementptr [16 x i32]* @ib, i64 0, i64 %indvar1
23 %exitcond = icmp ne i64 %indvar1, 16
24 br i1 %exitcond, label %for.body, label %for.end
26 for.body: ; preds = %for.cond
27 %tmp2 = load i32* %arrayidx, align 4
28 %tmp6 = load i32* %arrayidx5, align 4
29 %mul = mul nsw i32 %tmp2, %tmp6
30 store i32 %mul, i32* %arrayidx9, align 4
33 for.inc: ; preds = %for.body
34 %indvar.next2 = add i64 %indvar1, 1
37 for.end: ; preds = %for.cond
40 for.cond11: ; preds = %for.inc29, %for.end
41 %indvar = phi i64 [ %indvar.next, %for.inc29 ], [ 0, %for.end ]
42 %arrayidx25 = getelementptr [16 x i32]* @ic, i64 0, i64 %indvar
43 %arrayidx21 = getelementptr [16 x i32]* @ib, i64 0, i64 %indvar
44 %arrayidx17 = getelementptr [16 x i32]* @ia, i64 0, i64 %indvar
45 %i.1 = trunc i64 %indvar to i32
46 %cmp13 = icmp slt i32 %i.1, 16
47 br i1 %cmp13, label %for.body14, label %for.end32
49 for.body14: ; preds = %for.cond11
50 %tmp18 = load i32* %arrayidx17, align 4
51 %tmp22 = load i32* %arrayidx21, align 4
52 %tmp26 = load i32* %arrayidx25, align 4
53 %mul27 = mul nsw i32 %tmp22, %tmp26
54 %cmp28 = icmp eq i32 %tmp18, %mul27
55 br i1 %cmp28, label %if.end, label %if.then
57 if.then: ; preds = %for.body14
58 call void @abort() noreturn nounwind
61 if.end: ; preds = %for.body14
64 for.inc29: ; preds = %if.end
65 %indvar.next = add i64 %indvar, 1
68 for.end32: ; preds = %for.cond11
72 declare void @abort() noreturn
74 define i32 @main() nounwind uwtable {
76 call void @check_vect()
77 %call = call i32 @main1()
81 define internal void @check_vect() nounwind uwtable noinline {
83 %a = alloca i32, align 4
84 %b = alloca i32, align 4
85 %c = alloca i32, align 4
86 %d = alloca i32, align 4
87 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
88 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
89 %tobool = icmp eq i32 %call1, 0
90 br i1 %tobool, label %if.then, label %lor.lhs.false
92 lor.lhs.false: ; preds = %entry
93 %tmp4 = load i32* %d, align 4
94 %and6 = and i32 %tmp4, 67108864
95 %cmp = icmp eq i32 %and6, 0
96 br i1 %cmp, label %if.then, label %if.end
98 if.then: ; preds = %entry, %lor.lhs.false
99 call void @exit(i32 0) noreturn nounwind
102 if.end: ; preds = %lor.lhs.false
103 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
107 declare void (i32)* @signal(i32, void (i32)*) nounwind
109 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
111 call void @exit(i32 0) noreturn nounwind
114 return: ; No predecessors!
118 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
120 %and = and i32 %__level, -2147483648
121 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
122 %cmp = icmp ult i32 %call, %__level
123 br i1 %cmp, label %if.then, label %if.end
125 if.then: ; preds = %entry
128 if.end: ; preds = %entry
129 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
130 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
131 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
132 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
133 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
134 store i32 %asmresult, i32* %__eax, align 4
135 store i32 %asmresult8, i32* %__ebx, align 4
136 store i32 %asmresult9, i32* %__ecx, align 4
137 store i32 %asmresult10, i32* %__edx, align 4
140 return: ; preds = %if.end, %if.then
141 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
145 declare void @exit(i32) noreturn
147 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
149 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
150 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
151 %tobool = icmp eq i32* %__sig, null
152 br i1 %tobool, label %if.end, label %if.then
154 if.then: ; preds = %entry
155 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
156 store i32 %asmresult1, i32* %__sig, align 4
159 if.end: ; preds = %entry, %if.then
163 !0 = metadata !{i32 -2147343580, i32 -2147343572}
164 !1 = metadata !{i32 -2147343703, i32 -2147343695}