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-strided-store-u32-i2.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-strided-store-u32-i2.s > vect-strided-store-u32-i2.ll
6 ; ModuleID = 'vect-strided-store-u32-i2.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 @b = global [16 x i32] [i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30], align 16
11 @c = global [16 x i32] [i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31], align 16
12 @a = common global [32 x i32] zeroinitializer, align 16
14 define i32 @main1() nounwind uwtable noinline {
18 for.cond: ; preds = %for.inc, %entry
19 %indvar5 = phi i64 [ %indvar.next6, %for.inc ], [ 0, %entry ]
20 %tmp7 = mul i64 %indvar5, 2
21 %tmp8 = add i64 %tmp7, 1
22 %arrayidx23 = getelementptr [32 x i32]* @a, i64 0, i64 %tmp8
23 %arrayidx9 = getelementptr [32 x i32]* @a, i64 0, i64 %tmp7
24 %arrayidx5 = getelementptr [16 x i32]* @c, i64 0, i64 %indvar5
25 %arrayidx = getelementptr [16 x i32]* @b, i64 0, i64 %indvar5
26 %exitcond = icmp ne i64 %indvar5, 8
27 br i1 %exitcond, label %for.body, label %for.end
29 for.body: ; preds = %for.cond
30 %tmp2 = load i32* %arrayidx, align 4
31 %tmp6 = load i32* %arrayidx5, align 4
32 %add = add nsw i32 %tmp2, %tmp6
33 store i32 %add, i32* %arrayidx9, align 8
34 %tmp13 = load i32* %arrayidx, align 4
35 %tmp17 = load i32* %arrayidx5, align 4
36 %mul18 = mul nsw i32 %tmp13, %tmp17
37 store i32 %mul18, i32* %arrayidx23, align 4
40 for.inc: ; preds = %for.body
41 %indvar.next6 = add i64 %indvar5, 1
44 for.end: ; preds = %for.cond
47 for.cond25: ; preds = %for.inc60, %for.end
48 %indvar = phi i64 [ %indvar.next, %for.inc60 ], [ 0, %for.end ]
49 %tmp = mul i64 %indvar, 2
50 %tmp3 = add i64 %tmp, 1
51 %arrayidx48 = getelementptr [32 x i32]* @a, i64 0, i64 %tmp3
52 %arrayidx32 = getelementptr [32 x i32]* @a, i64 0, i64 %tmp
53 %arrayidx40 = getelementptr [16 x i32]* @c, i64 0, i64 %indvar
54 %arrayidx36 = getelementptr [16 x i32]* @b, i64 0, i64 %indvar
55 %i.1 = trunc i64 %indvar to i32
56 %cmp27 = icmp slt i32 %i.1, 8
57 br i1 %cmp27, label %for.body28, label %for.end63
59 for.body28: ; preds = %for.cond25
60 %tmp33 = load i32* %arrayidx32, align 8
61 %tmp37 = load i32* %arrayidx36, align 4
62 %tmp41 = load i32* %arrayidx40, align 4
63 %add42 = add nsw i32 %tmp37, %tmp41
64 %cmp43 = icmp eq i32 %tmp33, %add42
65 br i1 %cmp43, label %lor.lhs.false, label %if.then
67 lor.lhs.false: ; preds = %for.body28
68 %tmp49 = load i32* %arrayidx48, align 4
69 %tmp53 = load i32* %arrayidx36, align 4
70 %tmp57 = load i32* %arrayidx40, align 4
71 %mul58 = mul nsw i32 %tmp53, %tmp57
72 %cmp59 = icmp eq i32 %tmp49, %mul58
73 br i1 %cmp59, label %if.end, label %if.then
75 if.then: ; preds = %lor.lhs.false, %for.body28
76 call void @abort() noreturn nounwind
79 if.end: ; preds = %lor.lhs.false
82 for.inc60: ; preds = %if.end
83 %indvar.next = add i64 %indvar, 1
86 for.end63: ; preds = %for.cond25
90 declare void @abort() noreturn
92 define i32 @main() nounwind uwtable {
94 call void @check_vect()
95 %call = call i32 @main1()
99 define internal void @check_vect() nounwind uwtable noinline {
101 %a = alloca i32, align 4
102 %b = alloca i32, align 4
103 %c = alloca i32, align 4
104 %d = alloca i32, align 4
105 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
106 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
107 %tobool = icmp eq i32 %call1, 0
108 br i1 %tobool, label %if.then, label %lor.lhs.false
110 lor.lhs.false: ; preds = %entry
111 %tmp4 = load i32* %d, align 4
112 %and6 = and i32 %tmp4, 67108864
113 %cmp = icmp eq i32 %and6, 0
114 br i1 %cmp, label %if.then, label %if.end
116 if.then: ; preds = %entry, %lor.lhs.false
117 call void @exit(i32 0) noreturn nounwind
120 if.end: ; preds = %lor.lhs.false
121 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
125 declare void (i32)* @signal(i32, void (i32)*) nounwind
127 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
129 call void @exit(i32 0) noreturn nounwind
132 return: ; No predecessors!
136 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
138 %and = and i32 %__level, -2147483648
139 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
140 %cmp = icmp ult i32 %call, %__level
141 br i1 %cmp, label %if.then, label %if.end
143 if.then: ; preds = %entry
146 if.end: ; preds = %entry
147 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
148 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
149 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
150 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
151 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
152 store i32 %asmresult, i32* %__eax, align 4
153 store i32 %asmresult8, i32* %__ebx, align 4
154 store i32 %asmresult9, i32* %__ecx, align 4
155 store i32 %asmresult10, i32* %__edx, align 4
158 return: ; preds = %if.end, %if.then
159 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
163 declare void @exit(i32) noreturn
165 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
167 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
168 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
169 %tobool = icmp eq i32* %__sig, null
170 br i1 %tobool, label %if.end, label %if.then
172 if.then: ; preds = %entry
173 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
174 store i32 %asmresult1, i32* %__sig, align 4
177 if.end: ; preds = %entry, %if.then
181 !0 = metadata !{i32 -2147343350, i32 -2147343342}
182 !1 = metadata !{i32 -2147343473, i32 -2147343465}