|
1 | 1 | // RUN: mlir-opt %s --test-vector-shuffle-lowering --split-input-file | FileCheck %s |
2 | 2 |
|
3 | | -// CHECK-LABEL: func.func @shuffle_v1_smaller_arbitrary |
4 | | -// CHECK-SAME: %[[V1:.*]]: vector<2xf32>, %[[V2:.*]]: vector<4xf32> |
5 | | -func.func @shuffle_v1_smaller_arbitrary(%v1: vector<2xf32>, %v2: vector<4xf32>) -> vector<5xf32> { |
6 | | - // CHECK: %[[PROMOTE_V1:.*]] = vector.shuffle %[[V1]], %[[V1]] [0, 1, -1, -1] : vector<2xf32>, vector<2xf32> |
7 | | - // CHECK: %[[RESULT:.*]] = vector.shuffle %[[PROMOTE_V1]], %[[V2]] [1, 5, 0, 6, 7] : vector<4xf32>, vector<4xf32> |
| 3 | +// CHECK-LABEL: func.func @shuffle_smaller_lhs_arbitrary |
| 4 | +// CHECK-SAME: %[[LHS:.*]]: vector<2xf32>, %[[RHS:.*]]: vector<4xf32> |
| 5 | +func.func @shuffle_smaller_lhs_arbitrary(%lhs: vector<2xf32>, %rhs: vector<4xf32>) -> vector<5xf32> { |
| 6 | + // CHECK: %[[PROMOTE_LHS:.*]] = vector.shuffle %[[LHS]], %[[LHS]] [0, 1, -1, -1] : vector<2xf32>, vector<2xf32> |
| 7 | + // CHECK: %[[RESULT:.*]] = vector.shuffle %[[PROMOTE_LHS]], %[[RHS]] [1, 5, 0, 6, 7] : vector<4xf32>, vector<4xf32> |
8 | 8 | // CHECK: return %[[RESULT]] : vector<5xf32> |
9 | | - %0 = vector.shuffle %v1, %v2 [1, 3, 0, 4, 5] : vector<2xf32>, vector<4xf32> |
| 9 | + %0 = vector.shuffle %lhs, %rhs [1, 3, 0, 4, 5] : vector<2xf32>, vector<4xf32> |
10 | 10 | return %0 : vector<5xf32> |
11 | 11 | } |
12 | 12 |
|
13 | 13 | // ----- |
14 | 14 |
|
15 | | -// CHECK-LABEL: func.func @shuffle_v2_smaller_arbitrary |
16 | | -// CHECK-SAME: %[[V1:.*]]: vector<4xi32>, %[[V2:.*]]: vector<2xi32> |
17 | | -func.func @shuffle_v2_smaller_arbitrary(%v1: vector<4xi32>, %v2: vector<2xi32>) -> vector<6xi32> { |
18 | | - // CHECK: %[[PROMOTE_V2:.*]] = vector.shuffle %[[V2]], %[[V2]] [0, 1, -1, -1] : vector<2xi32>, vector<2xi32> |
19 | | - // CHECK: %[[RESULT:.*]] = vector.shuffle %[[V1]], %[[PROMOTE_V2]] [3, 5, 1, 4, 0, 2] : vector<4xi32>, vector<4xi32> |
| 15 | +// CHECK-LABEL: func.func @shuffle_smaller_rhs_arbitrary |
| 16 | +// CHECK-SAME: %[[LHS:.*]]: vector<4xi32>, %[[RHS:.*]]: vector<2xi32> |
| 17 | +func.func @shuffle_smaller_rhs_arbitrary(%lhs: vector<4xi32>, %rhs: vector<2xi32>) -> vector<6xi32> { |
| 18 | + // CHECK: %[[PROMOTE_RHS:.*]] = vector.shuffle %[[RHS]], %[[RHS]] [0, 1, -1, -1] : vector<2xi32>, vector<2xi32> |
| 19 | + // CHECK: %[[RESULT:.*]] = vector.shuffle %[[LHS]], %[[PROMOTE_RHS]] [3, 5, 1, 4, 0, 2] : vector<4xi32>, vector<4xi32> |
20 | 20 | // CHECK: return %[[RESULT]] : vector<6xi32> |
21 | | - %0 = vector.shuffle %v1, %v2 [3, 5, 1, 4, 0, 2] : vector<4xi32>, vector<2xi32> |
| 21 | + %0 = vector.shuffle %lhs, %rhs [3, 5, 1, 4, 0, 2] : vector<4xi32>, vector<2xi32> |
22 | 22 | return %0 : vector<6xi32> |
23 | 23 | } |
24 | 24 |
|
25 | 25 | // ----- |
26 | 26 |
|
27 | | -// CHECK-LABEL: func.func @shuffle_v1_smaller_concat |
28 | | -// CHECK-SAME: %[[V1:.*]]: vector<3xf64>, %[[V2:.*]]: vector<5xf64> |
29 | | -func.func @shuffle_v1_smaller_concat(%v1: vector<3xf64>, %v2: vector<5xf64>) -> vector<8xf64> { |
30 | | - // CHECK: %[[PROMOTE_V1:.*]] = vector.shuffle %[[V1]], %[[V1]] [0, 1, 2, -1, -1] : vector<3xf64>, vector<3xf64> |
31 | | - // CHECK: %[[RESULT:.*]] = vector.shuffle %[[PROMOTE_V1]], %[[V2]] [0, 1, 2, 5, 6, 7, 8, 9] : vector<5xf64>, vector<5xf64> |
| 27 | +// CHECK-LABEL: func.func @shuffle_smaller_lhs_concat |
| 28 | +// CHECK-SAME: %[[LHS:.*]]: vector<3xf64>, %[[RHS:.*]]: vector<5xf64> |
| 29 | +func.func @shuffle_smaller_lhs_concat(%lhs: vector<3xf64>, %rhs: vector<5xf64>) -> vector<8xf64> { |
| 30 | + // CHECK: %[[PROMOTE_LHS:.*]] = vector.shuffle %[[LHS]], %[[LHS]] [0, 1, 2, -1, -1] : vector<3xf64>, vector<3xf64> |
| 31 | + // CHECK: %[[RESULT:.*]] = vector.shuffle %[[PROMOTE_LHS]], %[[RHS]] [0, 1, 2, 5, 6, 7, 8, 9] : vector<5xf64>, vector<5xf64> |
32 | 32 | // CHECK: return %[[RESULT]] : vector<8xf64> |
33 | | - %0 = vector.shuffle %v1, %v2 [0, 1, 2, 3, 4, 5, 6, 7] : vector<3xf64>, vector<5xf64> |
| 33 | + %0 = vector.shuffle %lhs, %rhs [0, 1, 2, 3, 4, 5, 6, 7] : vector<3xf64>, vector<5xf64> |
34 | 34 | return %0 : vector<8xf64> |
35 | 35 | } |
36 | 36 |
|
37 | 37 | // ----- |
38 | 38 |
|
39 | | -// CHECK-LABEL: func.func @shuffle_v2_smaller_concat |
40 | | -// CHECK-SAME: %[[V1:.*]]: vector<4xi16>, %[[V2:.*]]: vector<2xi16> |
41 | | -func.func @shuffle_v2_smaller_concat(%v1: vector<4xi16>, %v2: vector<2xi16>) -> vector<6xi16> { |
42 | | - // CHECK: %[[PROMOTE_V2:.*]] = vector.shuffle %[[V2]], %[[V2]] [0, 1, -1, -1] : vector<2xi16>, vector<2xi16> |
43 | | - // CHECK: %[[RESULT:.*]] = vector.shuffle %[[V1]], %[[PROMOTE_V2]] [0, 1, 2, 3, 4, 5] : vector<4xi16>, vector<4xi16> |
| 39 | +// CHECK-LABEL: func.func @shuffle_smaller_rhs_concat |
| 40 | +// CHECK-SAME: %[[LHS:.*]]: vector<4xi16>, %[[RHS:.*]]: vector<2xi16> |
| 41 | +func.func @shuffle_smaller_rhs_concat(%lhs: vector<4xi16>, %rhs: vector<2xi16>) -> vector<6xi16> { |
| 42 | + // CHECK: %[[PROMOTE_RHS:.*]] = vector.shuffle %[[RHS]], %[[RHS]] [0, 1, -1, -1] : vector<2xi16>, vector<2xi16> |
| 43 | + // CHECK: %[[RESULT:.*]] = vector.shuffle %[[LHS]], %[[PROMOTE_RHS]] [0, 1, 2, 3, 4, 5] : vector<4xi16>, vector<4xi16> |
44 | 44 | // CHECK: return %[[RESULT]] : vector<6xi16> |
45 | | - %0 = vector.shuffle %v1, %v2 [0, 1, 2, 3, 4, 5] : vector<4xi16>, vector<2xi16> |
| 45 | + %0 = vector.shuffle %lhs, %rhs [0, 1, 2, 3, 4, 5] : vector<4xi16>, vector<2xi16> |
46 | 46 | return %0 : vector<6xi16> |
47 | 47 | } |
48 | 48 |
|
49 | 49 | // ----- |
50 | 50 |
|
51 | 51 | // Test that shuffles with same size inputs are not modified. |
52 | 52 |
|
53 | | -// CHECK-LABEL: func.func @shuffle_same_input_sizes |
54 | | -// CHECK-SAME: %[[V1:.*]]: vector<4xf32>, %[[V2:.*]]: vector<4xf32> |
55 | | -func.func @shuffle_same_input_sizes(%v1: vector<4xf32>, %v2: vector<4xf32>) -> vector<6xf32> { |
56 | | - // CHECK-NOT: vector.shuffle %[[V1]], %[[V1]] |
57 | | - // CHECK-NOT: vector.shuffle %[[V2]], %[[V2]] |
58 | | - // CHECK: %[[RESULT:.*]] = vector.shuffle %[[V1]], %[[V2]] [0, 1, 4, 5, 2, 6] : vector<4xf32>, vector<4xf32> |
| 53 | +// CHECK-LABEL: func.func @negative_shuffle_same_input_sizes |
| 54 | +// CHECK-SAME: %[[LHS:.*]]: vector<4xf32>, %[[RHS:.*]]: vector<4xf32> |
| 55 | +func.func @negative_shuffle_same_input_sizes(%lhs: vector<4xf32>, %rhs: vector<4xf32>) -> vector<6xf32> { |
| 56 | + // CHECK-NOT: vector.shuffle %[[LHS]], %[[LHS]] |
| 57 | + // CHECK-NOT: vector.shuffle %[[RHS]], %[[RHS]] |
| 58 | + // CHECK: %[[RESULT:.*]] = vector.shuffle %[[LHS]], %[[RHS]] [0, 1, 4, 5, 2, 6] : vector<4xf32>, vector<4xf32> |
59 | 59 | // CHECK: return %[[RESULT]] : vector<6xf32> |
60 | | - %0 = vector.shuffle %v1, %v2 [0, 1, 4, 5, 2, 6] : vector<4xf32>, vector<4xf32> |
| 60 | + %0 = vector.shuffle %lhs, %rhs [0, 1, 4, 5, 2, 6] : vector<4xf32>, vector<4xf32> |
61 | 61 | return %0 : vector<6xf32> |
62 | 62 | } |
63 | 63 |
|
64 | 64 | // ----- |
65 | 65 |
|
66 | 66 | // Test that multi-dimensional shuffles are not modified. |
67 | 67 |
|
68 | | -// CHECK-LABEL: func.func @shuffle_2d_vectors_no_change |
69 | | -// CHECK-SAME: %[[V1:.*]]: vector<2x4xf32>, %[[V2:.*]]: vector<3x4xf32> |
70 | | -func.func @shuffle_2d_vectors_no_change(%v1: vector<2x4xf32>, %v2: vector<3x4xf32>) -> vector<4x4xf32> { |
71 | | - // CHECK-NOT: vector.shuffle %[[V1]], %[[V1]] |
72 | | - // CHECK-NOT: vector.shuffle %[[V2]], %[[V2]] |
73 | | - // CHECK: %[[RESULT:.*]] = vector.shuffle %[[V1]], %[[V2]] [0, 1, 2, 3] : vector<2x4xf32>, vector<3x4xf32> |
| 68 | +// CHECK-LABEL: func.func @negative_shuffle_2d_vectors |
| 69 | +// CHECK-SAME: %[[LHS:.*]]: vector<2x4xf32>, %[[RHS:.*]]: vector<3x4xf32> |
| 70 | +func.func @negative_shuffle_2d_vectors(%lhs: vector<2x4xf32>, %rhs: vector<3x4xf32>) -> vector<4x4xf32> { |
| 71 | + // CHECK-NOT: vector.shuffle %[[LHS]], %[[LHS]] |
| 72 | + // CHECK-NOT: vector.shuffle %[[RHS]], %[[RHS]] |
| 73 | + // CHECK: %[[RESULT:.*]] = vector.shuffle %[[LHS]], %[[RHS]] [0, 1, 2, 3] : vector<2x4xf32>, vector<3x4xf32> |
74 | 74 | // CHECK: return %[[RESULT]] : vector<4x4xf32> |
75 | | - %0 = vector.shuffle %v1, %v2 [0, 1, 2, 3] : vector<2x4xf32>, vector<3x4xf32> |
| 75 | + %0 = vector.shuffle %lhs, %rhs [0, 1, 2, 3] : vector<2x4xf32>, vector<3x4xf32> |
76 | 76 | return %0 : vector<4x4xf32> |
77 | 77 | } |
0 commit comments