|  | //===-- Passes.td - Transforms pass definition file --------*- tablegen -*-===// | 
|  | // | 
|  | // Part of the MPACT Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file contains definitions for passes within the Transforms/ directory. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef MPACT_TRANSFORMS_PASSES | 
|  | #define MPACT_TRANSFORMS_PASSES | 
|  |  | 
|  | include "mlir/Pass/PassBase.td" | 
|  |  | 
|  | def SparseEncodingPropagation : Pass<"sparse-encoding-propagation", "func::FuncOp"> { | 
|  | let summary = "Propagate sparse tensor encodings"; | 
|  | let description = [{ | 
|  | A pass that propagates sparse tensor encodings. | 
|  |  | 
|  | Background: To avoid introducing repetitive operations, sparse tensors | 
|  | in MLIR try to reuse tensor operations whenever available. However, most | 
|  | tensor operations are canonicalized/transformed without the knowledge | 
|  | of sparsity. The pass tries to propagate missing sparse encodings. | 
|  |  | 
|  | For example: | 
|  | ```mlir | 
|  | %s = tensor.extract_slice %input[0, 0,] [2, 1] [1, 1] | 
|  | : tensor<2x3xf32, #sparse> to tensor<2x1xf32, #sparse> | 
|  |  | 
|  | // After rank reducing (by tensor dialect transformation) | 
|  | %t = tensor.extract_slice %input[0, 0,] [2, 1] [1, 1] | 
|  | : tensor<2x3xf32, #sparse> to tensor<2xf32> | 
|  | %s = tensor.expand_shape [[0, 1]] %t | 
|  | : tensor<2xf32> to tensor<2x1xf32, #sparse> | 
|  |  | 
|  | // After sparsity propagation | 
|  | %t = tensor.extract_slice %input[0, 0,] [2, 1] [1, 1] | 
|  | : tensor<2x3xf32, #sparse> to tensor<2xf32, #sparse1> | 
|  | %s = tensor.expand_shape [[0, 1]] %t | 
|  | : tensor<2xf32, #sparse1> to tensor<2x1xf32, #sparse> | 
|  | ``` | 
|  | }]; | 
|  |  | 
|  | let constructor = "mlir::mpact::createSparseEncodingPropagationPass()"; | 
|  | let dependentDialects = []; | 
|  | } | 
|  |  | 
|  | #endif // MPACT_TRANSFORMS_PASSES |