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 slp-multitypes-2.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer slp-multitypes-2.s > slp-multitypes-2.ll
6 ; ModuleID = 'slp-multitypes-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 define i32 @main1(i16 zeroext %a0, i16 zeroext %a1, i16 zeroext %a2, i16 zeroext %a3, i16 zeroext %a4, i16 zeroext %a5, i16 zeroext %a6, i16 zeroext %a7, i16 zeroext %a8, i16 zeroext %a9, i16 zeroext %a10, i16 zeroext %a11, i16 zeroext %a12, i16 zeroext %a13, i16 zeroext %a14, i16 zeroext %a15, i8 zeroext %b0, i8 zeroext %b1) nounwind uwtable noinline {
12 %out = alloca [2048 x i16], align 16
13 %out2 = alloca [2048 x i8], align 16
16 for.cond: ; preds = %for.inc, %entry
17 %indvar52 = phi i64 [ %indvar.next53, %for.inc ], [ 0, %entry ]
18 %tmp54 = mul i64 %indvar52, 2
19 %tmp55 = add i64 %tmp54, 1
20 %arrayidx102 = getelementptr [2048 x i8]* %out2, i64 0, i64 %tmp55
21 %arrayidx96 = getelementptr [2048 x i8]* %out2, i64 0, i64 %tmp54
22 %tmp56 = mul i64 %indvar52, 16
23 %tmp57 = add i64 %tmp56, 15
24 %arrayidx91 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp57
25 %tmp58 = add i64 %tmp56, 14
26 %arrayidx85 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp58
27 %tmp59 = add i64 %tmp56, 13
28 %arrayidx79 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp59
29 %tmp60 = add i64 %tmp56, 12
30 %arrayidx73 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp60
31 %tmp61 = add i64 %tmp56, 11
32 %arrayidx67 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp61
33 %tmp62 = add i64 %tmp56, 10
34 %arrayidx61 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp62
35 %tmp63 = add i64 %tmp56, 9
36 %arrayidx55 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp63
37 %tmp64 = add i64 %tmp56, 8
38 %arrayidx49 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp64
39 %tmp65 = add i64 %tmp56, 7
40 %arrayidx43 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp65
41 %tmp66 = add i64 %tmp56, 6
42 %arrayidx37 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp66
43 %tmp67 = add i64 %tmp56, 5
44 %arrayidx31 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp67
45 %tmp68 = add i64 %tmp56, 4
46 %arrayidx25 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp68
47 %tmp69 = add i64 %tmp56, 3
48 %arrayidx19 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp69
49 %tmp70 = add i64 %tmp56, 2
50 %arrayidx13 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp70
51 %tmp71 = add i64 %tmp56, 1
52 %arrayidx7 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp71
53 %arrayidx = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp56
54 %exitcond = icmp ne i64 %indvar52, 128
55 br i1 %exitcond, label %for.body, label %for.end
57 for.body: ; preds = %for.cond
58 store i16 %a8, i16* %arrayidx, align 16
59 store i16 %a7, i16* %arrayidx7, align 2
60 store i16 %a1, i16* %arrayidx13, align 4
61 store i16 %a2, i16* %arrayidx19, align 2
62 store i16 %a8, i16* %arrayidx25, align 8
63 store i16 %a5, i16* %arrayidx31, align 2
64 store i16 %a5, i16* %arrayidx37, align 4
65 store i16 %a4, i16* %arrayidx43, align 2
66 store i16 %a12, i16* %arrayidx49, align 16
67 store i16 %a13, i16* %arrayidx55, align 2
68 store i16 %a14, i16* %arrayidx61, align 4
69 store i16 %a15, i16* %arrayidx67, align 2
70 store i16 %a6, i16* %arrayidx73, align 8
71 store i16 %a9, i16* %arrayidx79, align 2
72 store i16 %a0, i16* %arrayidx85, align 4
73 store i16 %a7, i16* %arrayidx91, align 2
74 store i8 %b1, i8* %arrayidx96, align 2
75 store i8 %b0, i8* %arrayidx102, align 1
78 for.inc: ; preds = %for.body
79 %indvar.next53 = add i64 %indvar52, 1
82 for.end: ; preds = %for.cond
85 for.cond104: ; preds = %for.inc319, %for.end
86 %indvar = phi i64 [ %indvar.next, %for.inc319 ], [ 0, %for.end ]
87 %tmp = mul i64 %indvar, 2
88 %tmp34 = add i64 %tmp, 1
89 %arrayidx312 = getelementptr [2048 x i8]* %out2, i64 0, i64 %tmp34
90 %arrayidx300 = getelementptr [2048 x i8]* %out2, i64 0, i64 %tmp
91 %tmp35 = mul i64 %indvar, 16
92 %tmp36 = add i64 %tmp35, 15
93 %arrayidx289 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp36
94 %tmp37 = add i64 %tmp35, 14
95 %arrayidx277 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp37
96 %tmp38 = add i64 %tmp35, 13
97 %arrayidx265 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp38
98 %tmp39 = add i64 %tmp35, 12
99 %arrayidx253 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp39
100 %tmp40 = add i64 %tmp35, 11
101 %arrayidx241 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp40
102 %tmp41 = add i64 %tmp35, 10
103 %arrayidx229 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp41
104 %tmp42 = add i64 %tmp35, 9
105 %arrayidx217 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp42
106 %tmp43 = add i64 %tmp35, 8
107 %arrayidx205 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp43
108 %tmp44 = add i64 %tmp35, 7
109 %arrayidx193 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp44
110 %tmp45 = add i64 %tmp35, 6
111 %arrayidx181 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp45
112 %tmp46 = add i64 %tmp35, 5
113 %arrayidx169 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp46
114 %tmp47 = add i64 %tmp35, 4
115 %arrayidx157 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp47
116 %tmp48 = add i64 %tmp35, 3
117 %arrayidx145 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp48
118 %tmp49 = add i64 %tmp35, 2
119 %arrayidx133 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp49
120 %tmp50 = add i64 %tmp35, 1
121 %arrayidx121 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp50
122 %arrayidx111 = getelementptr [2048 x i16]* %out, i64 0, i64 %tmp35
123 %i.1 = trunc i64 %indvar to i32
124 %cmp106 = icmp slt i32 %i.1, 128
125 br i1 %cmp106, label %for.body107, label %for.end322
127 for.body107: ; preds = %for.cond104
128 %tmp112 = load i16* %arrayidx111, align 16
129 %cmp115 = icmp eq i16 %tmp112, %a8
130 br i1 %cmp115, label %lor.lhs.false, label %if.then
132 lor.lhs.false: ; preds = %for.body107
133 %tmp122 = load i16* %arrayidx121, align 2
134 %cmp126 = icmp eq i16 %tmp122, %a7
135 br i1 %cmp126, label %lor.lhs.false128, label %if.then
137 lor.lhs.false128: ; preds = %lor.lhs.false
138 %tmp134 = load i16* %arrayidx133, align 4
139 %cmp138 = icmp eq i16 %tmp134, %a1
140 br i1 %cmp138, label %lor.lhs.false140, label %if.then
142 lor.lhs.false140: ; preds = %lor.lhs.false128
143 %tmp146 = load i16* %arrayidx145, align 2
144 %cmp150 = icmp eq i16 %tmp146, %a2
145 br i1 %cmp150, label %lor.lhs.false152, label %if.then
147 lor.lhs.false152: ; preds = %lor.lhs.false140
148 %tmp158 = load i16* %arrayidx157, align 8
149 %cmp162 = icmp eq i16 %tmp158, %a8
150 br i1 %cmp162, label %lor.lhs.false164, label %if.then
152 lor.lhs.false164: ; preds = %lor.lhs.false152
153 %tmp170 = load i16* %arrayidx169, align 2
154 %cmp174 = icmp eq i16 %tmp170, %a5
155 br i1 %cmp174, label %lor.lhs.false176, label %if.then
157 lor.lhs.false176: ; preds = %lor.lhs.false164
158 %tmp182 = load i16* %arrayidx181, align 4
159 %cmp186 = icmp eq i16 %tmp182, %a5
160 br i1 %cmp186, label %lor.lhs.false188, label %if.then
162 lor.lhs.false188: ; preds = %lor.lhs.false176
163 %tmp194 = load i16* %arrayidx193, align 2
164 %cmp198 = icmp eq i16 %tmp194, %a4
165 br i1 %cmp198, label %lor.lhs.false200, label %if.then
167 lor.lhs.false200: ; preds = %lor.lhs.false188
168 %tmp206 = load i16* %arrayidx205, align 16
169 %cmp210 = icmp eq i16 %tmp206, %a12
170 br i1 %cmp210, label %lor.lhs.false212, label %if.then
172 lor.lhs.false212: ; preds = %lor.lhs.false200
173 %tmp218 = load i16* %arrayidx217, align 2
174 %cmp222 = icmp eq i16 %tmp218, %a13
175 br i1 %cmp222, label %lor.lhs.false224, label %if.then
177 lor.lhs.false224: ; preds = %lor.lhs.false212
178 %tmp230 = load i16* %arrayidx229, align 4
179 %cmp234 = icmp eq i16 %tmp230, %a14
180 br i1 %cmp234, label %lor.lhs.false236, label %if.then
182 lor.lhs.false236: ; preds = %lor.lhs.false224
183 %tmp242 = load i16* %arrayidx241, align 2
184 %cmp246 = icmp eq i16 %tmp242, %a15
185 br i1 %cmp246, label %lor.lhs.false248, label %if.then
187 lor.lhs.false248: ; preds = %lor.lhs.false236
188 %tmp254 = load i16* %arrayidx253, align 8
189 %cmp258 = icmp eq i16 %tmp254, %a6
190 br i1 %cmp258, label %lor.lhs.false260, label %if.then
192 lor.lhs.false260: ; preds = %lor.lhs.false248
193 %tmp266 = load i16* %arrayidx265, align 2
194 %cmp270 = icmp eq i16 %tmp266, %a9
195 br i1 %cmp270, label %lor.lhs.false272, label %if.then
197 lor.lhs.false272: ; preds = %lor.lhs.false260
198 %tmp278 = load i16* %arrayidx277, align 4
199 %cmp282 = icmp eq i16 %tmp278, %a0
200 br i1 %cmp282, label %lor.lhs.false284, label %if.then
202 lor.lhs.false284: ; preds = %lor.lhs.false272
203 %tmp290 = load i16* %arrayidx289, align 2
204 %cmp294 = icmp eq i16 %tmp290, %a7
205 br i1 %cmp294, label %lor.lhs.false296, label %if.then
207 lor.lhs.false296: ; preds = %lor.lhs.false284
208 %tmp301 = load i8* %arrayidx300, align 2
209 %cmp305 = icmp eq i8 %tmp301, %b1
210 br i1 %cmp305, label %lor.lhs.false307, label %if.then
212 lor.lhs.false307: ; preds = %lor.lhs.false296
213 %tmp313 = load i8* %arrayidx312, align 1
214 %cmp317 = icmp eq i8 %tmp313, %b0
215 br i1 %cmp317, label %if.end, label %if.then
217 if.then: ; preds = %lor.lhs.false307, %lor.lhs.false296, %lor.lhs.false284, %lor.lhs.false272, %lor.lhs.false260, %lor.lhs.false248, %lor.lhs.false236, %lor.lhs.false224, %lor.lhs.false212, %lor.lhs.false200, %lor.lhs.false188, %lor.lhs.false176, %lor.lhs.false164, %lor.lhs.false152, %lor.lhs.false140, %lor.lhs.false128, %lor.lhs.false, %for.body107
218 call void @abort() noreturn nounwind
221 if.end: ; preds = %lor.lhs.false307
224 for.inc319: ; preds = %if.end
225 %indvar.next = add i64 %indvar, 1
226 br label %for.cond104
228 for.end322: ; preds = %for.cond104
232 declare void @abort() noreturn
234 define i32 @main() nounwind uwtable {
236 call void @check_vect()
237 %call = call i32 @main1(i16 zeroext 15, i16 zeroext 14, i16 zeroext 13, i16 zeroext 12, i16 zeroext 11, i16 zeroext 10, i16 zeroext 9, i16 zeroext 8, i16 zeroext 7, i16 zeroext 6, i16 zeroext 5, i16 zeroext 4, i16 zeroext 3, i16 zeroext 2, i16 zeroext 1, i16 zeroext 0, i8 zeroext 20, i8 zeroext 21)
241 define internal void @check_vect() nounwind uwtable noinline {
243 %a = alloca i32, align 4
244 %b = alloca i32, align 4
245 %c = alloca i32, align 4
246 %d = alloca i32, align 4
247 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
248 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
249 %tobool = icmp eq i32 %call1, 0
250 br i1 %tobool, label %if.then, label %lor.lhs.false
252 lor.lhs.false: ; preds = %entry
253 %tmp4 = load i32* %d, align 4
254 %and6 = and i32 %tmp4, 67108864
255 %cmp = icmp eq i32 %and6, 0
256 br i1 %cmp, label %if.then, label %if.end
258 if.then: ; preds = %entry, %lor.lhs.false
259 call void @exit(i32 0) noreturn nounwind
262 if.end: ; preds = %lor.lhs.false
263 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
267 declare void (i32)* @signal(i32, void (i32)*) nounwind
269 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
271 call void @exit(i32 0) noreturn nounwind
274 return: ; No predecessors!
278 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
280 %and = and i32 %__level, -2147483648
281 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
282 %cmp = icmp ult i32 %call, %__level
283 br i1 %cmp, label %if.then, label %if.end
285 if.then: ; preds = %entry
288 if.end: ; preds = %entry
289 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
290 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
291 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
292 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
293 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
294 store i32 %asmresult, i32* %__eax, align 4
295 store i32 %asmresult8, i32* %__ebx, align 4
296 store i32 %asmresult9, i32* %__ecx, align 4
297 store i32 %asmresult10, i32* %__edx, align 4
300 return: ; preds = %if.end, %if.then
301 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
305 declare void @exit(i32) noreturn
307 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
309 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
310 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
311 %tobool = icmp eq i32* %__sig, null
312 br i1 %tobool, label %if.end, label %if.then
314 if.then: ; preds = %entry
315 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
316 store i32 %asmresult1, i32* %__sig, align 4
319 if.end: ; preds = %entry, %if.then
323 !0 = metadata !{i32 -2147342122, i32 -2147342114}
324 !1 = metadata !{i32 -2147342245, i32 -2147342237}