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-63.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-63.s > vect-63.ll
6 ; ModuleID = 'vect-63.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 @main1.ib = internal unnamed_addr constant [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 define i32 @main1() nounwind uwtable noinline {
14 %ib = alloca [16 x i32], align 16
15 %ia = alloca [32 x [4 x [16 x i32]]], align 16
16 %tmp = bitcast [16 x i32]* %ib to i8*
17 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp, i8* bitcast ([16 x i32]* @main1.ib to i8*), i64 64, i32 16, i1 false)
20 for.cond: ; preds = %for.inc18, %entry
21 %indvar8 = phi i64 [ %indvar.next9, %for.inc18 ], [ 0, %entry ]
22 %arrayidx = getelementptr [16 x i32]* %ib, i64 0, i64 %indvar8
23 %exitcond12 = icmp ne i64 %indvar8, 16
24 br i1 %exitcond12, label %for.body, label %for.end21
26 for.body: ; preds = %for.cond
29 for.cond3: ; preds = %for.inc, %for.body
30 %idxprom10 = phi i64 [ %indvar.next7, %for.inc ], [ 0, %for.body ]
31 %tmp13 = mul i64 %idxprom10, 65
32 %arrayidx16 = getelementptr [32 x [4 x [16 x i32]]]* %ia, i64 0, i64 %indvar8, i64 1, i64 %tmp13
33 %exitcond = icmp ne i64 %idxprom10, 16
34 br i1 %exitcond, label %for.body6, label %for.end
36 for.body6: ; preds = %for.cond3
37 %tmp8 = load i32* %arrayidx, align 4
38 store i32 %tmp8, i32* %arrayidx16, align 4
41 for.inc: ; preds = %for.body6
42 %indvar.next7 = add i64 %idxprom10, 1
45 for.end: ; preds = %for.cond3
48 for.inc18: ; preds = %for.end
49 %indvar.next9 = add i64 %indvar8, 1
52 for.end21: ; preds = %for.cond
55 for.cond22: ; preds = %for.inc49, %for.end21
56 %indvar1 = phi i64 [ %indvar.next2, %for.inc49 ], [ 0, %for.end21 ]
57 %arrayidx42 = getelementptr [16 x i32]* %ib, i64 0, i64 %indvar1
58 %i.1 = trunc i64 %indvar1 to i32
59 %cmp24 = icmp slt i32 %i.1, 16
60 br i1 %cmp24, label %for.body25, label %for.end52
62 for.body25: ; preds = %for.cond22
65 for.cond26: ; preds = %for.inc45, %for.body25
66 %idxprom31 = phi i64 [ %indvar.next, %for.inc45 ], [ 0, %for.body25 ]
67 %tmp5 = mul i64 %idxprom31, 65
68 %arrayidx38 = getelementptr [32 x [4 x [16 x i32]]]* %ia, i64 0, i64 %indvar1, i64 1, i64 %tmp5
69 %j.1 = trunc i64 %idxprom31 to i32
70 %cmp28 = icmp slt i32 %j.1, 16
71 br i1 %cmp28, label %for.body29, label %for.end48
73 for.body29: ; preds = %for.cond26
74 %tmp39 = load i32* %arrayidx38, align 4
75 %tmp43 = load i32* %arrayidx42, align 4
76 %cmp44 = icmp eq i32 %tmp39, %tmp43
77 br i1 %cmp44, label %if.end, label %if.then
79 if.then: ; preds = %for.body29
80 call void @abort() noreturn nounwind
83 if.end: ; preds = %for.body29
86 for.inc45: ; preds = %if.end
87 %indvar.next = add i64 %idxprom31, 1
90 for.end48: ; preds = %for.cond26
93 for.inc49: ; preds = %for.end48
94 %indvar.next2 = add i64 %indvar1, 1
97 for.end52: ; preds = %for.cond22
101 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
103 declare void @abort() noreturn
105 define i32 @main() nounwind uwtable {
107 call void @check_vect()
108 %call = call i32 @main1()
112 define internal void @check_vect() nounwind uwtable noinline {
114 %a = alloca i32, align 4
115 %b = alloca i32, align 4
116 %c = alloca i32, align 4
117 %d = alloca i32, align 4
118 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
119 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
120 %tobool = icmp eq i32 %call1, 0
121 br i1 %tobool, label %if.then, label %lor.lhs.false
123 lor.lhs.false: ; preds = %entry
124 %tmp4 = load i32* %d, align 4
125 %and6 = and i32 %tmp4, 67108864
126 %cmp = icmp eq i32 %and6, 0
127 br i1 %cmp, label %if.then, label %if.end
129 if.then: ; preds = %entry, %lor.lhs.false
130 call void @exit(i32 0) noreturn nounwind
133 if.end: ; preds = %lor.lhs.false
134 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
138 declare void (i32)* @signal(i32, void (i32)*) nounwind
140 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
142 call void @exit(i32 0) noreturn nounwind
145 return: ; No predecessors!
149 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
151 %and = and i32 %__level, -2147483648
152 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
153 %cmp = icmp ult i32 %call, %__level
154 br i1 %cmp, label %if.then, label %if.end
156 if.then: ; preds = %entry
159 if.end: ; preds = %entry
160 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
161 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
162 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
163 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
164 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
165 store i32 %asmresult, i32* %__eax, align 4
166 store i32 %asmresult8, i32* %__ebx, align 4
167 store i32 %asmresult9, i32* %__ecx, align 4
168 store i32 %asmresult10, i32* %__edx, align 4
171 return: ; preds = %if.end, %if.then
172 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
176 declare void @exit(i32) noreturn
178 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
180 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
181 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
182 %tobool = icmp eq i32* %__sig, null
183 br i1 %tobool, label %if.end, label %if.then
185 if.then: ; preds = %entry
186 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
187 store i32 %asmresult1, i32* %__sig, align 4
190 if.end: ; preds = %entry, %if.then
194 !0 = metadata !{i32 -2147343465, i32 -2147343457}
195 !1 = metadata !{i32 -2147343588, i32 -2147343580}