brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.0 KiB · 2004a47 Raw
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