forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refactor GenericPadTensorOpVectorizationPattern
Refactor the original code to rewrite a PadTensorOp into a sequence of InitTensorOp, FillOp and InsertSliceOp without vectorization by default. `GenericPadTensorOpVectorizationPattern` provides a customized OptimizeCopyFn to vectorize the copying step. Reviewed By: silvas, nicolasvasilache, springerm Differential Revision: https://reviews.llvm.org/D105293
- Loading branch information
1 parent
9a0af63
commit 35df2f6
Showing
7 changed files
with
209 additions
and
95 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
// RUN: mlir-opt -split-input-file --test-linalg-transform-patterns="test-generalize-pad-tensor" %s | FileCheck --check-prefix=CHECK %s | ||
|
||
// CHECK-LABEL: func @generalize_pad_tensor_static_shape( | ||
// CHECK-SAME: %[[IN:.*]]: tensor<1x28x28x1xf32>) -> tensor<1x32x32x1xf32> { | ||
// CHECK: %[[C0:.*]] = constant 0.000000e+00 : f32 | ||
// CHECK: %[[INIT:.*]] = linalg.init_tensor [1, 32, 32, 1] : tensor<1x32x32x1xf32> | ||
// CHECK: %[[FILL:.*]] = linalg.fill(%[[C0]], %[[INIT]]) : f32, tensor<1x32x32x1xf32> -> tensor<1x32x32x1xf32> | ||
// CHECK: %[[PADDED:.*]] = tensor.insert_slice %[[IN]] into %[[FILL]][0, 2, 2, 0] [1, 28, 28, 1] [1, 1, 1, 1] : tensor<1x28x28x1xf32> into tensor<1x32x32x1xf32> | ||
// CHECK: return %[[PADDED]] : tensor<1x32x32x1xf32> | ||
func @generalize_pad_tensor_static_shape(%arg0: tensor<1x28x28x1xf32>) -> tensor<1x32x32x1xf32> { | ||
%cst = constant 0.000000e+00 : f32 | ||
%0 = linalg.pad_tensor %arg0 low[0, 2, 2, 0] high[0, 2, 2, 0] { | ||
^bb0(%arg1: index, %arg2: index, %arg3: index, %arg4: index): // no predecessors | ||
linalg.yield %cst : f32 | ||
} : tensor<1x28x28x1xf32> to tensor<1x32x32x1xf32> | ||
return %0 : tensor<1x32x32x1xf32> | ||
} | ||
|
||
// CHECK-LABEL: func @generalize_pad_tensor_dynamic_shape( | ||
// CHECK-SAME: %[[IN:.*]]: tensor<4x?x2x?xf32>, | ||
// CHECK-SAME: %[[OFFSET:.*]]: index) -> tensor<4x?x?x?xf32> { | ||
// CHECK: %[[C0:.*]] = constant 0 : index | ||
// CHECK: %[[CST:.*]] = constant 0.000000e+00 : f32 | ||
// CHECK: %[[C2:.*]] = constant 2 : index | ||
// CHECK: %[[C1:.*]] = constant 1 : index | ||
// CHECK: %[[C3:.*]] = constant 3 : index | ||
// CHECK: %[[DIM1:.*]] = tensor.dim %[[IN]], %[[C1]] : tensor<4x?x2x?xf32> | ||
// CHECK: %[[OUT_DIM2:.*]] = addi %[[OFFSET]], %[[C2]] : index | ||
// CHECK: %[[DIM3:.*]] = tensor.dim %[[IN]], %[[C3]] : tensor<4x?x2x?xf32> | ||
// CHECK: %[[OUT_DIM3:.*]] = addi %[[DIM3]], %[[OFFSET]] : index | ||
// CHECK: %[[INIT:.*]] = linalg.init_tensor [4, %[[DIM1]], %[[OUT_DIM2]], %[[OUT_DIM3]]] : tensor<4x?x?x?xf32> | ||
// CHECK: %[[FILL:.*]] = linalg.fill(%[[CST]], %[[INIT]]) : f32, tensor<4x?x?x?xf32> -> tensor<4x?x?x?xf32> | ||
// CHECK: %[[DIM1_1:.*]] = tensor.dim %[[IN]], %[[C1]] : tensor<4x?x2x?xf32> | ||
// CHECK: %[[DIM3_1:.*]] = tensor.dim %[[IN]], %[[C3]] : tensor<4x?x2x?xf32> | ||
// CHECK: %[[PADDED:.*]] = tensor.insert_slice %[[IN]] into %[[FILL]]{{\[}}%[[C0]], %[[C0]], %[[OFFSET]], %[[C0]]] [4, %[[DIM1_1]], 2, %[[DIM3_1]]] [1, 1, 1, 1] : tensor<4x?x2x?xf32> into tensor<4x?x?x?xf32> | ||
// CHECK: return %[[PADDED]] : tensor<4x?x?x?xf32> | ||
// CHECK: } | ||
func @generalize_pad_tensor_dynamic_shape(%arg0: tensor<4x?x2x?xf32>, %arg1: index) -> tensor<4x?x?x?xf32> { | ||
%c0 = constant 0 : index | ||
%cst = constant 0.0 : f32 | ||
%out = linalg.pad_tensor %arg0 low[%c0, %c0, %arg1, %c0] high[%c0, %c0, %c0, %arg1] { | ||
^bb0(%gen_arg1: index, %gen_arg2: index, %gen_arg3: index, %gen_arg4: index): // no predecessors | ||
linalg.yield %cst : f32 | ||
} : tensor<4x?x2x?xf32> to tensor<4x?x?x?xf32> | ||
return %out : tensor<4x?x?x?xf32> | ||
} |
33 changes: 33 additions & 0 deletions
33
mlir/test/Integration/Dialect/Linalg/CPU/test-padtensor.mlir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// RUN: mlir-opt %s -linalg-bufferize -std-bufferize \ | ||
// RUN: -tensor-constant-bufferize -tensor-bufferize -func-bufferize \ | ||
// RUN: -finalizing-bufferize \ | ||
// RUN: -convert-linalg-to-loops -convert-scf-to-std -convert-linalg-to-llvm -convert-std-to-llvm | \ | ||
// RUN: mlir-cpu-runner -e main -entry-point-result=void \ | ||
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \ | ||
// RUN: | FileCheck %s | ||
|
||
|
||
func @main() { | ||
%const = constant dense<[[[1.0, 2.0, 3.0], [2.0, 3.0, 4.0]]]> : tensor<1x2x3xf32> | ||
%dynamic = tensor.cast %const: tensor<1x2x3xf32> to tensor<1x?x3xf32> | ||
%offset = constant 2 : index | ||
%cst = constant 2.3 : f32 | ||
%c0 = constant 0 : index | ||
%out = linalg.pad_tensor %dynamic low[%c0, %offset, %c0] high[%c0, %c0, %offset] { | ||
^bb0(%gen_arg1: index, %gen_arg2: index, %gen_arg3: index): // no predecessors | ||
linalg.yield %cst : f32 | ||
} : tensor<1x?x3xf32> to tensor<1x?x?xf32> | ||
%unranked = tensor.cast %out: tensor<1x?x?xf32> to tensor<*xf32> | ||
call @print_memref_f32(%unranked) : (tensor<*xf32>) -> () | ||
|
||
// CHECK: Unranked Memref base@ = {{0x[-9a-f]*}} | ||
// CHECK-SAME: rank = 3 offset = 0 sizes = [1, 4, 5] strides = [20, 5, 1] data = | ||
// CHECK-NEXT{LITERAL}: [[[2.3, 2.3, 2.3, 2.3, 2.3], | ||
// CHECK-NEXT: [2.3, 2.3, 2.3, 2.3, 2.3], | ||
// CHECK-NEXT: [1, 2, 3, 2.3, 2.3], | ||
// CHECK-NEXT: [2, 3, 4, 2.3, 2.3]]] | ||
|
||
return | ||
} | ||
|
||
func private @print_memref_f32(%ptr : tensor<*xf32>) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters