xref: /llvm-project/llvm/test/Transforms/InstSimplify/ConstProp/vecreduce.ll (revision b280ee1dd7e9b36ae7aaa3953556e4b7a7f31a29)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
4declare i32 @llvm.vector.reduce.add.v1i32(<1 x i32> %a)
5declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %a)
6declare i32 @llvm.vector.reduce.mul.v1i32(<1 x i32> %a)
7declare i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> %a)
8declare i32 @llvm.vector.reduce.and.v1i32(<1 x i32> %a)
9declare i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %a)
10declare i32 @llvm.vector.reduce.or.v1i32(<1 x i32> %a)
11declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a)
12declare i32 @llvm.vector.reduce.xor.v1i32(<1 x i32> %a)
13declare i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %a)
14declare i32 @llvm.vector.reduce.smin.v1i32(<1 x i32> %a)
15declare i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> %a)
16declare i32 @llvm.vector.reduce.smax.v1i32(<1 x i32> %a)
17declare i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> %a)
18declare i32 @llvm.vector.reduce.umin.v1i32(<1 x i32> %a)
19declare i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> %a)
20declare i32 @llvm.vector.reduce.umax.v1i32(<1 x i32> %a)
21declare i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> %a)
22
23
24define i32 @add_0() {
25; CHECK-LABEL: @add_0(
26; CHECK-NEXT:    ret i32 0
27;
28  %x = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> zeroinitializer)
29  ret i32 %x
30}
31
32define i32 @add_1() {
33; CHECK-LABEL: @add_1(
34; CHECK-NEXT:    ret i32 8
35;
36  %x = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
37  ret i32 %x
38}
39
40define i32 @add_inc() {
41; CHECK-LABEL: @add_inc(
42; CHECK-NEXT:    ret i32 18
43;
44  %x = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> <i32 1, i32 -3, i32 5, i32 7, i32 2, i32 4, i32 -6, i32 8>)
45  ret i32 %x
46}
47
48define i32 @add_1v() {
49; CHECK-LABEL: @add_1v(
50; CHECK-NEXT:    ret i32 10
51;
52  %x = call i32 @llvm.vector.reduce.add.v1i32(<1 x i32> <i32 10>)
53  ret i32 %x
54}
55
56define i32 @add_undef() {
57; CHECK-LABEL: @add_undef(
58; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> undef)
59; CHECK-NEXT:    ret i32 [[X]]
60;
61  %x = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> undef)
62  ret i32 %x
63}
64
65define i32 @add_undef1() {
66; CHECK-LABEL: @add_undef1(
67; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
68; CHECK-NEXT:    ret i32 [[X]]
69;
70  %x = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
71  ret i32 %x
72}
73
74define i32 @add_poison() {
75; CHECK-LABEL: @add_poison(
76; CHECK-NEXT:    ret i32 poison
77;
78  %x = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> poison)
79  ret i32 %x
80}
81
82define i32 @add_poison1() {
83; CHECK-LABEL: @add_poison1(
84; CHECK-NEXT:    ret i32 poison
85;
86  %x = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> <i32 1, i32 1, i32 poison, i32 1, i32 1, i32 42, i32 1, i32 1>)
87  ret i32 %x
88}
89
90define i32 @add_constexpr() {
91; CHECK-LABEL: @add_constexpr(
92; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> bitcast (<4 x i64> <i64 0, i64 1, i64 2, i64 3> to <8 x i32>))
93; CHECK-NEXT:    ret i32 [[X]]
94;
95  %x = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> bitcast (<4 x i64> <i64 0, i64 1, i64 2, i64 3> to <8 x i32>))
96  ret i32 %x
97}
98
99define i32 @mul_0() {
100; CHECK-LABEL: @mul_0(
101; CHECK-NEXT:    ret i32 0
102;
103  %x = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> zeroinitializer)
104  ret i32 %x
105}
106
107define i32 @mul_1() {
108; CHECK-LABEL: @mul_1(
109; CHECK-NEXT:    ret i32 1
110;
111  %x = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
112  ret i32 %x
113}
114
115define i32 @mul_inc() {
116; CHECK-LABEL: @mul_inc(
117; CHECK-NEXT:    ret i32 40320
118;
119  %x = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> <i32 1, i32 -3, i32 5, i32 7, i32 2, i32 4, i32 -6, i32 8>)
120  ret i32 %x
121}
122
123define i32 @mul_1v() {
124; CHECK-LABEL: @mul_1v(
125; CHECK-NEXT:    ret i32 10
126;
127  %x = call i32 @llvm.vector.reduce.mul.v1i32(<1 x i32> <i32 10>)
128  ret i32 %x
129}
130
131define i32 @mul_undef() {
132; CHECK-LABEL: @mul_undef(
133; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> undef)
134; CHECK-NEXT:    ret i32 [[X]]
135;
136  %x = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> undef)
137  ret i32 %x
138}
139
140define i32 @mul_undef1() {
141; CHECK-LABEL: @mul_undef1(
142; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
143; CHECK-NEXT:    ret i32 [[X]]
144;
145  %x = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
146  ret i32 %x
147}
148
149define i32 @mul_poison() {
150; CHECK-LABEL: @mul_poison(
151; CHECK-NEXT:    ret i32 poison
152;
153  %x = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> poison)
154  ret i32 %x
155}
156
157define i32 @mul_poison1() {
158; CHECK-LABEL: @mul_poison1(
159; CHECK-NEXT:    ret i32 poison
160;
161  %x = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> <i32 0, i32 1, i32 poison, i32 1, i32 1, i32 1, i32 1, i32 1>)
162  ret i32 %x
163}
164
165define i32 @and_0() {
166; CHECK-LABEL: @and_0(
167; CHECK-NEXT:    ret i32 0
168;
169  %x = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> zeroinitializer)
170  ret i32 %x
171}
172
173define i32 @and_1() {
174; CHECK-LABEL: @and_1(
175; CHECK-NEXT:    ret i32 1
176;
177  %x = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
178  ret i32 %x
179}
180
181define i32 @and_inc() {
182; CHECK-LABEL: @and_inc(
183; CHECK-NEXT:    ret i32 0
184;
185  %x = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> <i32 1, i32 -3, i32 5, i32 7, i32 2, i32 4, i32 -6, i32 8>)
186  ret i32 %x
187}
188
189define i32 @and_1v() {
190; CHECK-LABEL: @and_1v(
191; CHECK-NEXT:    ret i32 10
192;
193  %x = call i32 @llvm.vector.reduce.and.v1i32(<1 x i32> <i32 10>)
194  ret i32 %x
195}
196
197define i32 @and_undef() {
198; CHECK-LABEL: @and_undef(
199; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> undef)
200; CHECK-NEXT:    ret i32 [[X]]
201;
202  %x = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> undef)
203  ret i32 %x
204}
205
206define i32 @and_undef1() {
207; CHECK-LABEL: @and_undef1(
208; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
209; CHECK-NEXT:    ret i32 [[X]]
210;
211  %x = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
212  ret i32 %x
213}
214
215define i32 @and_poison() {
216; CHECK-LABEL: @and_poison(
217; CHECK-NEXT:    ret i32 poison
218;
219  %x = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> poison)
220  ret i32 %x
221}
222
223define i32 @and_poison1() {
224; CHECK-LABEL: @and_poison1(
225; CHECK-NEXT:    ret i32 poison
226;
227  %x = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> <i32 -1, i32 1, i32 poison, i32 1, i32 1, i32 1, i32 1, i32 1>)
228  ret i32 %x
229}
230
231define i32 @or_0() {
232; CHECK-LABEL: @or_0(
233; CHECK-NEXT:    ret i32 0
234;
235  %x = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> zeroinitializer)
236  ret i32 %x
237}
238
239define i32 @or_1() {
240; CHECK-LABEL: @or_1(
241; CHECK-NEXT:    ret i32 1
242;
243  %x = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
244  ret i32 %x
245}
246
247define i32 @or_inc() {
248; CHECK-LABEL: @or_inc(
249; CHECK-NEXT:    ret i32 -1
250;
251  %x = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> <i32 1, i32 -3, i32 5, i32 7, i32 2, i32 4, i32 -6, i32 8>)
252  ret i32 %x
253}
254
255define i32 @or_1v() {
256; CHECK-LABEL: @or_1v(
257; CHECK-NEXT:    ret i32 10
258;
259  %x = call i32 @llvm.vector.reduce.or.v1i32(<1 x i32> <i32 10>)
260  ret i32 %x
261}
262
263define i32 @or_undef() {
264; CHECK-LABEL: @or_undef(
265; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> undef)
266; CHECK-NEXT:    ret i32 [[X]]
267;
268  %x = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> undef)
269  ret i32 %x
270}
271
272define i32 @or_undef1() {
273; CHECK-LABEL: @or_undef1(
274; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
275; CHECK-NEXT:    ret i32 [[X]]
276;
277  %x = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
278  ret i32 %x
279}
280
281define i32 @or_poison() {
282; CHECK-LABEL: @or_poison(
283; CHECK-NEXT:    ret i32 poison
284;
285  %x = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> poison)
286  ret i32 %x
287}
288
289define i32 @or_poison1() {
290; CHECK-LABEL: @or_poison1(
291; CHECK-NEXT:    ret i32 poison
292;
293  %x = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> <i32 1, i32 0, i32 poison, i32 1, i32 1, i32 1, i32 1, i32 1>)
294  ret i32 %x
295}
296
297define i32 @xor_0() {
298; CHECK-LABEL: @xor_0(
299; CHECK-NEXT:    ret i32 0
300;
301  %x = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> zeroinitializer)
302  ret i32 %x
303}
304
305define i32 @xor_1() {
306; CHECK-LABEL: @xor_1(
307; CHECK-NEXT:    ret i32 0
308;
309  %x = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
310  ret i32 %x
311}
312
313define i32 @xor_inc() {
314; CHECK-LABEL: @xor_inc(
315; CHECK-NEXT:    ret i32 10
316;
317  %x = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> <i32 1, i32 -3, i32 5, i32 7, i32 2, i32 4, i32 -6, i32 8>)
318  ret i32 %x
319}
320
321define i32 @xor_1v() {
322; CHECK-LABEL: @xor_1v(
323; CHECK-NEXT:    ret i32 10
324;
325  %x = call i32 @llvm.vector.reduce.xor.v1i32(<1 x i32> <i32 10>)
326  ret i32 %x
327}
328
329define i32 @xor_undef() {
330; CHECK-LABEL: @xor_undef(
331; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> undef)
332; CHECK-NEXT:    ret i32 [[X]]
333;
334  %x = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> undef)
335  ret i32 %x
336}
337
338define i32 @xor_undef1() {
339; CHECK-LABEL: @xor_undef1(
340; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
341; CHECK-NEXT:    ret i32 [[X]]
342;
343  %x = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
344  ret i32 %x
345}
346
347define i32 @xor_poison() {
348; CHECK-LABEL: @xor_poison(
349; CHECK-NEXT:    ret i32 poison
350;
351  %x = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> poison)
352  ret i32 %x
353}
354
355define i32 @xor_poison1() {
356; CHECK-LABEL: @xor_poison1(
357; CHECK-NEXT:    ret i32 poison
358;
359  %x = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> <i32 poison, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
360  ret i32 %x
361}
362
363define i32 @smin_0() {
364; CHECK-LABEL: @smin_0(
365; CHECK-NEXT:    ret i32 0
366;
367  %x = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> zeroinitializer)
368  ret i32 %x
369}
370
371define i32 @smin_1() {
372; CHECK-LABEL: @smin_1(
373; CHECK-NEXT:    ret i32 1
374;
375  %x = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
376  ret i32 %x
377}
378
379define i32 @smin_inc() {
380; CHECK-LABEL: @smin_inc(
381; CHECK-NEXT:    ret i32 -6
382;
383  %x = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> <i32 1, i32 -3, i32 5, i32 7, i32 2, i32 4, i32 -6, i32 8>)
384  ret i32 %x
385}
386
387define i32 @smin_1v() {
388; CHECK-LABEL: @smin_1v(
389; CHECK-NEXT:    ret i32 10
390;
391  %x = call i32 @llvm.vector.reduce.smin.v1i32(<1 x i32> <i32 10>)
392  ret i32 %x
393}
394
395define i32 @smin_undef() {
396; CHECK-LABEL: @smin_undef(
397; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> undef)
398; CHECK-NEXT:    ret i32 [[X]]
399;
400  %x = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> undef)
401  ret i32 %x
402}
403
404define i32 @smin_undef1() {
405; CHECK-LABEL: @smin_undef1(
406; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
407; CHECK-NEXT:    ret i32 [[X]]
408;
409  %x = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
410  ret i32 %x
411}
412
413define i32 @smin_poison() {
414; CHECK-LABEL: @smin_poison(
415; CHECK-NEXT:    ret i32 poison
416;
417  %x = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> poison)
418  ret i32 %x
419}
420
421define i32 @smin_poison1() {
422; CHECK-LABEL: @smin_poison1(
423; CHECK-NEXT:    ret i32 poison
424;
425  %x = call i32 @llvm.vector.reduce.smin.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 poison, i32 1, i32 1, i32 1>)
426  ret i32 %x
427}
428
429define i32 @smax_0() {
430; CHECK-LABEL: @smax_0(
431; CHECK-NEXT:    ret i32 0
432;
433  %x = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> zeroinitializer)
434  ret i32 %x
435}
436
437define i32 @smax_1() {
438; CHECK-LABEL: @smax_1(
439; CHECK-NEXT:    ret i32 1
440;
441  %x = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
442  ret i32 %x
443}
444
445define i32 @smax_inc() {
446; CHECK-LABEL: @smax_inc(
447; CHECK-NEXT:    ret i32 8
448;
449  %x = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> <i32 1, i32 -3, i32 5, i32 7, i32 2, i32 4, i32 -6, i32 8>)
450  ret i32 %x
451}
452
453define i32 @smax_1v() {
454; CHECK-LABEL: @smax_1v(
455; CHECK-NEXT:    ret i32 10
456;
457  %x = call i32 @llvm.vector.reduce.smax.v1i32(<1 x i32> <i32 10>)
458  ret i32 %x
459}
460
461define i32 @smax_undef() {
462; CHECK-LABEL: @smax_undef(
463; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> undef)
464; CHECK-NEXT:    ret i32 [[X]]
465;
466  %x = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> undef)
467  ret i32 %x
468}
469
470define i32 @smax_undef1() {
471; CHECK-LABEL: @smax_undef1(
472; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
473; CHECK-NEXT:    ret i32 [[X]]
474;
475  %x = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
476  ret i32 %x
477}
478
479define i32 @smax_poison() {
480; CHECK-LABEL: @smax_poison(
481; CHECK-NEXT:    ret i32 poison
482;
483  %x = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> poison)
484  ret i32 %x
485}
486
487define i32 @smax_poison1() {
488; CHECK-LABEL: @smax_poison1(
489; CHECK-NEXT:    ret i32 poison
490;
491  %x = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> <i32 1, i32 1, i32 0, i32 1, i32 1, i32 1, i32 1, i32 poison>)
492  ret i32 %x
493}
494
495define i32 @umin_0() {
496; CHECK-LABEL: @umin_0(
497; CHECK-NEXT:    ret i32 0
498;
499  %x = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> zeroinitializer)
500  ret i32 %x
501}
502
503define i32 @umin_1() {
504; CHECK-LABEL: @umin_1(
505; CHECK-NEXT:    ret i32 1
506;
507  %x = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
508  ret i32 %x
509}
510
511define i32 @umin_inc() {
512; CHECK-LABEL: @umin_inc(
513; CHECK-NEXT:    ret i32 1
514;
515  %x = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> <i32 1, i32 -3, i32 5, i32 7, i32 2, i32 4, i32 -6, i32 8>)
516  ret i32 %x
517}
518
519define i32 @umin_1v() {
520; CHECK-LABEL: @umin_1v(
521; CHECK-NEXT:    ret i32 10
522;
523  %x = call i32 @llvm.vector.reduce.umin.v1i32(<1 x i32> <i32 10>)
524  ret i32 %x
525}
526
527define i32 @umin_undef() {
528; CHECK-LABEL: @umin_undef(
529; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> undef)
530; CHECK-NEXT:    ret i32 [[X]]
531;
532  %x = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> undef)
533  ret i32 %x
534}
535
536define i32 @umin_undef1() {
537; CHECK-LABEL: @umin_undef1(
538; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
539; CHECK-NEXT:    ret i32 [[X]]
540;
541  %x = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
542  ret i32 %x
543}
544
545define i32 @umin_poison() {
546; CHECK-LABEL: @umin_poison(
547; CHECK-NEXT:    ret i32 poison
548;
549  %x = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> poison)
550  ret i32 %x
551}
552
553define i32 @umin_poison1() {
554; CHECK-LABEL: @umin_poison1(
555; CHECK-NEXT:    ret i32 poison
556;
557  %x = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> <i32 1, i32 1, i32 -1, i32 poison, i32 1, i32 1, i32 1, i32 1>)
558  ret i32 %x
559}
560
561define i32 @umax_0() {
562; CHECK-LABEL: @umax_0(
563; CHECK-NEXT:    ret i32 0
564;
565  %x = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> zeroinitializer)
566  ret i32 %x
567}
568
569define i32 @umax_1() {
570; CHECK-LABEL: @umax_1(
571; CHECK-NEXT:    ret i32 1
572;
573  %x = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)
574  ret i32 %x
575}
576
577define i32 @umax_inc() {
578; CHECK-LABEL: @umax_inc(
579; CHECK-NEXT:    ret i32 -3
580;
581  %x = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> <i32 1, i32 -3, i32 5, i32 7, i32 2, i32 4, i32 -6, i32 8>)
582  ret i32 %x
583}
584
585define i32 @umax_1v() {
586; CHECK-LABEL: @umax_1v(
587; CHECK-NEXT:    ret i32 10
588;
589  %x = call i32 @llvm.vector.reduce.umax.v1i32(<1 x i32> <i32 10>)
590  ret i32 %x
591}
592
593define i32 @umax_undef() {
594; CHECK-LABEL: @umax_undef(
595; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef)
596; CHECK-NEXT:    ret i32 [[X]]
597;
598  %x = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef)
599  ret i32 %x
600}
601
602define i32 @umax_undef1() {
603; CHECK-LABEL: @umax_undef1(
604; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
605; CHECK-NEXT:    ret i32 [[X]]
606;
607  %x = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> <i32 1, i32 1, i32 undef, i32 1, i32 1, i32 1, i32 1, i32 1>)
608  ret i32 %x
609}
610
611define i32 @umax_poison() {
612; CHECK-LABEL: @umax_poison(
613; CHECK-NEXT:    ret i32 poison
614;
615  %x = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> poison)
616  ret i32 %x
617}
618
619define i32 @umax_poison1() {
620; CHECK-LABEL: @umax_poison1(
621; CHECK-NEXT:    ret i32 poison
622;
623  %x = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> <i32 1, i32 1, i32 poison, i32 1, i32 1, i32 poison, i32 1, i32 1>)
624  ret i32 %x
625}
626