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 if-cvt-stores-vect-ifcvt-18.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer if-cvt-stores-vect-ifcvt-18.s > if-cvt-stores-vect-ifcvt-18.ll
6 ; ModuleID = 'if-cvt-stores-vect-ifcvt-18.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 %struct.data = type { i16, i16 }
12 @result = global [100 x i16] [i16 10, i16 -7, i16 11, i16 -6, i16 12, i16 -5, i16 13, i16 -4, i16 14, i16 -3, i16 15, i16 -2, i16 16, i16 -1, i16 17, i16 0, i16 18, i16 1, i16 19, i16 2, i16 20, i16 3, i16 21, i16 4, i16 22, i16 5, i16 23, i16 6, i16 24, i16 7, i16 25, i16 8, i16 26, i16 9, i16 27, i16 10, i16 28, i16 11, i16 29, i16 12, i16 30, i16 13, i16 31, i16 14, i16 32, i16 15, i16 33, i16 16, i16 34, i16 17, i16 35, i16 18, i16 36, i16 19, i16 37, i16 20, i16 38, i16 21, i16 39, i16 22, i16 40, i16 23, i16 41, i16 24, i16 42, i16 25, i16 43, i16 26, i16 44, i16 27, i16 45, i16 28, i16 46, i16 29, i16 47, i16 30, i16 48, i16 31, i16 49, i16 32, i16 50, i16 33, i16 51, i16 34, i16 52, i16 35, i16 53, i16 36, i16 54, i16 37, i16 55, i16 38, i16 56, i16 39, i16 57, i16 40, i16 58, i16 41, i16 59, i16 42], align 16
13 @in1 = common global [50 x %struct.data] zeroinitializer, align 16
14 @in2 = common global [50 x %struct.data] zeroinitializer, align 16
15 @out = common global [50 x %struct.data] zeroinitializer, align 16
16 @out1 = common global [50 x i16] zeroinitializer, align 16
17 @out2 = common global [50 x i16] zeroinitializer, align 16
19 define void @foo() nounwind uwtable noinline {
23 for.cond: ; preds = %for.inc, %entry
24 %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
25 %scevgep = getelementptr [50 x %struct.data]* @out, i64 0, i64 %indvar
26 %a27 = bitcast %struct.data* %scevgep to i16*
27 %scevgep6 = getelementptr [50 x %struct.data]* @in2, i64 0, i64 %indvar
28 %a38 = bitcast %struct.data* %scevgep6 to i16*
29 %b20 = getelementptr [50 x %struct.data]* @out, i64 0, i64 %indvar, i32 1
30 %scevgep9 = getelementptr [50 x %struct.data]* @in1, i64 0, i64 %indvar
31 %a = bitcast %struct.data* %scevgep9 to i16*
32 %b6 = getelementptr [50 x %struct.data]* @in2, i64 0, i64 %indvar, i32 1
33 %b = getelementptr [50 x %struct.data]* @in1, i64 0, i64 %indvar, i32 1
34 %exitcond = icmp ne i64 %indvar, 50
35 br i1 %exitcond, label %for.body, label %for.end
37 for.body: ; preds = %for.cond
38 %tmp2 = load i16* %b, align 2
39 %tmp7 = load i16* %b6, align 2
40 %cmp11 = icmp slt i16 %tmp2, %tmp7
41 br i1 %cmp11, label %if.else, label %if.then
43 if.then: ; preds = %for.body
44 %tmp16 = load i16* %a, align 4
45 store i16 %tmp16, i16* %b20, align 2
46 %add = add i16 %tmp7, 5
47 store i16 %add, i16* %a27, align 4
50 if.else: ; preds = %for.body
51 %sub = add i16 %tmp7, -12
52 store i16 %sub, i16* %b20, align 2
53 %tmp39 = load i16* %a38, align 4
54 %add43 = add i16 %tmp39, %tmp7
55 store i16 %add43, i16* %a27, align 4
58 if.end: ; preds = %if.else, %if.then
61 for.inc: ; preds = %if.end
62 %indvar.next = add i64 %indvar, 1
65 for.end: ; preds = %for.cond
69 define i32 @main() nounwind uwtable {
71 call void @check_vect()
74 for.cond: ; preds = %for.inc, %entry
75 %indvar5 = phi i64 [ %indvar.next6, %for.inc ], [ 0, %entry ]
76 %b18 = getelementptr [50 x %struct.data]* @in2, i64 0, i64 %indvar5, i32 1
77 %tmp8 = add i64 %indvar5, 5
78 %conv14 = trunc i64 %tmp8 to i16
79 %scevgep10 = getelementptr [50 x %struct.data]* @in2, i64 0, i64 %indvar5
80 %a11 = bitcast %struct.data* %scevgep10 to i16*
81 %b = getelementptr [50 x %struct.data]* @in1, i64 0, i64 %indvar5, i32 1
82 %tmp13 = add i64 %indvar5, 2
83 %conv4 = trunc i64 %tmp13 to i16
84 %scevgep15 = getelementptr [50 x %struct.data]* @in1, i64 0, i64 %indvar5
85 %a = bitcast %struct.data* %scevgep15 to i16*
86 %conv = trunc i64 %indvar5 to i16
87 %exitcond = icmp ne i64 %indvar5, 50
88 br i1 %exitcond, label %for.body, label %for.end
90 for.body: ; preds = %for.cond
91 store i16 %conv, i16* %a, align 4
92 store i16 %conv4, i16* %b, align 2
93 store i16 5, i16* %a11, align 4
94 store i16 %conv14, i16* %b18, align 2
95 call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"() nounwind, !srcloc !0
98 for.inc: ; preds = %for.body
99 %indvar.next6 = add i64 %indvar5, 1
102 for.end: ; preds = %for.cond
106 for.cond20: ; preds = %for.inc53, %for.end
107 %indvar = phi i64 [ %indvar.next, %for.inc53 ], [ 0, %for.end ]
108 %tmp = mul i64 %indvar, 2
109 %tmp2 = add i64 %tmp, 1
110 %arrayidx48 = getelementptr [100 x i16]* @result, i64 0, i64 %tmp2
111 %arrayidx33 = getelementptr [100 x i16]* @result, i64 0, i64 %tmp
112 %b41 = getelementptr [50 x %struct.data]* @out, i64 0, i64 %indvar, i32 1
113 %scevgep = getelementptr [50 x %struct.data]* @out, i64 0, i64 %indvar
114 %a28 = bitcast %struct.data* %scevgep to i16*
115 %i.1 = trunc i64 %indvar to i32
116 %cmp22 = icmp slt i32 %i.1, 50
117 br i1 %cmp22, label %for.body24, label %for.end56
119 for.body24: ; preds = %for.cond20
120 %tmp29 = load i16* %a28, align 4
121 %tmp34 = load i16* %arrayidx33, align 4
122 %cmp36 = icmp eq i16 %tmp29, %tmp34
123 br i1 %cmp36, label %lor.lhs.false, label %if.then
125 lor.lhs.false: ; preds = %for.body24
126 %tmp42 = load i16* %b41, align 2
127 %tmp49 = load i16* %arrayidx48, align 2
128 %cmp51 = icmp eq i16 %tmp42, %tmp49
129 br i1 %cmp51, label %if.end, label %if.then
131 if.then: ; preds = %lor.lhs.false, %for.body24
132 call void @abort() noreturn nounwind
135 if.end: ; preds = %lor.lhs.false
138 for.inc53: ; preds = %if.end
139 %indvar.next = add i64 %indvar, 1
142 for.end56: ; preds = %for.cond20
146 define internal void @check_vect() nounwind uwtable noinline {
148 %a = alloca i32, align 4
149 %b = alloca i32, align 4
150 %c = alloca i32, align 4
151 %d = alloca i32, align 4
152 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
153 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
154 %tobool = icmp eq i32 %call1, 0
155 br i1 %tobool, label %if.then, label %lor.lhs.false
157 lor.lhs.false: ; preds = %entry
158 %tmp4 = load i32* %d, align 4
159 %and6 = and i32 %tmp4, 67108864
160 %cmp = icmp eq i32 %and6, 0
161 br i1 %cmp, label %if.then, label %if.end
163 if.then: ; preds = %entry, %lor.lhs.false
164 call void @exit(i32 0) noreturn nounwind
167 if.end: ; preds = %lor.lhs.false
168 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
172 declare void @abort() noreturn
174 declare void (i32)* @signal(i32, void (i32)*) nounwind
176 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
178 call void @exit(i32 0) noreturn nounwind
181 return: ; No predecessors!
185 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
187 %and = and i32 %__level, -2147483648
188 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
189 %cmp = icmp ult i32 %call, %__level
190 br i1 %cmp, label %if.then, label %if.end
192 if.then: ; preds = %entry
195 if.end: ; preds = %entry
196 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !1
197 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
198 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
199 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
200 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
201 store i32 %asmresult, i32* %__eax, align 4
202 store i32 %asmresult8, i32* %__ebx, align 4
203 store i32 %asmresult9, i32* %__ecx, align 4
204 store i32 %asmresult10, i32* %__edx, align 4
207 return: ; preds = %if.end, %if.then
208 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
212 declare void @exit(i32) noreturn
214 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
216 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !2
217 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
218 %tobool = icmp eq i32* %__sig, null
219 br i1 %tobool, label %if.end, label %if.then
221 if.then: ; preds = %entry
222 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
223 store i32 %asmresult1, i32* %__sig, align 4
226 if.end: ; preds = %entry, %if.then
230 !0 = metadata !{i32 1052}
231 !1 = metadata !{i32 -2147342939, i32 -2147342931}
232 !2 = metadata !{i32 -2147343062, i32 -2147343054}