This commit implements runtime verification for LinalgStructuredOps using the existing `RuntimeVerifiableOpInterface`. The verification checks that the runtime sizes of the operands match the runtime sizes inferred by composing the loop ranges with the op's indexing maps.
44 lines
1.5 KiB
MLIR
44 lines
1.5 KiB
MLIR
// RUN: mlir-opt %s -generate-runtime-verification | FileCheck %s
|
|
|
|
// Most of the tests for linalg runtime-verification are implemented as integration tests.
|
|
|
|
#identity = affine_map<(d0) -> (d0)>
|
|
|
|
// CHECK-LABEL: @static_dims
|
|
func.func @static_dims(%arg0: tensor<5xf32>, %arg1: tensor<5xf32>) -> (tensor<5xf32>) {
|
|
// CHECK: %[[TRUE:.*]] = index.bool.constant true
|
|
// CHECK: cf.assert %[[TRUE]]
|
|
%result = tensor.empty() : tensor<5xf32>
|
|
%0 = linalg.generic {
|
|
indexing_maps = [#identity, #identity, #identity],
|
|
iterator_types = ["parallel"]
|
|
} ins(%arg0, %arg1 : tensor<5xf32>, tensor<5xf32>)
|
|
outs(%result : tensor<5xf32>) {
|
|
^bb0(%gen_arg1: f32, %gen_arg2: f32, %out: f32) :
|
|
%tmp1 = arith.addf %gen_arg1, %gen_arg2 : f32
|
|
linalg.yield %tmp1 : f32
|
|
} -> tensor<5xf32>
|
|
return %0 : tensor<5xf32>
|
|
}
|
|
|
|
// -----
|
|
|
|
#map = affine_map<() -> ()>
|
|
|
|
// CHECK-LABEL: @scalars
|
|
func.func @scalars(%arg0: tensor<f32>, %arg1: tensor<f32>) -> (tensor<f32>) {
|
|
// No runtime checks are required if the operands are all scalars
|
|
// CHECK-NOT: cf.assert
|
|
%result = tensor.empty() : tensor<f32>
|
|
%0 = linalg.generic {
|
|
indexing_maps = [#map, #map, #map],
|
|
iterator_types = []
|
|
} ins(%arg0, %arg1 : tensor<f32>, tensor<f32>)
|
|
outs(%result : tensor<f32>) {
|
|
^bb0(%gen_arg1: f32, %gen_arg2: f32, %out: f32) :
|
|
%tmp1 = arith.addf %gen_arg1, %gen_arg2 : f32
|
|
linalg.yield %tmp1 : f32
|
|
} -> tensor<f32>
|
|
return %0 : tensor<f32>
|
|
}
|