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-iv-7.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-iv-7.s > vect-iv-7.ll
6 ; ModuleID = 'vect-iv-7.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 @result = global [16 x i32] [i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30, i32 32, i32 34, i32 36, i32 38], align 16
12 define i32 @main1(i32 %X) nounwind uwtable noinline {
14 %arr = alloca [16 x i32], align 16
15 %tmp = zext i32 %X to i64
18 do.body: ; preds = %do.cond, %entry
19 %indvar1 = phi i64 [ %indvar.next2, %do.cond ], [ 0, %entry ]
20 %tmp3 = mul i64 %tmp, %indvar1
21 %tmp4 = add i64 %tmp3, 8
22 %add = trunc i64 %tmp4 to i32
23 %arrayidx = getelementptr [16 x i32]* %arr, i64 0, i64 %indvar1
24 store i32 %add, i32* %arrayidx, align 4
27 do.cond: ; preds = %do.body
28 %indvar.next2 = add i64 %indvar1, 1
29 %exitcond = icmp ne i64 %indvar.next2, 16
30 br i1 %exitcond, label %do.body, label %do.end
32 do.end: ; preds = %do.cond
35 for.cond: ; preds = %for.inc, %do.end
36 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %do.end ]
37 %arrayidx16 = getelementptr [16 x i32]* @result, i64 0, i64 %indvar
38 %arrayidx12 = getelementptr [16 x i32]* %arr, i64 0, i64 %indvar
39 %i.1 = trunc i64 %indvar to i32
40 %cmp9 = icmp slt i32 %i.1, 16
41 br i1 %cmp9, label %for.body, label %for.end
43 for.body: ; preds = %for.cond
44 %tmp13 = load i32* %arrayidx12, align 4
45 %tmp17 = load i32* %arrayidx16, align 4
46 %cmp18 = icmp eq i32 %tmp13, %tmp17
47 br i1 %cmp18, label %if.end, label %if.then
49 if.then: ; preds = %for.body
50 call void @abort() noreturn nounwind
53 if.end: ; preds = %for.body
56 for.inc: ; preds = %if.end
57 %indvar.next = add i64 %indvar, 1
60 for.end: ; preds = %for.cond
64 declare void @abort() noreturn
66 define i32 @main() nounwind uwtable {
68 call void @check_vect()
69 %call = call i32 @main1(i32 2)
73 define internal void @check_vect() nounwind uwtable noinline {
75 %a = alloca i32, align 4
76 %b = alloca i32, align 4
77 %c = alloca i32, align 4
78 %d = alloca i32, align 4
79 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
80 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
81 %tobool = icmp eq i32 %call1, 0
82 br i1 %tobool, label %if.then, label %lor.lhs.false
84 lor.lhs.false: ; preds = %entry
85 %tmp4 = load i32* %d, align 4
86 %and6 = and i32 %tmp4, 67108864
87 %cmp = icmp eq i32 %and6, 0
88 br i1 %cmp, label %if.then, label %if.end
90 if.then: ; preds = %entry, %lor.lhs.false
91 call void @exit(i32 0) noreturn nounwind
94 if.end: ; preds = %lor.lhs.false
95 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
99 declare void (i32)* @signal(i32, void (i32)*) nounwind
101 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
103 call void @exit(i32 0) noreturn nounwind
106 return: ; No predecessors!
110 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
112 %and = and i32 %__level, -2147483648
113 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
114 %cmp = icmp ult i32 %call, %__level
115 br i1 %cmp, label %if.then, label %if.end
117 if.then: ; preds = %entry
120 if.end: ; preds = %entry
121 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
122 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
123 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
124 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
125 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
126 store i32 %asmresult, i32* %__eax, align 4
127 store i32 %asmresult8, i32* %__ebx, align 4
128 store i32 %asmresult9, i32* %__ecx, align 4
129 store i32 %asmresult10, i32* %__edx, align 4
132 return: ; preds = %if.end, %if.then
133 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
137 declare void @exit(i32) noreturn
139 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
141 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
142 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
143 %tobool = icmp eq i32* %__sig, null
144 br i1 %tobool, label %if.end, label %if.then
146 if.then: ; preds = %entry
147 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
148 store i32 %asmresult1, i32* %__sig, align 4
151 if.end: ; preds = %entry, %if.then
155 !0 = metadata !{i32 -2147343562, i32 -2147343554}
156 !1 = metadata !{i32 -2147343685, i32 -2147343677}