blob: 5a5f280818c296ddfb004c0288097f48cb537bb3 [file] [edit]
// Copyright 2024 The IREE Authors
//
// Licensed 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
//===--- FusionUtils.h --- Utility functions used in fusion ---------------===//
//
// Utility functions to decide of ops are fusable or not, etc.
//
//===----------------------------------------------------------------------===//
#include <cstdint>
#include "mlir/IR/Operation.h"
#include "mlir/IR/PatternMatch.h"
namespace mlir::iree_compiler::DispatchCreation {
// Maximum number of operands/bindings allowed for a dispatch region.
// This is constrained by the most restrictive GPU backends (CUDA, HIP/ROCm,
// Metal) which all have a limit of 16 bindings. See:
// - IREE_HAL_CUDA_MAX_DISPATCH_BINDING_COUNT = 16
// - IREE_HAL_HIP_MAX_DISPATCH_BINDING_COUNT = 16
constexpr int64_t kIreeMaxOperandCount = 16;
/// Return true of the producer and consumer of `operand` are fusable
/// using elementwise op fusion transformation.
struct ElementwiseOpsFusabilityOptions {
// Control fusion with consumer that has multiple reduction dimensions.
bool fuseMultiReduction = false;
// Control fusion with producer that is a truncate-like operation.
bool fuseTruncateOps = false;
// Control fusion with a consumer that is broadcast-like.
bool fuseBroadcastConsumers = false;
};
bool areFusableAsElementwiseOps(MLIRContext *context, OpOperand *operand,
ElementwiseOpsFusabilityOptions options);
/// Returns the closest producer dispatch region op result and the chain of
/// operations being looked past during the traversal to find the producer
/// dispatch. Returns std::nullopt if the dispatch can not be found in the
/// chain or any op in the chain is not a reshape-like op.
std::optional<std::pair<OpResult, SmallVector<Operation *>>>
getProducerDispatchValueAndOpChain(Value operand,
bool enableAggressiveFusion = false);
} // namespace mlir::iree_compiler::DispatchCreation