1// RUN: mlir-opt %s -test-vector-to-vector-lowering | FileCheck %s 2 3// CHECK-LABEL: func @maskedload0( 4// CHECK-SAME: %[[A0:.*]]: memref<?xf32>, 5// CHECK-SAME: %[[A1:.*]]: vector<16xf32>) -> vector<16xf32> { 6// CHECK-DAG: %[[C:.*]] = arith.constant 0 : index 7// CHECK-NEXT: %[[T:.*]] = vector.load %[[A0]][%[[C]]] : memref<?xf32>, vector<16xf32> 8// CHECK-NEXT: return %[[T]] : vector<16xf32> 9func.func @maskedload0(%base: memref<?xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> { 10 %c0 = arith.constant 0 : index 11 %mask = vector.constant_mask [16] : vector<16xi1> 12 %ld = vector.maskedload %base[%c0], %mask, %pass_thru 13 : memref<?xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32> 14 return %ld : vector<16xf32> 15} 16 17// CHECK-LABEL: func @maskedload1( 18// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 19// CHECK-SAME: %[[A1:.*]]: vector<16xf32>) -> vector<16xf32> { 20// CHECK-DAG: %[[C:.*]] = arith.constant 0 : index 21// CHECK-NEXT: %[[T:.*]] = vector.load %[[A0]][%[[C]]] : memref<16xf32>, vector<16xf32> 22// CHECK-NEXT: return %[[T]] : vector<16xf32> 23func.func @maskedload1(%base: memref<16xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> { 24 %c0 = arith.constant 0 : index 25 %mask = vector.constant_mask [16] : vector<16xi1> 26 %ld = vector.maskedload %base[%c0], %mask, %pass_thru 27 : memref<16xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32> 28 return %ld : vector<16xf32> 29} 30 31// CHECK-LABEL: func @maskedload2( 32// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 33// CHECK-SAME: %[[A1:.*]]: vector<16xf32>) -> vector<16xf32> { 34// CHECK-NEXT: return %[[A1]] : vector<16xf32> 35func.func @maskedload2(%base: memref<16xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> { 36 %c0 = arith.constant 0 : index 37 %mask = vector.constant_mask [0] : vector<16xi1> 38 %ld = vector.maskedload %base[%c0], %mask, %pass_thru 39 : memref<16xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32> 40 return %ld : vector<16xf32> 41} 42 43// CHECK-LABEL: func @maskedload3( 44// CHECK-SAME: %[[A0:.*]]: memref<?xf32>, 45// CHECK-SAME: %[[A1:.*]]: vector<16xf32>) -> vector<16xf32> { 46// CHECK-DAG: %[[C:.*]] = arith.constant 8 : index 47// CHECK-NEXT: %[[T:.*]] = vector.load %[[A0]][%[[C]]] : memref<?xf32>, vector<16xf32> 48// CHECK-NEXT: return %[[T]] : vector<16xf32> 49func.func @maskedload3(%base: memref<?xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> { 50 %c8 = arith.constant 8 : index 51 %mask = vector.constant_mask [16] : vector<16xi1> 52 %ld = vector.maskedload %base[%c8], %mask, %pass_thru 53 : memref<?xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32> 54 return %ld : vector<16xf32> 55} 56 57// CHECK-LABEL: func @maskedstore1( 58// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 59// CHECK-SAME: %[[A1:.*]]: vector<16xf32>) { 60// CHECK-NEXT: %[[C:.*]] = arith.constant 0 : index 61// CHECK-NEXT: vector.store %[[A1]], %[[A0]][%[[C]]] : memref<16xf32>, vector<16xf32> 62// CHECK-NEXT: return 63func.func @maskedstore1(%base: memref<16xf32>, %value: vector<16xf32>) { 64 %c0 = arith.constant 0 : index 65 %mask = vector.constant_mask [16] : vector<16xi1> 66 vector.maskedstore %base[%c0], %mask, %value : memref<16xf32>, vector<16xi1>, vector<16xf32> 67 return 68} 69 70// CHECK-LABEL: func @maskedstore2( 71// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 72// CHECK-SAME: %[[A1:.*]]: vector<16xf32>) { 73// CHECK-NEXT: return 74func.func @maskedstore2(%base: memref<16xf32>, %value: vector<16xf32>) { 75 %c0 = arith.constant 0 : index 76 %mask = vector.constant_mask [0] : vector<16xi1> 77 vector.maskedstore %base[%c0], %mask, %value : memref<16xf32>, vector<16xi1>, vector<16xf32> 78 return 79} 80 81// CHECK-LABEL: func @gather1( 82// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 83// CHECK-SAME: %[[A1:.*]]: vector<16xi32>, 84// CHECK-SAME: %[[A2:.*]]: vector<16xf32>) -> vector<16xf32> { 85// CHECK-NEXT: %[[C:.*]] = arith.constant 0 : index 86// CHECK-NEXT: %[[M:.*]] = vector.constant_mask [16] : vector<16xi1> 87// CHECK-NEXT: %[[G:.*]] = vector.gather %[[A0]][%[[C]]] [%[[A1]]], %[[M]], %[[A2]] : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32> into vector<16xf32> 88// CHECK-NEXT: return %[[G]] : vector<16xf32> 89func.func @gather1(%base: memref<16xf32>, %indices: vector<16xi32>, %pass_thru: vector<16xf32>) -> vector<16xf32> { 90 %c0 = arith.constant 0 : index 91 %mask = vector.constant_mask [16] : vector<16xi1> 92 %ld = vector.gather %base[%c0][%indices], %mask, %pass_thru 93 : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32> into vector<16xf32> 94 return %ld : vector<16xf32> 95} 96 97// CHECK-LABEL: func @gather2( 98// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 99// CHECK-SAME: %[[A1:.*]]: vector<16xi32>, 100// CHECK-SAME: %[[A2:.*]]: vector<16xf32>) -> vector<16xf32> { 101// CHECK-NEXT: return %[[A2]] : vector<16xf32> 102func.func @gather2(%base: memref<16xf32>, %indices: vector<16xi32>, %pass_thru: vector<16xf32>) -> vector<16xf32> { 103 %c0 = arith.constant 0 : index 104 %mask = vector.constant_mask [0] : vector<16xi1> 105 %ld = vector.gather %base[%c0][%indices], %mask, %pass_thru 106 : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32> into vector<16xf32> 107 return %ld : vector<16xf32> 108} 109 110// CHECK-LABEL: func @scatter1( 111// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 112// CHECK-SAME: %[[A1:.*]]: vector<16xi32>, 113// CHECK-SAME: %[[A2:.*]]: vector<16xf32>) { 114// CHECK-NEXT: %[[C:.*]] = arith.constant 0 : index 115// CHECK-NEXT: %[[M:.*]] = vector.constant_mask [16] : vector<16xi1> 116// CHECK-NEXT: vector.scatter %[[A0]][%[[C]]] [%[[A1]]], %[[M]], %[[A2]] : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32> 117// CHECK-NEXT: return 118func.func @scatter1(%base: memref<16xf32>, %indices: vector<16xi32>, %value: vector<16xf32>) { 119 %c0 = arith.constant 0 : index 120 %mask = vector.constant_mask [16] : vector<16xi1> 121 vector.scatter %base[%c0][%indices], %mask, %value 122 : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32> 123 return 124} 125 126// CHECK-LABEL: func @scatter2( 127// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 128// CHECK-SAME: %[[A1:.*]]: vector<16xi32>, 129// CHECK-SAME: %[[A2:.*]]: vector<16xf32>) { 130// CHECK-NEXT: return 131func.func @scatter2(%base: memref<16xf32>, %indices: vector<16xi32>, %value: vector<16xf32>) { 132 %c0 = arith.constant 0 : index 133 %0 = vector.type_cast %base : memref<16xf32> to memref<vector<16xf32>> 134 %mask = vector.constant_mask [0] : vector<16xi1> 135 vector.scatter %base[%c0][%indices], %mask, %value 136 : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32> 137 return 138} 139 140// CHECK-LABEL: func @expand1( 141// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 142// CHECK-SAME: %[[A1:.*]]: vector<16xf32>) -> vector<16xf32> { 143// CHECK-DAG: %[[C:.*]] = arith.constant 0 : index 144// CHECK-NEXT: %[[T:.*]] = vector.load %[[A0]][%[[C]]] : memref<16xf32>, vector<16xf32> 145// CHECK-NEXT: return %[[T]] : vector<16xf32> 146func.func @expand1(%base: memref<16xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> { 147 %c0 = arith.constant 0 : index 148 %mask = vector.constant_mask [16] : vector<16xi1> 149 %ld = vector.expandload %base[%c0], %mask, %pass_thru 150 : memref<16xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32> 151 return %ld : vector<16xf32> 152} 153 154// CHECK-LABEL: func @expand2( 155// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 156// CHECK-SAME: %[[A1:.*]]: vector<16xf32>) -> vector<16xf32> { 157// CHECK-NEXT: return %[[A1]] : vector<16xf32> 158func.func @expand2(%base: memref<16xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> { 159 %c0 = arith.constant 0 : index 160 %mask = vector.constant_mask [0] : vector<16xi1> 161 %ld = vector.expandload %base[%c0], %mask, %pass_thru 162 : memref<16xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32> 163 return %ld : vector<16xf32> 164} 165 166// CHECK-LABEL: func @compress1( 167// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 168// CHECK-SAME: %[[A1:.*]]: vector<16xf32>) { 169// CHECK-NEXT: %[[C:.*]] = arith.constant 0 : index 170// CHECK-NEXT: vector.store %[[A1]], %[[A0]][%[[C]]] : memref<16xf32>, vector<16xf32> 171// CHECK-NEXT: return 172func.func @compress1(%base: memref<16xf32>, %value: vector<16xf32>) { 173 %c0 = arith.constant 0 : index 174 %mask = vector.constant_mask [16] : vector<16xi1> 175 vector.compressstore %base[%c0], %mask, %value : memref<16xf32>, vector<16xi1>, vector<16xf32> 176 return 177} 178 179// CHECK-LABEL: func @compress2( 180// CHECK-SAME: %[[A0:.*]]: memref<16xf32>, 181// CHECK-SAME: %[[A1:.*]]: vector<16xf32>) { 182// CHECK-NEXT: return 183func.func @compress2(%base: memref<16xf32>, %value: vector<16xf32>) { 184 %c0 = arith.constant 0 : index 185 %mask = vector.constant_mask [0] : vector<16xi1> 186 vector.compressstore %base[%c0], %mask, %value : memref<16xf32>, vector<16xi1>, vector<16xf32> 187 return 188} 189