217 lines · plain
1// RUN: mlir-opt %s -test-vector-to-vector-lowering | FileCheck %s2 3//-----------------------------------------------------------------------------4// [Pattern: MaskedLoadFolder]5//-----------------------------------------------------------------------------6 7// CHECK-LABEL: func @fold_maskedload_all_true_dynamic(8// CHECK-SAME: %[[BASE:.*]]: memref<?xf32>,9// CHECK-SAME: %[[PASS_THRU:.*]]: vector<16xf32>) -> vector<16xf32> {10// CHECK-DAG: %[[IDX:.*]] = arith.constant 0 : index11// CHECK-NEXT: %[[LOAD:.*]] = vector.load %[[BASE]][%[[IDX]]] : memref<?xf32>, vector<16xf32>12// CHECK-NEXT: return %[[LOAD]] : vector<16xf32>13func.func @fold_maskedload_all_true_dynamic(%base: memref<?xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> {14 %c0 = arith.constant 0 : index15 %mask = vector.constant_mask [16] : vector<16xi1>16 %ld = vector.maskedload %base[%c0], %mask, %pass_thru17 : memref<?xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32>18 return %ld : vector<16xf32>19}20 21// CHECK-LABEL: func @fold_maskedload_all_true_static(22// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,23// CHECK-SAME: %[[PASS_THRU:.*]]: vector<16xf32>) -> vector<16xf32> {24// CHECK-DAG: %[[IDX:.*]] = arith.constant 0 : index25// CHECK-NEXT: %[[LOAD:.*]] = vector.load %[[BASE]][%[[IDX]]] : memref<16xf32>, vector<16xf32>26// CHECK-NEXT: return %[[LOAD]] : vector<16xf32>27func.func @fold_maskedload_all_true_static(%base: memref<16xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> {28 %c0 = arith.constant 0 : index29 %mask = vector.constant_mask [16] : vector<16xi1>30 %ld = vector.maskedload %base[%c0], %mask, %pass_thru31 : memref<16xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32>32 return %ld : vector<16xf32>33}34 35// CHECK-LABEL: func @fold_maskedload_all_false_static(36// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,37// CHECK-SAME: %[[PASS_THRU:.*]]: vector<16xf32>) -> vector<16xf32> {38// CHECK-NEXT: return %[[PASS_THRU]] : vector<16xf32>39func.func @fold_maskedload_all_false_static(%base: memref<16xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> {40 %c0 = arith.constant 0 : index41 %mask = vector.constant_mask [0] : vector<16xi1>42 %ld = vector.maskedload %base[%c0], %mask, %pass_thru43 : memref<16xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32>44 return %ld : vector<16xf32>45}46 47// CHECK-LABEL: func @fold_maskedload_dynamic_non_zero_idx(48// CHECK-SAME: %[[BASE:.*]]: memref<?xf32>,49// CHECK-SAME: %[[PASS_THRU:.*]]: vector<16xf32>) -> vector<16xf32> {50// CHECK-DAG: %[[IDX:.*]] = arith.constant 8 : index51// CHECK-NEXT: %[[LOAD:.*]] = vector.load %[[BASE]][%[[IDX]]] : memref<?xf32>, vector<16xf32>52// CHECK-NEXT: return %[[LOAD]] : vector<16xf32>53func.func @fold_maskedload_dynamic_non_zero_idx(%base: memref<?xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> {54 %c8 = arith.constant 8 : index55 %mask = vector.constant_mask [16] : vector<16xi1>56 %ld = vector.maskedload %base[%c8], %mask, %pass_thru57 : memref<?xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32>58 return %ld : vector<16xf32>59}60 61//-----------------------------------------------------------------------------62// [Pattern: MaskedStoreFolder]63//-----------------------------------------------------------------------------64 65// CHECK-LABEL: func @fold_maskedstore_all_true(66// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,67// CHECK-SAME: %[[VALUE:.*]]: vector<16xf32>) {68// CHECK-NEXT: %[[IDX:.*]] = arith.constant 0 : index69// CHECK-NEXT: vector.store %[[VALUE]], %[[BASE]][%[[IDX]]] : memref<16xf32>, vector<16xf32>70// CHECK-NEXT: return71func.func @fold_maskedstore_all_true(%base: memref<16xf32>, %value: vector<16xf32>) {72 %c0 = arith.constant 0 : index73 %mask = vector.constant_mask [16] : vector<16xi1>74 vector.maskedstore %base[%c0], %mask, %value : memref<16xf32>, vector<16xi1>, vector<16xf32>75 return76}77 78// CHECK-LABEL: func @fold_maskedstore_all_false(79// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,80// CHECK-SAME: %[[VALUE:.*]]: vector<16xf32>) {81// CHECK-NEXT: return82func.func @fold_maskedstore_all_false(%base: memref<16xf32>, %value: vector<16xf32>) {83 %c0 = arith.constant 0 : index84 %mask = vector.constant_mask [0] : vector<16xi1>85 vector.maskedstore %base[%c0], %mask, %value : memref<16xf32>, vector<16xi1>, vector<16xf32>86 return87}88 89//-----------------------------------------------------------------------------90// [Pattern: GatherFolder]91//-----------------------------------------------------------------------------92 93/// There is no alternative (i.e. simpler) Op for this, hence no-fold.94 95// CHECK-LABEL: func @no_fold_gather_all_true(96// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,97// CHECK-SAME: %[[INDICES:.*]]: vector<16xi32>,98// CHECK-SAME: %[[PASS_THRU:.*]]: vector<16xf32>) -> vector<16xf32> {99// CHECK-NEXT: %[[C:.*]] = arith.constant 0 : index100// CHECK-NEXT: %[[M:.*]] = arith.constant dense<true> : vector<16xi1>101// CHECK-NEXT: %[[G:.*]] = vector.gather %[[BASE]][%[[C]]] [%[[INDICES]]], %[[M]], %[[PASS_THRU]] : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32> into vector<16xf32>102// CHECK-NEXT: return %[[G]] : vector<16xf32>103func.func @no_fold_gather_all_true(%base: memref<16xf32>, %indices: vector<16xi32>, %pass_thru: vector<16xf32>) -> vector<16xf32> {104 %c0 = arith.constant 0 : index105 %mask = vector.constant_mask [16] : vector<16xi1>106 %ld = vector.gather %base[%c0][%indices], %mask, %pass_thru107 : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32> into vector<16xf32>108 return %ld : vector<16xf32>109}110 111// CHECK-LABEL: func @fold_gather_all_true(112// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,113// CHECK-SAME: %[[INDICES:.*]]: vector<16xi32>,114// CHECK-SAME: %[[PASS_THRU:.*]]: vector<16xf32>) -> vector<16xf32> {115// CHECK-NEXT: return %[[PASS_THRU]] : vector<16xf32>116func.func @fold_gather_all_true(%base: memref<16xf32>, %indices: vector<16xi32>, %pass_thru: vector<16xf32>) -> vector<16xf32> {117 %c0 = arith.constant 0 : index118 %mask = vector.constant_mask [0] : vector<16xi1>119 %ld = vector.gather %base[%c0][%indices], %mask, %pass_thru120 : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32> into vector<16xf32>121 return %ld : vector<16xf32>122}123 124//-----------------------------------------------------------------------------125// [Pattern: ScatterFolder]126//-----------------------------------------------------------------------------127 128/// There is no alternative (i.e. simpler) Op for this, hence no-fold.129 130// CHECK-LABEL: func @no_fold_scatter_all_true(131// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,132// CHECK-SAME: %[[INDICES:.*]]: vector<16xi32>,133// CHECK-SAME: %[[VALUE:.*]]: vector<16xf32>) {134// CHECK-NEXT: %[[C:.*]] = arith.constant 0 : index135// CHECK-NEXT: %[[M:.*]] = arith.constant dense<true> : vector<16xi1>136// CHECK-NEXT: vector.scatter %[[BASE]][%[[C]]] [%[[INDICES]]], %[[M]], %[[VALUE]] : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32>137// CHECK-NEXT: return138func.func @no_fold_scatter_all_true(%base: memref<16xf32>, %indices: vector<16xi32>, %value: vector<16xf32>) {139 %c0 = arith.constant 0 : index140 %mask = vector.constant_mask [16] : vector<16xi1>141 vector.scatter %base[%c0][%indices], %mask, %value142 : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32>143 return144}145 146// CHECK-LABEL: func @fold_scatter_all_false(147// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,148// CHECK-SAME: %[[INDICES:.*]]: vector<16xi32>,149// CHECK-SAME: %[[VALUE:.*]]: vector<16xf32>) {150// CHECK-NEXT: return151func.func @fold_scatter_all_false(%base: memref<16xf32>, %indices: vector<16xi32>, %value: vector<16xf32>) {152 %c0 = arith.constant 0 : index153 %0 = vector.type_cast %base : memref<16xf32> to memref<vector<16xf32>>154 %mask = vector.constant_mask [0] : vector<16xi1>155 vector.scatter %base[%c0][%indices], %mask, %value156 : memref<16xf32>, vector<16xi32>, vector<16xi1>, vector<16xf32>157 return158}159 160//-----------------------------------------------------------------------------161// [Pattern: ExpandLoadFolder]162//-----------------------------------------------------------------------------163 164// CHECK-LABEL: func @fold_expandload_all_true(165// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,166// CHECK-SAME: %[[PASS_THRU:.*]]: vector<16xf32>) -> vector<16xf32> {167// CHECK-DAG: %[[C:.*]] = arith.constant 0 : index168// CHECK-NEXT: %[[T:.*]] = vector.load %[[BASE]][%[[C]]] : memref<16xf32>, vector<16xf32>169// CHECK-NEXT: return %[[T]] : vector<16xf32>170func.func @fold_expandload_all_true(%base: memref<16xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> {171 %c0 = arith.constant 0 : index172 %mask = vector.constant_mask [16] : vector<16xi1>173 %ld = vector.expandload %base[%c0], %mask, %pass_thru174 : memref<16xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32>175 return %ld : vector<16xf32>176}177 178// CHECK-LABEL: func @fold_expandload_all_false(179// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,180// CHECK-SAME: %[[PASS_THRU:.*]]: vector<16xf32>) -> vector<16xf32> {181// CHECK-NEXT: return %[[PASS_THRU]] : vector<16xf32>182func.func @fold_expandload_all_false(%base: memref<16xf32>, %pass_thru: vector<16xf32>) -> vector<16xf32> {183 %c0 = arith.constant 0 : index184 %mask = vector.constant_mask [0] : vector<16xi1>185 %ld = vector.expandload %base[%c0], %mask, %pass_thru186 : memref<16xf32>, vector<16xi1>, vector<16xf32> into vector<16xf32>187 return %ld : vector<16xf32>188}189 190//-----------------------------------------------------------------------------191// [Pattern: CompressStoreFolder]192//-----------------------------------------------------------------------------193 194// CHECK-LABEL: func @fold_compressstore_all_true(195// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,196// CHECK-SAME: %[[VALUE:.*]]: vector<16xf32>) {197// CHECK-NEXT: %[[C:.*]] = arith.constant 0 : index198// CHECK-NEXT: vector.store %[[VALUE]], %[[BASE]][%[[C]]] : memref<16xf32>, vector<16xf32>199// CHECK-NEXT: return200func.func @fold_compressstore_all_true(%base: memref<16xf32>, %value: vector<16xf32>) {201 %c0 = arith.constant 0 : index202 %mask = vector.constant_mask [16] : vector<16xi1>203 vector.compressstore %base[%c0], %mask, %value : memref<16xf32>, vector<16xi1>, vector<16xf32>204 return205}206 207// CHECK-LABEL: func @fold_compressstore_all_false(208// CHECK-SAME: %[[BASE:.*]]: memref<16xf32>,209// CHECK-SAME: %[[VALUE:.*]]: vector<16xf32>) {210// CHECK-NEXT: return211func.func @fold_compressstore_all_false(%base: memref<16xf32>, %value: vector<16xf32>) {212 %c0 = arith.constant 0 : index213 %mask = vector.constant_mask [0] : vector<16xi1>214 vector.compressstore %base[%c0], %mask, %value : memref<16xf32>, vector<16xi1>, vector<16xf32>215 return216}217