| // Copyright 2019 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| // Utilities for dispatch region and function manipulation. |
| // These are shared between all dispatchable types such as the standard |
| // iree.dispatch_region as well as dispatch-related types like |
| // iree.reduction_region. |
| |
| #ifndef THIRD_PARTY_MLIR_EDGE_IREE_COMPILER_UTILS_DISPATCHUTILS_H_ |
| #define THIRD_PARTY_MLIR_EDGE_IREE_COMPILER_UTILS_DISPATCHUTILS_H_ |
| |
| #include <utility> |
| |
| #include "third_party/llvm/llvm/include/llvm/ADT/ArrayRef.h" |
| #include "third_party/llvm/llvm/projects/google_mlir/include/mlir/IR/Builders.h" |
| #include "third_party/llvm/llvm/projects/google_mlir/include/mlir/IR/Function.h" |
| #include "third_party/llvm/llvm/projects/google_mlir/include/mlir/IR/Operation.h" |
| #include "third_party/llvm/llvm/projects/google_mlir/include/mlir/IR/StandardTypes.h" |
| #include "third_party/llvm/llvm/projects/google_mlir/include/mlir/IR/Value.h" |
| #include "third_party/mlir_edge/iree/compiler/IR/Ops.h" |
| #include "third_party/mlir_edge/iree/compiler/IR/StructureOps.h" |
| |
| namespace mlir { |
| namespace iree_compiler { |
| |
| // Calculates the workload for |op| based on the op type. |
| Value *calculateWorkload(Operation *op, Value *baseOperand); |
| |
| // Returns true if the func is trivially dispatchable, meaning that: |
| // - it contains a single block |
| // - it contains a single dispatch region |
| // - it contains a return op directly returning the dispatch region results |
| bool isTriviallyDispatchable(FuncOp func); |
| |
| // Builds a new iree.dispatch_region with the given |ops|. |
| // The region will capture all required values and return all values used |
| // outside of the |ops| provided. The region will be inserted at the location of |
| // the last operation in the set. |
| // |
| // All |ops| must be compatible with the |workload| specified as they will all |
| // be dispatched with the same workgroup structure. |
| // TODO(benvanik): ensure we want to insert at end. Maybe front? |
| LogicalResult buildDispatchRegion(FuncOp func, Block *parentBlock, |
| Value *workload, ArrayRef<Operation *> ops); |
| |
| // Merges multiple dispatch regions within a block into the same region, |
| // if possible. Operations may be reordered if it's possible to merge more while |
| // still obeying data dependencies. |
| LogicalResult mergeBlockDispatchRegions(FuncOp func, Block *parentBlock); |
| |
| // Inlines use of the given |value| from outside of a dispatch region to inside |
| // of it and removes the argument. Supports multiple arguments that reference |
| // |value| and will clone the entire value tree. |
| LogicalResult inlineDispatchRegionOperandsUsingValue( |
| IREE::DispatchRegionOp dispatchRegionOp, Value *value); |
| |
| // Creates an iree.multi_arch_executable containing an iree.executable with an |
| // exported function containing the body region of |op|. Created executables |
| // will be named for their original function concatenated with |symbolSuffix|. |
| std::pair<IREE::MultiArchExecutableOp, FuncOp> createRegionExecutable( |
| Operation *op, FunctionType functionType, StringRef symbolSuffix); |
| |
| // Inserts a conversion of an arbitrary |value| to a memref, possibly by way of |
| // wrapping in an allocation. |
| // Returns a new memref containing the value or an alias to |value|. |
| Value *insertDispatcherStore(Operation *op, Value *value, OpBuilder *builder); |
| |
| // Inserts a load from a wrapped memref. |
| // Returns the value in the original type or an alias to the |value| memref. |
| Value *insertDispatcherLoad(Operation *op, Value *originalValue, |
| Value *allocatedValue, OpBuilder *builder); |
| |
| // TODO(benvanik): enough information to walk into dispatch region and compute |
| // shape when not static. |
| Value *allocateDispatchOutputBuffer(Location loc, MemRefType type, |
| OpBuilder &builder); |
| |
| } // namespace iree_compiler |
| } // namespace mlir |
| |
| #endif // THIRD_PARTY_MLIR_EDGE_IREE_COMPILER_UTILS_DISPATCHUTILS_H_ |