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-intfloat-conversion-2.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-intfloat-conversion-2.s > vect-intfloat-conversion-2.ll
6 ; ModuleID = 'vect-intfloat-conversion-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 @int_arr = 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 @float_arr = common global [32 x float] zeroinitializer, align 16
12 @char_arr = common global [32 x i8] 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 %arrayidx8 = getelementptr [32 x i8]* @char_arr, i64 0, i64 %indvar1
21 %arrayidx5 = getelementptr [32 x float]* @float_arr, i64 0, i64 %indvar1
22 %arrayidx = getelementptr [32 x i32]* @int_arr, i64 0, i64 %indvar1
23 %exitcond = icmp ne i64 %indvar1, 32
24 br i1 %exitcond, label %for.body, label %for.end
26 for.body: ; preds = %for.cond
27 %tmp2 = load i32* %arrayidx, align 4
28 %conv = sitofp i32 %tmp2 to float
29 store float %conv, float* %arrayidx5, align 4
30 store i8 0, i8* %arrayidx8, align 1
33 for.inc: ; preds = %for.body
34 %indvar.next2 = add i64 %indvar1, 1
37 for.end: ; preds = %for.cond
40 for.cond10: ; preds = %for.inc35, %for.end
41 %indvar = phi i64 [ %indvar.next, %for.inc35 ], [ 0, %for.end ]
42 %arrayidx28 = getelementptr [32 x i8]* @char_arr, i64 0, i64 %indvar
43 %arrayidx21 = getelementptr [32 x i32]* @int_arr, i64 0, i64 %indvar
44 %arrayidx17 = getelementptr [32 x float]* @float_arr, i64 0, i64 %indvar
45 %i.1 = trunc i64 %indvar to i32
46 %cmp12 = icmp slt i32 %i.1, 32
47 br i1 %cmp12, label %for.body14, label %for.end38
49 for.body14: ; preds = %for.cond10
50 %tmp18 = load float* %arrayidx17, align 4
51 %tmp22 = load i32* %arrayidx21, align 4
52 %conv23 = sitofp i32 %tmp22 to float
53 %cmp24 = fcmp une float %tmp18, %conv23
54 br i1 %cmp24, label %if.then, label %if.end
56 if.then: ; preds = %for.body14
57 call void @abort() noreturn nounwind
60 if.end: ; preds = %for.body14
61 %tmp29 = load i8* %arrayidx28, align 1
62 %cmp31 = icmp eq i8 %tmp29, 0
63 br i1 %cmp31, label %if.end34, label %if.then33
65 if.then33: ; preds = %if.end
66 call void @abort() noreturn nounwind
69 if.end34: ; preds = %if.end
72 for.inc35: ; preds = %if.end34
73 %indvar.next = add i64 %indvar, 1
76 for.end38: ; preds = %for.cond10
80 declare void @abort() noreturn
82 define i32 @main() nounwind uwtable {
84 call void @check_vect()
85 %call = call i32 @main1()
89 define internal void @check_vect() nounwind uwtable noinline {
91 %a = alloca i32, align 4
92 %b = alloca i32, align 4
93 %c = alloca i32, align 4
94 %d = alloca i32, align 4
95 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
96 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
97 %tobool = icmp eq i32 %call1, 0
98 br i1 %tobool, label %if.then, label %lor.lhs.false
100 lor.lhs.false: ; preds = %entry
101 %tmp4 = load i32* %d, align 4
102 %and6 = and i32 %tmp4, 67108864
103 %cmp = icmp eq i32 %and6, 0
104 br i1 %cmp, label %if.then, label %if.end
106 if.then: ; preds = %entry, %lor.lhs.false
107 call void @exit(i32 0) noreturn nounwind
110 if.end: ; preds = %lor.lhs.false
111 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
115 declare void (i32)* @signal(i32, void (i32)*) nounwind
117 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
119 call void @exit(i32 0) noreturn nounwind
122 return: ; No predecessors!
126 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
128 %and = and i32 %__level, -2147483648
129 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
130 %cmp = icmp ult i32 %call, %__level
131 br i1 %cmp, label %if.then, label %if.end
133 if.then: ; preds = %entry
136 if.end: ; preds = %entry
137 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
138 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
139 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
140 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
141 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
142 store i32 %asmresult, i32* %__eax, align 4
143 store i32 %asmresult8, i32* %__ebx, align 4
144 store i32 %asmresult9, i32* %__ecx, align 4
145 store i32 %asmresult10, i32* %__edx, align 4
148 return: ; preds = %if.end, %if.then
149 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
153 declare void @exit(i32) noreturn
155 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
157 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
158 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
159 %tobool = icmp eq i32* %__sig, null
160 br i1 %tobool, label %if.end, label %if.then
162 if.then: ; preds = %entry
163 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
164 store i32 %asmresult1, i32* %__sig, align 4
167 if.end: ; preds = %entry, %if.then
171 !0 = metadata !{i32 -2147343525, i32 -2147343517}
172 !1 = metadata !{i32 -2147343648, i32 -2147343640}