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-align-1.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-align-1.s > vect-align-1.ll
6 ; ModuleID = 'vect-align-1.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 %struct.foo = type <{ i8, [16 x i32] }>
12 @x = 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
14 define i32 @main1(%struct.foo* noalias %p) nounwind uwtable noinline {
18 for.cond: ; preds = %for.inc, %entry
19 %indvar1 = phi i64 [ %indvar.next2, %for.inc ], [ 0, %entry ]
20 %arrayidx6 = getelementptr %struct.foo* %p, i64 0, i32 1, i64 %indvar1
21 %arrayidx = getelementptr [16 x i32]* @x, i64 0, i64 %indvar1
22 %exitcond = icmp ne i64 %indvar1, 16
23 br i1 %exitcond, label %for.body, label %for.end
25 for.body: ; preds = %for.cond
26 %tmp2 = load i32* %arrayidx, align 4
27 store i32 %tmp2, i32* %arrayidx6, align 1
30 for.inc: ; preds = %for.body
31 %indvar.next2 = add i64 %indvar1, 1
34 for.end: ; preds = %for.cond
37 for.cond8: ; preds = %for.inc23, %for.end
38 %indvar = phi i64 [ %indvar.next, %for.inc23 ], [ 0, %for.end ]
39 %arrayidx20 = getelementptr [16 x i32]* @x, i64 0, i64 %indvar
40 %arrayidx16 = getelementptr %struct.foo* %p, i64 0, i32 1, i64 %indvar
41 %i.1 = trunc i64 %indvar to i32
42 %cmp10 = icmp slt i32 %i.1, 16
43 br i1 %cmp10, label %for.body11, label %for.end26
45 for.body11: ; preds = %for.cond8
46 %tmp17 = load i32* %arrayidx16, align 1
47 %tmp21 = load i32* %arrayidx20, align 4
48 %cmp22 = icmp eq i32 %tmp17, %tmp21
49 br i1 %cmp22, label %if.end, label %if.then
51 if.then: ; preds = %for.body11
52 call void @abort() noreturn nounwind
55 if.end: ; preds = %for.body11
58 for.inc23: ; preds = %if.end
59 %indvar.next = add i64 %indvar, 1
62 for.end26: ; preds = %for.cond8
66 declare void @abort() noreturn nounwind
68 define i32 @main() nounwind uwtable {
70 %call = call noalias i8* @malloc(i64 130) nounwind
71 %tmp = bitcast i8* %call to %struct.foo*
72 call void @check_vect()
73 %call1 = call i32 @main1(%struct.foo* %tmp)
77 declare noalias i8* @malloc(i64) nounwind
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 nounwind
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 -2147226073, i32 -2147226065}
162 !1 = metadata !{i32 -2147226196, i32 -2147226188}