|
| 1 | +// RUN: mlir-opt --test-emulate-narrow-int="arith-compute-bitwidth=1 memref-load-bitwidth=32 skip-memref-type-conversion" --split-input-file %s | FileCheck %s |
| 2 | + |
| 3 | +// These tests mimic tests from vector-narrow-type.mlir, but load/store 2-D |
| 4 | +// insted of 1-D vectors. That's currently not supported. |
| 5 | + |
| 6 | +///---------------------------------------------------------------------------------------- |
| 7 | +/// vector.load |
| 8 | +///---------------------------------------------------------------------------------------- |
| 9 | + |
| 10 | +func.func @vector_load_2d_i8_negative(%arg1: index, %arg2: index) -> vector<2x4xi8> { |
| 11 | + %0 = memref.alloc() : memref<3x4xi8> |
| 12 | + %1 = vector.load %0[%arg1, %arg2] : memref<3x4xi8>, vector<2x4xi8> |
| 13 | + return %1 : vector<2x4xi8> |
| 14 | +} |
| 15 | + |
| 16 | +// No support for loading 2D vectors - expect no conversions |
| 17 | +// CHECK-LABEL: func @vector_load_2d_i8_negative |
| 18 | +// CHECK: memref.alloc() : memref<3x4xi8> |
| 19 | +// CHECK-NOT: i32 |
| 20 | + |
| 21 | +// ----- |
| 22 | + |
| 23 | +///---------------------------------------------------------------------------------------- |
| 24 | +/// vector.transfer_read |
| 25 | +///---------------------------------------------------------------------------------------- |
| 26 | + |
| 27 | +func.func @vector_transfer_read_2d_i4_negative(%arg1: index, %arg2: index) -> vector<2x8xi4> { |
| 28 | + %c0 = arith.constant 0 : i4 |
| 29 | + %0 = memref.alloc() : memref<3x8xi4> |
| 30 | + %1 = vector.transfer_read %0[%arg1, %arg2], %c0 {in_bounds = [true, true]} : |
| 31 | + memref<3x8xi4>, vector<2x8xi4> |
| 32 | + return %1 : vector<2x8xi4> |
| 33 | +} |
| 34 | +// CHECK-LABEL: func @vector_transfer_read_2d_i4_negative |
| 35 | +// CHECK: memref.alloc() : memref<3x8xi4> |
| 36 | +// CHECK-NOT: i32 |
| 37 | + |
| 38 | +// ----- |
| 39 | + |
| 40 | +///---------------------------------------------------------------------------------------- |
| 41 | +/// vector.maskedload |
| 42 | +///---------------------------------------------------------------------------------------- |
| 43 | + |
| 44 | +func.func @vector_maskedload_2d_i8_negative(%arg1: index, %arg2: index, %arg3: index, %passthru: vector<2x4xi8>) -> vector<2x4xi8> { |
| 45 | + %0 = memref.alloc() : memref<3x4xi8> |
| 46 | + %mask = vector.create_mask %arg3, %arg3 : vector<2x4xi1> |
| 47 | + %1 = vector.maskedload %0[%arg1, %arg2], %mask, %passthru : |
| 48 | + memref<3x4xi8>, vector<2x4xi1>, vector<2x4xi8> into vector<2x4xi8> |
| 49 | + return %1 : vector<2x4xi8> |
| 50 | +} |
| 51 | + |
| 52 | +// CHECK-LABEL: func @vector_maskedload_2d_i8_negative |
| 53 | +// CHECK: memref.alloc() : memref<3x4xi8> |
| 54 | +// CHECK-NOT: i32 |
| 55 | + |
| 56 | +// ----- |
| 57 | + |
| 58 | +///---------------------------------------------------------------------------------------- |
| 59 | +/// vector.extract -> vector.masked_load |
| 60 | +///---------------------------------------------------------------------------------------- |
| 61 | + |
| 62 | +func.func @vector_extract_maskedload_2d_i4_negative(%arg1: index) -> vector<8x8x16xi4> { |
| 63 | + %0 = memref.alloc() : memref<8x8x16xi4> |
| 64 | + %c0 = arith.constant 0 : index |
| 65 | + %c16 = arith.constant 16 : index |
| 66 | + %c8 = arith.constant 8 : index |
| 67 | + %cst_1 = arith.constant dense<0> : vector<8x8x16xi4> |
| 68 | + %cst_2 = arith.constant dense<0> : vector<8x16xi4> |
| 69 | + %27 = vector.create_mask %c8, %arg1, %c16 : vector<8x8x16xi1> |
| 70 | + %48 = vector.extract %27[0] : vector<8x16xi1> from vector<8x8x16xi1> |
| 71 | + %50 = vector.maskedload %0[%c0, %c0, %c0], %48, %cst_2 : memref<8x8x16xi4>, vector<8x16xi1>, vector<8x16xi4> into vector<8x16xi4> |
| 72 | + %63 = vector.insert %50, %cst_1 [0] : vector<8x16xi4> into vector<8x8x16xi4> |
| 73 | + return %63 : vector<8x8x16xi4> |
| 74 | +} |
| 75 | + |
| 76 | +// CHECK-LABEL: func @vector_extract_maskedload_2d_i4_negative |
| 77 | +// CHECK: memref.alloc() : memref<8x8x16xi4> |
| 78 | +// CHECK-NOT: i32 |
| 79 | + |
| 80 | +// ----- |
| 81 | + |
| 82 | +///---------------------------------------------------------------------------------------- |
| 83 | +/// vector.store |
| 84 | +///---------------------------------------------------------------------------------------- |
| 85 | + |
| 86 | +func.func @vector_store_2d_i8_negative(%arg0: vector<2x8xi8>, %arg1: index, %arg2: index) { |
| 87 | + %0 = memref.alloc() : memref<4x8xi8> |
| 88 | + vector.store %arg0, %0[%arg1, %arg2] :memref<4x8xi8>, vector<2x8xi8> |
| 89 | + return |
| 90 | +} |
| 91 | + |
| 92 | +// CHECK-LABEL: func @vector_store_2d_i8_negative |
| 93 | +// CHECK: memref.alloc() : memref<4x8xi8> |
| 94 | +// CHECK-NOT: i32 |
| 95 | + |
| 96 | +// ----- |
| 97 | + |
| 98 | +///---------------------------------------------------------------------------------------- |
| 99 | +/// vector.maskedstore |
| 100 | +///---------------------------------------------------------------------------------------- |
| 101 | + |
| 102 | +func.func @vector_maskedstore_2d_i8_negative(%arg0: index, %arg1: index, %arg2: index, %value: vector<2x8xi8>) { |
| 103 | + %0 = memref.alloc() : memref<3x8xi8> |
| 104 | + %mask = vector.create_mask %arg2, %arg2 : vector<2x8xi1> |
| 105 | + vector.maskedstore %0[%arg0, %arg1], %mask, %value : memref<3x8xi8>, vector<2x8xi1>, vector<2x8xi8> |
| 106 | + return |
| 107 | +} |
| 108 | + |
| 109 | +// CHECK-LABEL: func @vector_maskedstore_2d_i8_negative |
| 110 | +// CHECK: memref.alloc() : memref<3x8xi8> |
| 111 | +// CHECK-NOT: i32 |
0 commit comments