Skip to content

Commit 9746078

Browse files
committed
[WebAssembly] Add InstCombine test for constant swizzles
1 parent 28c048e commit 9746078

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt < %s -passes=instcombine -mtriple=wasm32-unknown-unknown -S | FileCheck %s
3+
4+
; swizzle with a constant operand should be optimized to a shufflevector.
5+
6+
declare <16 x i8> @llvm.wasm.swizzle(<16 x i8>, <16 x i8>)
7+
declare <16 x i8> @llvm.wasm.relaxed.swizzle(<16 x i8>, <16 x i8>)
8+
9+
; Identity swizzle pattern
10+
; TODO: Should simplify to nothing.
11+
define <16 x i8> @swizzle_identity(<16 x i8> %v) {
12+
; CHECK-LABEL: define <16 x i8> @swizzle_identity(
13+
; CHECK-SAME: <16 x i8> [[V:%.*]]) {
14+
; CHECK-NEXT: [[RESULT:%.*]] = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> [[V]], <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>)
15+
; CHECK-NEXT: ret <16 x i8> [[RESULT]]
16+
;
17+
%result = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> %v, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>)
18+
ret <16 x i8> %result
19+
}
20+
21+
; Reverse swizzle pattern
22+
; TODO: Should simplify to shufflevector.
23+
define <16 x i8> @swizzle_reverse(<16 x i8> %v) {
24+
; CHECK-LABEL: define <16 x i8> @swizzle_reverse(
25+
; CHECK-SAME: <16 x i8> [[V:%.*]]) {
26+
; CHECK-NEXT: [[RESULT:%.*]] = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> [[V]], <16 x i8> <i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>)
27+
; CHECK-NEXT: ret <16 x i8> [[RESULT]]
28+
;
29+
%result = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> %v, <16 x i8> <i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>)
30+
ret <16 x i8> %result
31+
}
32+
33+
; undef elements
34+
; TODO: Should simplify to shufflevector.
35+
define <16 x i8> @swizzle_with_undef(<16 x i8> %v) {
36+
; CHECK-LABEL: define <16 x i8> @swizzle_with_undef(
37+
; CHECK-SAME: <16 x i8> [[V:%.*]]) {
38+
; CHECK-NEXT: [[RESULT:%.*]] = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> [[V]], <16 x i8> <i8 0, i8 undef, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>)
39+
; CHECK-NEXT: ret <16 x i8> [[RESULT]]
40+
;
41+
%result = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> %v, <16 x i8> <i8 0, i8 undef, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>)
42+
ret <16 x i8> %result
43+
}
44+
45+
; Negative test: non-constant operand
46+
define <16 x i8> @swizzle_non_constant(<16 x i8> %v, <16 x i8> %mask) {
47+
; CHECK-LABEL: define <16 x i8> @swizzle_non_constant(
48+
; CHECK-SAME: <16 x i8> [[V:%.*]], <16 x i8> [[MASK:%.*]]) {
49+
; CHECK-NEXT: [[RESULT:%.*]] = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> [[V]], <16 x i8> [[MASK]])
50+
; CHECK-NEXT: ret <16 x i8> [[RESULT]]
51+
;
52+
%result = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> %v, <16 x i8> %mask)
53+
ret <16 x i8> %result
54+
}
55+
56+
; Out-of-bounds index, otherwise identity pattern
57+
; TODO: Should simplify to insertelement.
58+
define <16 x i8> @swizzle_out_of_bounds_1(<16 x i8> %v) {
59+
; CHECK-LABEL: define <16 x i8> @swizzle_out_of_bounds_1(
60+
; CHECK-SAME: <16 x i8> [[V:%.*]]) {
61+
; CHECK-NEXT: [[RESULT:%.*]] = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> [[V]], <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 16>)
62+
; CHECK-NEXT: ret <16 x i8> [[RESULT]]
63+
;
64+
%result = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> %v, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 16>)
65+
ret <16 x i8> %result
66+
}
67+
68+
; Out-of-bounds indices, both negative and positive
69+
; TODO: Should simplify to shufflevector.
70+
define <16 x i8> @swizzle_out_of_bounds_2(<16 x i8> %v) {
71+
; CHECK-LABEL: define <16 x i8> @swizzle_out_of_bounds_2(
72+
; CHECK-SAME: <16 x i8> [[V:%.*]]) {
73+
; CHECK-NEXT: [[RESULT:%.*]] = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> [[V]], <16 x i8> <i8 99, i8 -1, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>)
74+
; CHECK-NEXT: ret <16 x i8> [[RESULT]]
75+
;
76+
%result = tail call <16 x i8> @llvm.wasm.swizzle(<16 x i8> %v, <16 x i8> <i8 99, i8 -1, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>)
77+
ret <16 x i8> %result
78+
}
79+
80+
; Identity swizzle pattern (relaxed_swizzle)
81+
; TODO: Should simplify to nothing.
82+
define <16 x i8> @relaxed_swizzle_identity(<16 x i8> %v) {
83+
; CHECK-LABEL: define <16 x i8> @relaxed_swizzle_identity(
84+
; CHECK-SAME: <16 x i8> [[V:%.*]]) {
85+
; CHECK-NEXT: [[RESULT:%.*]] = tail call <16 x i8> @llvm.wasm.relaxed.swizzle(<16 x i8> [[V]], <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>)
86+
; CHECK-NEXT: ret <16 x i8> [[RESULT]]
87+
;
88+
%result = tail call <16 x i8> @llvm.wasm.relaxed.swizzle(<16 x i8> %v, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>)
89+
ret <16 x i8> %result
90+
}
91+
92+
; Reverse swizzle pattern (relaxed_swizzle)
93+
; TODO: Should simplify to shufflevector.
94+
define <16 x i8> @relaxed_swizzle_reverse(<16 x i8> %v) {
95+
; CHECK-LABEL: define <16 x i8> @relaxed_swizzle_reverse(
96+
; CHECK-SAME: <16 x i8> [[V:%.*]]) {
97+
; CHECK-NEXT: [[RESULT:%.*]] = tail call <16 x i8> @llvm.wasm.relaxed.swizzle(<16 x i8> [[V]], <16 x i8> <i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>)
98+
; CHECK-NEXT: ret <16 x i8> [[RESULT]]
99+
;
100+
%result = tail call <16 x i8> @llvm.wasm.relaxed.swizzle(<16 x i8> %v, <16 x i8> <i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>)
101+
ret <16 x i8> %result
102+
}
103+
104+
; Out-of-bounds index, only negative (relaxed_swizzle)
105+
; TODO: Should simplify to shufflevector.
106+
define <16 x i8> @relaxed_swizzle_out_of_bounds(<16 x i8> %v) {
107+
; CHECK-LABEL: define <16 x i8> @relaxed_swizzle_out_of_bounds(
108+
; CHECK-SAME: <16 x i8> [[V:%.*]]) {
109+
; CHECK-NEXT: [[RESULT:%.*]] = tail call <16 x i8> @llvm.wasm.relaxed.swizzle(<16 x i8> [[V]], <16 x i8> <i8 -99, i8 -1, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>)
110+
; CHECK-NEXT: ret <16 x i8> [[RESULT]]
111+
;
112+
%result = tail call <16 x i8> @llvm.wasm.relaxed.swizzle(<16 x i8> %v, <16 x i8> <i8 -99, i8 -1, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>)
113+
ret <16 x i8> %result
114+
}
115+
116+
; Negative test: out-of-bounds index, both positive and negative (relaxed_swizzle)
117+
; The choice between different relaxed semantics can only be made at runtime, since it must be consistent.
118+
define <16 x i8> @relaxed_swizzle_out_of_bounds_positive(<16 x i8> %v) {
119+
; CHECK-LABEL: define <16 x i8> @relaxed_swizzle_out_of_bounds_positive(
120+
; CHECK-SAME: <16 x i8> [[V:%.*]]) {
121+
; CHECK-NEXT: [[RESULT:%.*]] = tail call <16 x i8> @llvm.wasm.relaxed.swizzle(<16 x i8> [[V]], <16 x i8> <i8 99, i8 -1, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>)
122+
; CHECK-NEXT: ret <16 x i8> [[RESULT]]
123+
;
124+
%result = tail call <16 x i8> @llvm.wasm.relaxed.swizzle(<16 x i8> %v, <16 x i8> <i8 99, i8 -1, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>)
125+
ret <16 x i8> %result
126+
}

0 commit comments

Comments
 (0)