Skip to content

Commit 80c8ecd

Browse files
committed
[VectorCombine] Add baseline "shuffle (binop (shuffle, shuffle)), undef" tests for #114101
1 parent c478aab commit 80c8ecd

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt < %s -passes=vector-combine -S -mtriple=x86_64-- -mattr=sse2 | FileCheck %s --check-prefixes=CHECK,SSE
3+
; RUN: opt < %s -passes=vector-combine -S -mtriple=x86_64-- -mattr=avx2 | FileCheck %s --check-prefixes=CHECK,AVX
4+
5+
; Fold "shuffle (binop (shuffle, shuffle)), undef" --> "binop (shuffle), (shuffle)"
6+
7+
declare void @use_v4f64(<4 x double>)
8+
9+
define <4 x double> @fadd_v4f64(<4 x double> %a, <4 x double> %b) {
10+
; CHECK-LABEL: define <4 x double> @fadd_v4f64(
11+
; CHECK-SAME: <4 x double> [[A:%.*]], <4 x double> [[B:%.*]]) #[[ATTR0:[0-9]+]] {
12+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A]], <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
13+
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[B]], <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
14+
; CHECK-NEXT: [[POST:%.*]] = fadd <4 x double> [[TMP1]], [[TMP2]]
15+
; CHECK-NEXT: [[POST1:%.*]] = shufflevector <4 x double> [[POST]], <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
16+
; CHECK-NEXT: ret <4 x double> [[POST1]]
17+
;
18+
%a1 = shufflevector <4 x double> %a, <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
19+
%b1 = shufflevector <4 x double> %b, <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
20+
%op = fadd <4 x double> %a1, %b1
21+
%post = shufflevector <4 x double> %op, <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
22+
ret <4 x double> %post
23+
}
24+
25+
define <4 x double> @fadd_v4f64_poison_idx(<4 x double> %a, <4 x double> %b) {
26+
; CHECK-LABEL: define <4 x double> @fadd_v4f64_poison_idx(
27+
; CHECK-SAME: <4 x double> [[A:%.*]], <4 x double> [[B:%.*]]) #[[ATTR0]] {
28+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A]], <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
29+
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[B]], <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
30+
; CHECK-NEXT: [[POST:%.*]] = fadd <4 x double> [[TMP1]], [[TMP2]]
31+
; CHECK-NEXT: [[POST1:%.*]] = shufflevector <4 x double> [[POST]], <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 4>
32+
; CHECK-NEXT: ret <4 x double> [[POST1]]
33+
;
34+
%a1 = shufflevector <4 x double> %a, <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
35+
%b1 = shufflevector <4 x double> %b, <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
36+
%op = fadd <4 x double> %a1, %b1
37+
%post = shufflevector <4 x double> %op, <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 4>
38+
ret <4 x double> %post
39+
}
40+
41+
define <4 x double> @fadd_mixed_types(<4 x double> %a, <2 x double> %b) {
42+
; CHECK-LABEL: define <4 x double> @fadd_mixed_types(
43+
; CHECK-SAME: <4 x double> [[A:%.*]], <2 x double> [[B:%.*]]) #[[ATTR0]] {
44+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A]], <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
45+
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x double> [[B]], <2 x double> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
46+
; CHECK-NEXT: [[POST:%.*]] = fadd <4 x double> [[TMP1]], [[TMP2]]
47+
; CHECK-NEXT: [[POST1:%.*]] = shufflevector <4 x double> [[POST]], <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
48+
; CHECK-NEXT: ret <4 x double> [[POST1]]
49+
;
50+
%a1 = shufflevector <4 x double> %a, <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
51+
%b1 = shufflevector <2 x double> %b, <2 x double> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
52+
%op = fadd <4 x double> %a1, %b1
53+
%post = shufflevector <4 x double> %op, <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
54+
ret <4 x double> %post
55+
}
56+
57+
; Negative test - multiple use of fadd
58+
define <4 x double> @fadd_v4f64_multiuse_op(<4 x double> %a, <4 x double> %b) {
59+
; CHECK-LABEL: define <4 x double> @fadd_v4f64_multiuse_op(
60+
; CHECK-SAME: <4 x double> [[A:%.*]], <4 x double> [[B:%.*]]) #[[ATTR0]] {
61+
; CHECK-NEXT: [[A1:%.*]] = shufflevector <4 x double> [[A]], <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
62+
; CHECK-NEXT: [[B1:%.*]] = shufflevector <4 x double> [[B]], <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
63+
; CHECK-NEXT: [[OP:%.*]] = fadd <4 x double> [[A1]], [[B1]]
64+
; CHECK-NEXT: [[POST:%.*]] = shufflevector <4 x double> [[OP]], <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
65+
; CHECK-NEXT: call void @use_v4f64(<4 x double> [[OP]])
66+
; CHECK-NEXT: ret <4 x double> [[POST]]
67+
;
68+
%a1 = shufflevector <4 x double> %a, <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
69+
%b1 = shufflevector <4 x double> %b, <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
70+
%op = fadd <4 x double> %a1, %b1
71+
%post = shufflevector <4 x double> %op, <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
72+
call void @use_v4f64(<4 x double> %op)
73+
ret <4 x double> %post
74+
}
75+
76+
; Negative test - multiple use of inner shuffle
77+
define <4 x double> @fadd_v4f64_multiuse_shuffle(<4 x double> %a, <4 x double> %b) {
78+
; CHECK-LABEL: define <4 x double> @fadd_v4f64_multiuse_shuffle(
79+
; CHECK-SAME: <4 x double> [[A:%.*]], <4 x double> [[B:%.*]]) #[[ATTR0]] {
80+
; CHECK-NEXT: [[A1:%.*]] = shufflevector <4 x double> [[A]], <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
81+
; CHECK-NEXT: [[B1:%.*]] = shufflevector <4 x double> [[B]], <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
82+
; CHECK-NEXT: [[OP:%.*]] = fadd <4 x double> [[A1]], [[B1]]
83+
; CHECK-NEXT: [[POST:%.*]] = shufflevector <4 x double> [[OP]], <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
84+
; CHECK-NEXT: call void @use_v4f64(<4 x double> [[A1]])
85+
; CHECK-NEXT: ret <4 x double> [[POST]]
86+
;
87+
%a1 = shufflevector <4 x double> %a, <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
88+
%b1 = shufflevector <4 x double> %b, <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
89+
%op = fadd <4 x double> %a1, %b1
90+
%post = shufflevector <4 x double> %op, <4 x double> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
91+
call void @use_v4f64(<4 x double> %a1)
92+
ret <4 x double> %post
93+
}
94+
95+
define <4 x i32> @sdiv_v4i32(<4 x i32> %a, <4 x i32> %b) {
96+
; CHECK-LABEL: define <4 x i32> @sdiv_v4i32(
97+
; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) #[[ATTR0]] {
98+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
99+
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
100+
; CHECK-NEXT: [[POST:%.*]] = sdiv <4 x i32> [[TMP1]], [[TMP2]]
101+
; CHECK-NEXT: [[POST1:%.*]] = shufflevector <4 x i32> [[POST]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 0>
102+
; CHECK-NEXT: ret <4 x i32> [[POST1]]
103+
;
104+
%a1 = shufflevector <4 x i32> %a, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
105+
%b1 = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
106+
%op = sdiv <4 x i32> %a1, %b1
107+
%post = shufflevector <4 x i32> %op, <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 0>
108+
ret <4 x i32> %post
109+
}
110+
111+
; Negative test - don't introduce poison element into div/rem instruction
112+
define <4 x i32> @sdiv_v4i32_poison(<4 x i32> %a, <4 x i32> %b) {
113+
; CHECK-LABEL: define <4 x i32> @sdiv_v4i32_poison(
114+
; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) #[[ATTR0]] {
115+
; CHECK-NEXT: [[A1:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
116+
; CHECK-NEXT: [[B1:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
117+
; CHECK-NEXT: [[OP:%.*]] = sdiv <4 x i32> [[A1]], [[B1]]
118+
; CHECK-NEXT: [[POST:%.*]] = shufflevector <4 x i32> [[OP]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 poison>
119+
; CHECK-NEXT: ret <4 x i32> [[POST]]
120+
;
121+
%a1 = shufflevector <4 x i32> %a, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
122+
%b1 = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
123+
%op = sdiv <4 x i32> %a1, %b1
124+
%post = shufflevector <4 x i32> %op, <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 poison>
125+
ret <4 x i32> %post
126+
}
127+
128+
; Negative test - don't introduce poison element into div/rem instruction
129+
define <4 x i32> @sdiv_v4i32_poison_idx(<4 x i32> %a, <4 x i32> %b) {
130+
; CHECK-LABEL: define <4 x i32> @sdiv_v4i32_poison_idx(
131+
; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) #[[ATTR0]] {
132+
; CHECK-NEXT: [[A1:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
133+
; CHECK-NEXT: [[B1:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
134+
; CHECK-NEXT: [[OP:%.*]] = sdiv <4 x i32> [[A1]], [[B1]]
135+
; CHECK-NEXT: [[POST:%.*]] = shufflevector <4 x i32> [[OP]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 4>
136+
; CHECK-NEXT: ret <4 x i32> [[POST]]
137+
;
138+
%a1 = shufflevector <4 x i32> %a, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
139+
%b1 = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
140+
%op = sdiv <4 x i32> %a1, %b1
141+
%post = shufflevector <4 x i32> %op, <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 4>
142+
ret <4 x i32> %post
143+
}
144+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
145+
; AVX: {{.*}}
146+
; SSE: {{.*}}

0 commit comments

Comments
 (0)