|
| 1 | +// RUN: mlir-opt %s --test-vector-shuffle-lowering --split-input-file | FileCheck %s |
| 2 | + |
| 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 | + // CHECK: return %[[RESULT]] : vector<5xf32> |
| 9 | + %0 = vector.shuffle %lhs, %rhs [1, 3, 0, 4, 5] : vector<2xf32>, vector<4xf32> |
| 10 | + return %0 : vector<5xf32> |
| 11 | +} |
| 12 | + |
| 13 | +// ----- |
| 14 | + |
| 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 | + // CHECK: return %[[RESULT]] : vector<6xi32> |
| 21 | + %0 = vector.shuffle %lhs, %rhs [3, 5, 1, 4, 0, 2] : vector<4xi32>, vector<2xi32> |
| 22 | + return %0 : vector<6xi32> |
| 23 | +} |
| 24 | + |
| 25 | +// ----- |
| 26 | + |
| 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 | + // CHECK: return %[[RESULT]] : vector<8xf64> |
| 33 | + %0 = vector.shuffle %lhs, %rhs [0, 1, 2, 3, 4, 5, 6, 7] : vector<3xf64>, vector<5xf64> |
| 34 | + return %0 : vector<8xf64> |
| 35 | +} |
| 36 | + |
| 37 | +// ----- |
| 38 | + |
| 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 | + // CHECK: return %[[RESULT]] : vector<6xi16> |
| 45 | + %0 = vector.shuffle %lhs, %rhs [0, 1, 2, 3, 4, 5] : vector<4xi16>, vector<2xi16> |
| 46 | + return %0 : vector<6xi16> |
| 47 | +} |
| 48 | + |
| 49 | +// ----- |
| 50 | + |
| 51 | +// Test that shuffles with same size inputs are not modified. |
| 52 | + |
| 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 | + // CHECK: return %[[RESULT]] : vector<6xf32> |
| 60 | + %0 = vector.shuffle %lhs, %rhs [0, 1, 4, 5, 2, 6] : vector<4xf32>, vector<4xf32> |
| 61 | + return %0 : vector<6xf32> |
| 62 | +} |
| 63 | + |
| 64 | +// ----- |
| 65 | + |
| 66 | +// Test that multi-dimensional shuffles are not modified. |
| 67 | + |
| 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 | + // CHECK: return %[[RESULT]] : vector<4x4xf32> |
| 75 | + %0 = vector.shuffle %lhs, %rhs [0, 1, 2, 3] : vector<2x4xf32>, vector<3x4xf32> |
| 76 | + return %0 : vector<4x4xf32> |
| 77 | +} |
0 commit comments