Skip to content

Commit c1b4d7f

Browse files
committed
[InstCombine] Add shuffle-binop tests
These tests are a precommit for https://reviews.llvm.org/D135876
1 parent f79f64b commit c1b4d7f

File tree

1 file changed

+157
-0
lines changed

1 file changed

+157
-0
lines changed
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -passes='instcombine' -S %s | FileCheck %s
3+
4+
define <4 x i8> @splat_binop_non_splat_x(<4 x i8> %x, <4 x i8> %y) {
5+
; CHECK-LABEL: @splat_binop_non_splat_x(
6+
; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>
7+
; CHECK-NEXT: call void @use(<4 x i8> [[XSPLAT]])
8+
; CHECK-NEXT: [[B:%.*]] = add <4 x i8> [[XSPLAT]], [[Y:%.*]]
9+
; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i8> [[B]], <4 x i8> poison, <4 x i32> zeroinitializer
10+
; CHECK-NEXT: ret <4 x i8> [[BSPLAT]]
11+
;
12+
%xsplat = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
13+
call void @use(<4 x i8> %xsplat)
14+
%b = add <4 x i8> %xsplat, %y
15+
%bsplat = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer
16+
ret <4 x i8> %bsplat
17+
}
18+
19+
define <4 x i8> @non_splat_binop_splat_x(<4 x i8> %x, <4 x i8> %y) {
20+
; CHECK-LABEL: @non_splat_binop_splat_x(
21+
; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
22+
; CHECK-NEXT: call void @use(<4 x i8> [[XSPLAT]])
23+
; CHECK-NEXT: [[B:%.*]] = sub <4 x i8> [[XSPLAT]], [[Y:%.*]]
24+
; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i8> [[B]], <4 x i8> poison, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>
25+
; CHECK-NEXT: ret <4 x i8> [[BSPLAT]]
26+
;
27+
%xsplat = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> zeroinitializer
28+
call void @use(<4 x i8> %xsplat)
29+
%b = sub <4 x i8> %xsplat, %y
30+
%bsplat = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
31+
ret <4 x i8> %bsplat
32+
}
33+
34+
define <4 x i32> @splat_binop_splat_changes_x_length(<8 x i32> %x, <4 x i32> %y) {
35+
; CHECK-LABEL: @splat_binop_splat_changes_x_length(
36+
; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <8 x i32> [[X:%.*]], <8 x i32> poison, <4 x i32> zeroinitializer
37+
; CHECK-NEXT: call void @use(<4 x i32> [[XSPLAT]])
38+
; CHECK-NEXT: [[B:%.*]] = mul <4 x i32> [[XSPLAT]], [[Y:%.*]]
39+
; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> poison, <4 x i32> zeroinitializer
40+
; CHECK-NEXT: ret <4 x i32> [[BSPLAT]]
41+
;
42+
%xsplat = shufflevector <8 x i32> %x, <8 x i32> poison, <4 x i32> zeroinitializer
43+
call void @use(<4 x i32> %xsplat)
44+
%b = mul <4 x i32> %xsplat, %y
45+
%bsplat = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> zeroinitializer
46+
ret <4 x i32> %bsplat
47+
}
48+
49+
define <4 x i8> @splat_binop_splat_x(<4 x i8> %x, <4 x i8> %y) {
50+
; CHECK-LABEL: @splat_binop_splat_x(
51+
; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
52+
; CHECK-NEXT: call void @use(<4 x i8> [[XSPLAT]])
53+
; CHECK-NEXT: [[B:%.*]] = add <4 x i8> [[XSPLAT]], [[Y:%.*]]
54+
; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i8> [[B]], <4 x i8> poison, <4 x i32> zeroinitializer
55+
; CHECK-NEXT: ret <4 x i8> [[BSPLAT]]
56+
;
57+
%xsplat = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> zeroinitializer
58+
call void @use(<4 x i8> %xsplat)
59+
%b = add <4 x i8> %xsplat, %y
60+
%bsplat = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer
61+
ret <4 x i8> %bsplat
62+
}
63+
64+
define <4 x i8> @splat_binop_splat_y(<4 x i8> %x, <4 x i8> %y) {
65+
; CHECK-LABEL: @splat_binop_splat_y(
66+
; CHECK-NEXT: [[YSPLAT:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
67+
; CHECK-NEXT: call void @use(<4 x i8> [[YSPLAT]])
68+
; CHECK-NEXT: [[B:%.*]] = sub <4 x i8> [[X:%.*]], [[YSPLAT]]
69+
; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i8> [[B]], <4 x i8> poison, <4 x i32> zeroinitializer
70+
; CHECK-NEXT: ret <4 x i8> [[BSPLAT]]
71+
;
72+
%ysplat = shufflevector <4 x i8> %y, <4 x i8> poison, <4 x i32> zeroinitializer
73+
call void @use(<4 x i8> %ysplat)
74+
%b = sub <4 x i8> %x, %ysplat
75+
%bsplat = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer
76+
ret <4 x i8> %bsplat
77+
}
78+
79+
define <4 x i8> @splat_binop_splat_x_splat_y(<4 x i8> %x, <4 x i8> %y) {
80+
; CHECK-LABEL: @splat_binop_splat_x_splat_y(
81+
; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
82+
; CHECK-NEXT: call void @use(<4 x i8> [[XSPLAT]])
83+
; CHECK-NEXT: [[YSPLAT:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> poison, <4 x i32> zeroinitializer
84+
; CHECK-NEXT: call void @use(<4 x i8> [[YSPLAT]])
85+
; CHECK-NEXT: [[B:%.*]] = mul <4 x i8> [[XSPLAT]], [[YSPLAT]]
86+
; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <4 x i8> [[B]], <4 x i8> poison, <4 x i32> zeroinitializer
87+
; CHECK-NEXT: ret <4 x i8> [[BSPLAT]]
88+
;
89+
%xsplat = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> zeroinitializer
90+
call void @use(<4 x i8> %xsplat)
91+
%ysplat = shufflevector <4 x i8> %y, <4 x i8> poison, <4 x i32> zeroinitializer
92+
call void @use(<4 x i8> %ysplat)
93+
%b = mul <4 x i8> %xsplat, %ysplat
94+
%bsplat = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer
95+
ret <4 x i8> %bsplat
96+
}
97+
98+
define <vscale x 4 x i32> @vscale_splat_binop_splat_x(<vscale x 4 x i32> %x, <vscale x 4 x i32> %y) {
99+
; CHECK-LABEL: @vscale_splat_binop_splat_x(
100+
; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[X:%.*]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
101+
; CHECK-NEXT: [[B:%.*]] = udiv <vscale x 4 x i32> [[XSPLAT]], [[Y:%.*]]
102+
; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[B]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
103+
; CHECK-NEXT: ret <vscale x 4 x i32> [[BSPLAT]]
104+
;
105+
%xsplat = shufflevector <vscale x 4 x i32> %x, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
106+
%b = udiv <vscale x 4 x i32> %xsplat, %y
107+
%bsplat = shufflevector <vscale x 4 x i32> %b, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
108+
ret <vscale x 4 x i32> %bsplat
109+
}
110+
111+
define <vscale x 4 x i32> @vscale_splat_binop_splat_y(<vscale x 4 x i32> %x, <vscale x 4 x i32> %y) {
112+
; CHECK-LABEL: @vscale_splat_binop_splat_y(
113+
; CHECK-NEXT: [[YSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[Y:%.*]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
114+
; CHECK-NEXT: [[B:%.*]] = sdiv <vscale x 4 x i32> [[X:%.*]], [[YSPLAT]]
115+
; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[B]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
116+
; CHECK-NEXT: ret <vscale x 4 x i32> [[BSPLAT]]
117+
;
118+
%ysplat = shufflevector <vscale x 4 x i32> %y, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
119+
%b = sdiv <vscale x 4 x i32> %x, %ysplat
120+
%bsplat = shufflevector <vscale x 4 x i32> %b, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
121+
ret <vscale x 4 x i32> %bsplat
122+
}
123+
124+
define <vscale x 4 x i32> @vscale_splat_binop_splat_x_splat_y(<vscale x 4 x i32> %x, <vscale x 4 x i32> %y) {
125+
; CHECK-LABEL: @vscale_splat_binop_splat_x_splat_y(
126+
; CHECK-NEXT: [[TMP1:%.*]] = ashr <vscale x 4 x i32> [[X:%.*]], [[Y:%.*]]
127+
; CHECK-NEXT: [[B:%.*]] = shufflevector <vscale x 4 x i32> [[TMP1]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
128+
; CHECK-NEXT: ret <vscale x 4 x i32> [[B]]
129+
;
130+
%xsplat = shufflevector <vscale x 4 x i32> %x, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
131+
%ysplat = shufflevector <vscale x 4 x i32> %y, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
132+
%b = ashr <vscale x 4 x i32> %xsplat, %ysplat
133+
%bsplat = shufflevector <vscale x 4 x i32> %b, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
134+
ret <vscale x 4 x i32> %bsplat
135+
}
136+
137+
define <vscale x 4 x i32> @vscale_splat_binop_splat_x_splat_y_calls(<vscale x 4 x i32> %x, <vscale x 4 x i32> %y) {
138+
; CHECK-LABEL: @vscale_splat_binop_splat_x_splat_y_calls(
139+
; CHECK-NEXT: [[XSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[X:%.*]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
140+
; CHECK-NEXT: call void @use_v(<vscale x 4 x i32> [[XSPLAT]])
141+
; CHECK-NEXT: [[YSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[Y:%.*]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
142+
; CHECK-NEXT: call void @use_v(<vscale x 4 x i32> [[YSPLAT]])
143+
; CHECK-NEXT: [[B:%.*]] = lshr <vscale x 4 x i32> [[XSPLAT]], [[YSPLAT]]
144+
; CHECK-NEXT: [[BSPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[B]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
145+
; CHECK-NEXT: ret <vscale x 4 x i32> [[BSPLAT]]
146+
;
147+
%xsplat = shufflevector <vscale x 4 x i32> %x, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
148+
call void @use_v(<vscale x 4 x i32> %xsplat)
149+
%ysplat = shufflevector <vscale x 4 x i32> %y, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
150+
call void @use_v(<vscale x 4 x i32> %ysplat)
151+
%b = lshr <vscale x 4 x i32> %xsplat, %ysplat
152+
%bsplat = shufflevector <vscale x 4 x i32> %b, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
153+
ret <vscale x 4 x i32> %bsplat
154+
}
155+
156+
declare void @use(<4 x i8>)
157+
declare void @use_v(<vscale x 4 x i32>)

0 commit comments

Comments
 (0)