Skip to content

Commit 2141907

Browse files
authored
InstSimplify: increase shufflevector test coverage (#92407)
Add examples of patterns that can be simplified, but are currently not. This patch serves as a pre-commit test.
1 parent 8e8d259 commit 2141907

File tree

1 file changed

+230
-6
lines changed

1 file changed

+230
-6
lines changed

llvm/test/Transforms/InstSimplify/shufflevector.ll

Lines changed: 230 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -249,13 +249,13 @@ define <8 x i64> @PR30630(<8 x i64> %x) {
249249
; ret <2 x float> zeroinitializer
250250
define <2 x float> @PR32872(<2 x float> %x) {
251251
; CHECK-LABEL: @PR32872(
252-
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x float> [[X:%.*]], <2 x float> zeroinitializer, <4 x i32> <i32 2, i32 2, i32 0, i32 1>
253-
; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <4 x float> zeroinitializer, <4 x float> [[TMP1]], <2 x i32> <i32 4, i32 5>
254-
; CHECK-NEXT: ret <2 x float> [[TMP4]]
252+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <2 x float> [[X:%.*]], <2 x float> zeroinitializer, <4 x i32> <i32 2, i32 2, i32 0, i32 1>
253+
; CHECK-NEXT: [[SHUF2:%.*]] = shufflevector <4 x float> zeroinitializer, <4 x float> [[SHUF]], <2 x i32> <i32 4, i32 5>
254+
; CHECK-NEXT: ret <2 x float> [[SHUF2]]
255255
;
256-
%tmp1 = shufflevector <2 x float> %x, <2 x float> zeroinitializer, <4 x i32> <i32 2, i32 2, i32 0, i32 1>
257-
%tmp4 = shufflevector <4 x float> zeroinitializer, <4 x float> %tmp1, <2 x i32> <i32 4, i32 5>
258-
ret <2 x float> %tmp4
256+
%shuf = shufflevector <2 x float> %x, <2 x float> zeroinitializer, <4 x i32> <i32 2, i32 2, i32 0, i32 1>
257+
%shuf2 = shufflevector <4 x float> zeroinitializer, <4 x float> %shuf, <2 x i32> <i32 4, i32 5>
258+
ret <2 x float> %shuf2
259259
}
260260

261261
define <5 x i8> @splat_inserted_constant(<4 x i8> %x) {
@@ -284,3 +284,227 @@ define <2 x i8> @splat_inserted_constant_not_canonical(<3 x i8> %x, <3 x i8> %y)
284284
%splat2 = shufflevector <3 x i8> %y, <3 x i8> %ins2, <2 x i32> <i32 undef, i32 5>
285285
ret <2 x i8> %splat2
286286
}
287+
288+
define <4 x i32> @fold_identity(<4 x i32> %x) {
289+
; CHECK-LABEL: @fold_identity(
290+
; CHECK-NEXT: ret <4 x i32> [[X:%.*]]
291+
;
292+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
293+
%revshuf = shufflevector <4 x i32> %shuf, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
294+
ret <4 x i32> %revshuf
295+
}
296+
297+
define <4 x i32> @fold_identity2(<4 x i32> %x) {
298+
; CHECK-LABEL: @fold_identity2(
299+
; CHECK-NEXT: [[SHL:%.*]] = shl <4 x i32> [[X:%.*]], <i32 1, i32 1, i32 1, i32 1>
300+
; CHECK-NEXT: ret <4 x i32> [[SHL]]
301+
;
302+
%shl = shl <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>
303+
%shuf = shufflevector <4 x i32> %shl, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
304+
%revshuf = shufflevector <4 x i32> %shuf, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
305+
ret <4 x i32> %revshuf
306+
}
307+
308+
define <4 x i32> @fold_identity3(<4 x i32> %x) {
309+
; CHECK-LABEL: @fold_identity3(
310+
; CHECK-NEXT: [[SHL:%.*]] = shl <4 x i32> [[X:%.*]], [[X]]
311+
; CHECK-NEXT: ret <4 x i32> [[SHL]]
312+
;
313+
%shl = shl <4 x i32> %x, %x
314+
%shuf = shufflevector <4 x i32> %shl, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
315+
%revshuf = shufflevector <4 x i32> %shuf, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
316+
ret <4 x i32> %revshuf
317+
}
318+
319+
define <4 x i32> @not_fold_identity(<4 x i32> %x) {
320+
; CHECK-LABEL: @not_fold_identity(
321+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
322+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[SHUF]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
323+
; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
324+
;
325+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
326+
%revshuf = shufflevector <4 x i32> %shuf, <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
327+
ret <4 x i32> %revshuf
328+
}
329+
330+
define <4 x i32> @not_fold_identity2(<4 x i32> %x) {
331+
; CHECK-LABEL: @not_fold_identity2(
332+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
333+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[SHUF]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
334+
; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
335+
;
336+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
337+
%revshuf = shufflevector <4 x i32> %shuf, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
338+
ret <4 x i32> %revshuf
339+
}
340+
341+
define <4 x i64> @fold_lookthrough_cast(<4 x i32> %x) {
342+
; CHECK-LABEL: @fold_lookthrough_cast(
343+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
344+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
345+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ZEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
346+
; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
347+
;
348+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
349+
%zext = zext <4 x i32> %shuf to <4 x i64>
350+
%revshuf = shufflevector <4 x i64> %zext, <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
351+
ret <4 x i64> %revshuf
352+
}
353+
354+
define <4 x i64> @not_fold_lookthrough_cast(<4 x i32> %x) {
355+
; CHECK-LABEL: @not_fold_lookthrough_cast(
356+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[X:%.*]] to <4 x i64>
357+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ZEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
358+
; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
359+
;
360+
%zext = zext <4 x i32> %x to <4 x i64>
361+
%revshuf = shufflevector <4 x i64> %zext, <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
362+
ret <4 x i64> %revshuf
363+
}
364+
365+
define <4 x i64> @not_fold_lookthrough_cast2(<4 x i32> %x) {
366+
; CHECK-LABEL: @not_fold_lookthrough_cast2(
367+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
368+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
369+
; CHECK-NEXT: ret <4 x i64> [[ZEXT]]
370+
;
371+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
372+
%zext = zext <4 x i32> %shuf to <4 x i64>
373+
ret <4 x i64> %zext
374+
}
375+
376+
define i32 @not_fold_lookthrough_bitcast(<4 x i8> %x) {
377+
; CHECK-LABEL: @not_fold_lookthrough_bitcast(
378+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
379+
; CHECK-NEXT: [[BITCAST:%.*]] = bitcast <4 x i8> [[SHUF]] to i32
380+
; CHECK-NEXT: ret i32 [[BITCAST]]
381+
;
382+
%shuf = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
383+
%bitcast = bitcast <4 x i8> %shuf to i32
384+
ret i32 %bitcast
385+
}
386+
387+
define <8 x i16> @not_fold_lookthrough_bitcast2(<4 x i32> %x, <8 x i16> %y) {
388+
; CHECK-LABEL: @not_fold_lookthrough_bitcast2(
389+
; CHECK-NEXT: [[CAST:%.*]] = bitcast <4 x i32> [[X:%.*]] to <8 x i16>
390+
; CHECK-NEXT: [[OUT:%.*]] = shufflevector <8 x i16> [[Y:%.*]], <8 x i16> [[CAST]], <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
391+
; CHECK-NEXT: ret <8 x i16> [[OUT]]
392+
;
393+
%cast = bitcast <4 x i32> %x to <8 x i16>
394+
%out = shufflevector <8 x i16> %y, <8 x i16> %cast, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
395+
ret <8 x i16> %out
396+
}
397+
398+
define <4 x i32> @fold_lookthrough_binop_same_operands(<4 x i32> %x) {
399+
; CHECK-LABEL: @fold_lookthrough_binop_same_operands(
400+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
401+
; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
402+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
403+
; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
404+
;
405+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
406+
%add = add <4 x i32> %shuf, %shuf
407+
%revshuf = shufflevector <4 x i32> %add, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
408+
ret <4 x i32> %revshuf
409+
}
410+
411+
define <4 x i32> @fold_lookthrough_binop_different_operands(<4 x i32> %x, <4 x i32> %y) {
412+
; CHECK-LABEL: @fold_lookthrough_binop_different_operands(
413+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
414+
; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[Y:%.*]]
415+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
416+
; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
417+
;
418+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
419+
%add = add <4 x i32> %shuf, %y
420+
%revshuf = shufflevector <4 x i32> %add, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
421+
ret <4 x i32> %revshuf
422+
}
423+
424+
define <4 x i32> @fold_lookthrough_binop_multiuse(<4 x i32> %x) {
425+
; CHECK-LABEL: @fold_lookthrough_binop_multiuse(
426+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
427+
; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
428+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
429+
; CHECK-NEXT: [[ADD2:%.*]] = add <4 x i32> [[SHUF]], [[REVSHUF]]
430+
; CHECK-NEXT: ret <4 x i32> [[ADD2]]
431+
;
432+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
433+
%add = add <4 x i32> %shuf, %shuf
434+
%revshuf = shufflevector <4 x i32> %add, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
435+
%add2 = add <4 x i32> %shuf, %revshuf
436+
ret <4 x i32> %add2
437+
}
438+
439+
define <4 x i64> @fold_lookthrough_cast_chain(<4 x i16> %x) {
440+
; CHECK-LABEL: @fold_lookthrough_cast_chain(
441+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i16> [[X:%.*]], <4 x i16> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
442+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i16> [[SHUF]] to <4 x i32>
443+
; CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i32> [[ZEXT]] to <4 x i64>
444+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[SEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
445+
; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
446+
;
447+
%shuf = shufflevector <4 x i16> %x, <4 x i16> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
448+
%zext = zext <4 x i16> %shuf to <4 x i32>
449+
%sext = sext <4 x i32> %zext to <4 x i64>
450+
%revshuf = shufflevector <4 x i64> %sext, <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
451+
ret <4 x i64> %revshuf
452+
}
453+
454+
define <4 x i32> @fold_lookthrough_binop_chain(<4 x i32> %x) {
455+
; CHECK-LABEL: @fold_lookthrough_binop_chain(
456+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
457+
; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
458+
; CHECK-NEXT: [[ADD2:%.*]] = add <4 x i32> [[ADD]], [[ADD]]
459+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD2]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
460+
; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
461+
;
462+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
463+
%add = add <4 x i32> %shuf, %shuf
464+
%add2 = add <4 x i32> %add, %add
465+
%revshuf = shufflevector <4 x i32> %add2, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
466+
ret <4 x i32> %revshuf
467+
}
468+
469+
define <4 x i64> @fold_lookthrough_cast_binop_chain(<4 x i32> %x) {
470+
; CHECK-LABEL: @fold_lookthrough_cast_binop_chain(
471+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
472+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
473+
; CHECK-NEXT: [[ADD:%.*]] = add <4 x i64> [[ZEXT]], [[ZEXT]]
474+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ADD]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
475+
; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
476+
;
477+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
478+
%zext = zext <4 x i32> %shuf to <4 x i64>
479+
%add = add <4 x i64> %zext, %zext
480+
%revshuf = shufflevector <4 x i64> %add, <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
481+
ret <4 x i64> %revshuf
482+
}
483+
484+
define <4 x i64> @not_fold_cast_mismatched_types(<4 x i32> %x) {
485+
; CHECK-LABEL: @not_fold_cast_mismatched_types(
486+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
487+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <2 x i32> [[SHUF]] to <2 x i64>
488+
; CHECK-NEXT: [[EXTSHUF:%.*]] = shufflevector <2 x i64> [[ZEXT]], <2 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
489+
; CHECK-NEXT: ret <4 x i64> [[EXTSHUF]]
490+
;
491+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <2 x i32> <i32 0, i32 2>
492+
%zext = zext <2 x i32> %shuf to <2 x i64>
493+
%extshuf = shufflevector <2 x i64> %zext, <2 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
494+
ret <4 x i64> %extshuf
495+
}
496+
497+
define <4 x float> @not_fold_binop_mismatched_types(<4 x float> %x, <4 x float> %y) {
498+
; CHECK-LABEL: @not_fold_binop_mismatched_types(
499+
; CHECK-NEXT: [[SHUF_X:%.*]] = shufflevector <4 x float> [[X:%.*]], <4 x float> poison, <2 x i32> <i32 0, i32 2>
500+
; CHECK-NEXT: [[SHUF_Y:%.*]] = shufflevector <4 x float> [[Y:%.*]], <4 x float> poison, <2 x i32> <i32 1, i32 3>
501+
; CHECK-NEXT: [[FADD:%.*]] = fadd fast <2 x float> [[SHUF_X]], [[SHUF_Y]]
502+
; CHECK-NEXT: [[EXTSHUF:%.*]] = shufflevector <2 x float> [[FADD]], <2 x float> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
503+
; CHECK-NEXT: ret <4 x float> [[EXTSHUF]]
504+
;
505+
%shuf.x = shufflevector <4 x float> %x, <4 x float> poison, <2 x i32> <i32 0, i32 2>
506+
%shuf.y = shufflevector <4 x float> %y, <4 x float> poison, <2 x i32> <i32 1, i32 3>
507+
%fadd = fadd fast <2 x float> %shuf.x, %shuf.y
508+
%extshuf = shufflevector <2 x float> %fadd, <2 x float> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
509+
ret <4 x float> %extshuf
510+
}

0 commit comments

Comments
 (0)