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-77-alignchecks.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-77-alignchecks.s > vect-77-alignchecks.ll
6 ; ModuleID = 'vect-77-alignchecks.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 @ib = global [16 x i32] [i32 0, i32 1, i32 3, i32 5, i32 7, i32 11, i32 13, i32 17, i32 0, i32 2, i32 6, i32 10, i32 14, i32 22, i32 26, i32 34], align 16
12 define i32 @main1(i32* %ib, i32 %off) nounwind uwtable noinline {
14 %ia = alloca [8 x i32], align 16
15 %tmp6 = zext i32 %off to i64
18 for.cond: ; preds = %for.inc, %entry
19 %indvar4 = phi i64 [ %indvar.next5, %for.inc ], [ 0, %entry ]
20 %arrayidx7 = getelementptr [8 x i32]* %ia, i64 0, i64 %indvar4
21 %tmp7 = add i64 %tmp6, %indvar4
22 %add = trunc i64 %tmp7 to i32
23 %exitcond = icmp ne i64 %indvar4, 8
24 br i1 %exitcond, label %for.body, label %for.end
26 for.body: ; preds = %for.cond
27 %idxprom = sext i32 %add to i64
28 %arrayidx = getelementptr inbounds i32* %ib, i64 %idxprom
29 %tmp4 = load i32* %arrayidx, align 4
30 store i32 %tmp4, i32* %arrayidx7, align 4
33 for.inc: ; preds = %for.body
34 %indvar.next5 = add i64 %indvar4, 1
37 for.end: ; preds = %for.cond
38 %tmp = zext i32 %off to i64
41 for.cond9: ; preds = %for.inc25, %for.end
42 %indvar = phi i64 [ %indvar.next, %for.inc25 ], [ 0, %for.end ]
43 %tmp1 = add i64 %tmp, %indvar
44 %add19 = trunc i64 %tmp1 to i32
45 %arrayidx15 = getelementptr [8 x i32]* %ia, i64 0, i64 %indvar
46 %i.1 = trunc i64 %indvar to i32
47 %cmp11 = icmp slt i32 %i.1, 8
48 br i1 %cmp11, label %for.body12, label %for.end28
50 for.body12: ; preds = %for.cond9
51 %tmp16 = load i32* %arrayidx15, align 4
52 %idxprom20 = sext i32 %add19 to i64
53 %arrayidx22 = getelementptr inbounds i32* %ib, i64 %idxprom20
54 %tmp23 = load i32* %arrayidx22, align 4
55 %cmp24 = icmp eq i32 %tmp16, %tmp23
56 br i1 %cmp24, label %if.end, label %if.then
58 if.then: ; preds = %for.body12
59 call void @abort() noreturn nounwind
62 if.end: ; preds = %for.body12
65 for.inc25: ; preds = %if.end
66 %indvar.next = add i64 %indvar, 1
69 for.end28: ; preds = %for.cond9
73 declare void @abort() noreturn
75 define i32 @main() nounwind uwtable {
77 call void @check_vect()
78 %call = call i32 @main1(i32* getelementptr inbounds ([16 x i32]* @ib, i64 0, i64 0), i32 8)
82 define internal void @check_vect() nounwind uwtable noinline {
84 %a = alloca i32, align 4
85 %b = alloca i32, align 4
86 %c = alloca i32, align 4
87 %d = alloca i32, align 4
88 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
89 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
90 %tobool = icmp eq i32 %call1, 0
91 br i1 %tobool, label %if.then, label %lor.lhs.false
93 lor.lhs.false: ; preds = %entry
94 %tmp4 = load i32* %d, align 4
95 %and6 = and i32 %tmp4, 67108864
96 %cmp = icmp eq i32 %and6, 0
97 br i1 %cmp, label %if.then, label %if.end
99 if.then: ; preds = %entry, %lor.lhs.false
100 call void @exit(i32 0) noreturn nounwind
103 if.end: ; preds = %lor.lhs.false
104 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
108 declare void (i32)* @signal(i32, void (i32)*) nounwind
110 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
112 call void @exit(i32 0) noreturn nounwind
115 return: ; No predecessors!
119 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
121 %and = and i32 %__level, -2147483648
122 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
123 %cmp = icmp ult i32 %call, %__level
124 br i1 %cmp, label %if.then, label %if.end
126 if.then: ; preds = %entry
129 if.end: ; preds = %entry
130 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
131 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
132 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
133 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
134 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
135 store i32 %asmresult, i32* %__eax, align 4
136 store i32 %asmresult8, i32* %__ebx, align 4
137 store i32 %asmresult9, i32* %__ecx, align 4
138 store i32 %asmresult10, i32* %__edx, align 4
141 return: ; preds = %if.end, %if.then
142 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
146 declare void @exit(i32) noreturn
148 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
150 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
151 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
152 %tobool = icmp eq i32* %__sig, null
153 br i1 %tobool, label %if.end, label %if.then
155 if.then: ; preds = %entry
156 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
157 store i32 %asmresult1, i32* %__sig, align 4
160 if.end: ; preds = %entry, %if.then
164 !0 = metadata !{i32 -2147342265, i32 -2147342257}
165 !1 = metadata !{i32 -2147342388, i32 -2147342380}