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-3.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-intfloat-conversion-3.s > vect-intfloat-conversion-3.ll
6 ; ModuleID = 'vect-intfloat-conversion-3.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 @da = common global [32 x double] zeroinitializer, align 16
13 define i32 @main1() nounwind uwtable noinline {
17 for.cond: ; preds = %for.inc, %entry
18 %indvar1 = phi i64 [ %indvar.next2, %for.inc ], [ 0, %entry ]
19 %arrayidx5 = getelementptr [32 x double]* @da, i64 0, i64 %indvar1
20 %arrayidx = getelementptr [32 x i32]* @ib, i64 0, i64 %indvar1
21 %exitcond = icmp ne i64 %indvar1, 32
22 br i1 %exitcond, label %for.body, label %for.end
24 for.body: ; preds = %for.cond
25 %tmp2 = load i32* %arrayidx, align 4
26 %conv = sitofp i32 %tmp2 to double
27 store double %conv, double* %arrayidx5, align 8
30 for.inc: ; preds = %for.body
31 %indvar.next2 = add i64 %indvar1, 1
34 for.end: ; preds = %for.cond
37 for.cond7: ; preds = %for.inc23, %for.end
38 %indvar = phi i64 [ %indvar.next, %for.inc23 ], [ 0, %for.end ]
39 %arrayidx18 = getelementptr [32 x i32]* @ib, i64 0, i64 %indvar
40 %arrayidx14 = getelementptr [32 x double]* @da, i64 0, i64 %indvar
41 %i.1 = trunc i64 %indvar to i32
42 %cmp9 = icmp slt i32 %i.1, 32
43 br i1 %cmp9, label %for.body11, label %for.end26
45 for.body11: ; preds = %for.cond7
46 %tmp15 = load double* %arrayidx14, align 8
47 %tmp19 = load i32* %arrayidx18, align 4
48 %conv20 = sitofp i32 %tmp19 to double
49 %cmp21 = fcmp une double %tmp15, %conv20
50 br i1 %cmp21, label %if.then, label %if.end
52 if.then: ; preds = %for.body11
53 call void @abort() noreturn nounwind
56 if.end: ; preds = %for.body11
59 for.inc23: ; preds = %if.end
60 %indvar.next = add i64 %indvar, 1
63 for.end26: ; preds = %for.cond7
67 declare void @abort() noreturn
69 define i32 @main() nounwind uwtable {
71 call void @check_vect()
72 %call = call i32 @main1()
76 define internal void @check_vect() nounwind uwtable noinline {
78 %a = alloca i32, align 4
79 %b = alloca i32, align 4
80 %c = alloca i32, align 4
81 %d = alloca i32, align 4
82 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
83 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
84 %tobool = icmp eq i32 %call1, 0
85 br i1 %tobool, label %if.then, label %lor.lhs.false
87 lor.lhs.false: ; preds = %entry
88 %tmp4 = load i32* %d, align 4
89 %and6 = and i32 %tmp4, 67108864
90 %cmp = icmp eq i32 %and6, 0
91 br i1 %cmp, label %if.then, label %if.end
93 if.then: ; preds = %entry, %lor.lhs.false
94 call void @exit(i32 0) noreturn nounwind
97 if.end: ; preds = %lor.lhs.false
98 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
102 declare void (i32)* @signal(i32, void (i32)*) nounwind
104 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
106 call void @exit(i32 0) noreturn nounwind
109 return: ; No predecessors!
113 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
115 %and = and i32 %__level, -2147483648
116 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
117 %cmp = icmp ult i32 %call, %__level
118 br i1 %cmp, label %if.then, label %if.end
120 if.then: ; preds = %entry
123 if.end: ; preds = %entry
124 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
125 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
126 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
127 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
128 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
129 store i32 %asmresult, i32* %__eax, align 4
130 store i32 %asmresult8, i32* %__ebx, align 4
131 store i32 %asmresult9, i32* %__ecx, align 4
132 store i32 %asmresult10, i32* %__edx, align 4
135 return: ; preds = %if.end, %if.then
136 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
140 declare void @exit(i32) noreturn
142 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
144 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
145 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
146 %tobool = icmp eq i32* %__sig, null
147 br i1 %tobool, label %if.end, label %if.then
149 if.then: ; preds = %entry
150 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
151 store i32 %asmresult1, i32* %__sig, align 4
154 if.end: ; preds = %entry, %if.then
158 !0 = metadata !{i32 -2147343603, i32 -2147343595}
159 !1 = metadata !{i32 -2147343726, i32 -2147343718}