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-multitypes-2.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-multitypes-2.s > vect-multitypes-2.ll
6 ; ModuleID = 'vect-multitypes-2.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 [32 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, 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 @sb = global [32 x i16] [i16 0, i16 3, i16 6, i16 9, i16 12, i16 15, i16 18, i16 21, i16 24, i16 27, i16 30, i16 33, i16 36, i16 39, i16 42, i16 45, i16 0, i16 3, i16 6, i16 9, i16 12, i16 15, i16 18, i16 21, i16 24, i16 27, i16 30, i16 33, i16 36, i16 39, i16 42, i16 45], align 16
12 @cb = global [32 x i8] c"\00\03\06\09\0C\0F\12\15\18\1B\1E!$'*-\00\03\06\09\0C\0F\12\15\18\1B\1E!$'*-", align 16
13 @ia = common global [32 x i32] zeroinitializer, align 16
14 @sa = common global [32 x i16] zeroinitializer, align 16
15 @ca = common global [32 x i8] zeroinitializer, align 16
17 define i32 @main1() nounwind uwtable noinline {
21 for.cond: ; preds = %for.inc, %entry
22 %indvar1 = phi i64 [ %indvar.next2, %for.inc ], [ 0, %entry ]
23 %arrayidx19 = getelementptr [32 x i8]* @ca, i64 0, i64 %indvar1
24 %arrayidx15 = getelementptr [32 x i8]* @cb, i64 0, i64 %indvar1
25 %arrayidx12 = getelementptr [32 x i16]* @sa, i64 0, i64 %indvar1
26 %arrayidx8 = getelementptr [32 x i16]* @sb, i64 0, i64 %indvar1
27 %arrayidx5 = getelementptr [32 x i32]* @ia, i64 0, i64 %indvar1
28 %arrayidx = getelementptr [32 x i32]* @ib, i64 0, i64 %indvar1
29 %exitcond = icmp ne i64 %indvar1, 32
30 br i1 %exitcond, label %for.body, label %for.end
32 for.body: ; preds = %for.cond
33 %tmp2 = load i32* %arrayidx, align 4
34 store i32 %tmp2, i32* %arrayidx5, align 4
35 %tmp9 = load i16* %arrayidx8, align 2
36 store i16 %tmp9, i16* %arrayidx12, align 2
37 %tmp16 = load i8* %arrayidx15, align 1
38 store i8 %tmp16, i8* %arrayidx19, align 1
41 for.inc: ; preds = %for.body
42 %indvar.next2 = add i64 %indvar1, 1
45 for.end: ; preds = %for.cond
48 for.cond21: ; preds = %for.inc58, %for.end
49 %indvar = phi i64 [ %indvar.next, %for.inc58 ], [ 0, %for.end ]
50 %arrayidx53 = getelementptr [32 x i8]* @cb, i64 0, i64 %indvar
51 %arrayidx48 = getelementptr [32 x i8]* @ca, i64 0, i64 %indvar
52 %arrayidx40 = getelementptr [32 x i16]* @sb, i64 0, i64 %indvar
53 %arrayidx36 = getelementptr [32 x i16]* @sa, i64 0, i64 %indvar
54 %arrayidx31 = getelementptr [32 x i32]* @ib, i64 0, i64 %indvar
55 %arrayidx27 = getelementptr [32 x i32]* @ia, i64 0, i64 %indvar
56 %i.1 = trunc i64 %indvar to i32
57 %cmp23 = icmp slt i32 %i.1, 32
58 br i1 %cmp23, label %for.body24, label %for.end61
60 for.body24: ; preds = %for.cond21
61 %tmp28 = load i32* %arrayidx27, align 4
62 %tmp32 = load i32* %arrayidx31, align 4
63 %cmp33 = icmp eq i32 %tmp28, %tmp32
64 br i1 %cmp33, label %lor.lhs.false, label %if.then
66 lor.lhs.false: ; preds = %for.body24
67 %tmp37 = load i16* %arrayidx36, align 2
68 %tmp41 = load i16* %arrayidx40, align 2
69 %cmp43 = icmp eq i16 %tmp37, %tmp41
70 br i1 %cmp43, label %lor.lhs.false45, label %if.then
72 lor.lhs.false45: ; preds = %lor.lhs.false
73 %tmp49 = load i8* %arrayidx48, align 1
74 %tmp54 = load i8* %arrayidx53, align 1
75 %cmp56 = icmp eq i8 %tmp49, %tmp54
76 br i1 %cmp56, label %if.end, label %if.then
78 if.then: ; preds = %lor.lhs.false45, %lor.lhs.false, %for.body24
79 call void @abort() noreturn nounwind
82 if.end: ; preds = %lor.lhs.false45
85 for.inc58: ; preds = %if.end
86 %indvar.next = add i64 %indvar, 1
89 for.end61: ; preds = %for.cond21
93 declare void @abort() noreturn
95 define i32 @main() nounwind uwtable {
97 call void @check_vect()
98 %call = call i32 @main1()
102 define internal void @check_vect() nounwind uwtable noinline {
104 %a = alloca i32, align 4
105 %b = alloca i32, align 4
106 %c = alloca i32, align 4
107 %d = alloca i32, align 4
108 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
109 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
110 %tobool = icmp eq i32 %call1, 0
111 br i1 %tobool, label %if.then, label %lor.lhs.false
113 lor.lhs.false: ; preds = %entry
114 %tmp4 = load i32* %d, align 4
115 %and6 = and i32 %tmp4, 67108864
116 %cmp = icmp eq i32 %and6, 0
117 br i1 %cmp, label %if.then, label %if.end
119 if.then: ; preds = %entry, %lor.lhs.false
120 call void @exit(i32 0) noreturn nounwind
123 if.end: ; preds = %lor.lhs.false
124 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
128 declare void (i32)* @signal(i32, void (i32)*) nounwind
130 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
132 call void @exit(i32 0) noreturn nounwind
135 return: ; No predecessors!
139 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
141 %and = and i32 %__level, -2147483648
142 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
143 %cmp = icmp ult i32 %call, %__level
144 br i1 %cmp, label %if.then, label %if.end
146 if.then: ; preds = %entry
149 if.end: ; preds = %entry
150 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
151 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
152 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
153 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
154 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
155 store i32 %asmresult, i32* %__eax, align 4
156 store i32 %asmresult8, i32* %__ebx, align 4
157 store i32 %asmresult9, i32* %__ecx, align 4
158 store i32 %asmresult10, i32* %__edx, align 4
161 return: ; preds = %if.end, %if.then
162 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
166 declare void @exit(i32) noreturn
168 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
170 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
171 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
172 %tobool = icmp eq i32* %__sig, null
173 br i1 %tobool, label %if.end, label %if.then
175 if.then: ; preds = %entry
176 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
177 store i32 %asmresult1, i32* %__sig, align 4
180 if.end: ; preds = %entry, %if.then
184 !0 = metadata !{i32 -2147343242, i32 -2147343234}
185 !1 = metadata !{i32 -2147343365, i32 -2147343357}