blob: bf88f28215c40395c6d53e413ab5ac42c3e1c126 [file]
// Copyright 2023 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
#ifndef IREE_COMPILER_CODEGEN_LLVMCPU_UTILS_H_
#define IREE_COMPILER_CODEGEN_LLVMCPU_UTILS_H_
#include "iree/compiler/Codegen/Utils/Utils.h"
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
namespace mlir::iree_compiler {
bool preferIntrinsicsOverAsm(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the 'targetAttr' contains '+avx2' in its cpu features.
bool hasAVX2Feature(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the 'targetAttr' contains '+avx512f' in its cpu features.
bool hasAVX512fFeature(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the 'targetAttr' contains '+v' in its cpu features.
bool hasVFeature(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the 'targetAttr' contains '+zve32x' in its cpu features.
bool hasZve32xFeature(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the 'targetAttr' contains '+zve32f' in its cpu features.
bool hasZve32fFeature(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the 'targetAttr' contains '+zve64x' in its cpu features.
bool hasZve64xFeature(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the 'targetAttr' contains any riscv vector feature in its
/// cpu features.
bool hasAnyVFeature(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the 'targetAttr' contains '+sve' or '+sve2' in its cpu
/// features or any other feature flag that includes them.
bool hasAnySVEFeature(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the 'targetAttr' contains '+sme' in its cpu features.
bool hasSMEFeature(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the 'targetAttr' contains '+i8mm' in its cpu features.
bool hasI8mmFeature(IREE::HAL::ExecutableTargetAttr targetAttr);
/// Returns true if the `genericOp` is a simple 2D transpose, i.e.,
///
/// 1. The op has 2 dimensions.
/// 2. The op has a single input and a single output.
/// 3. One of the `indexing_maps` is a permutation and the other an identity.
/// 4. The body of the generic has a single yield op returning the block
/// argument corresponding to the input.
bool isLinalgGeneric2DTranspose(linalg::GenericOp genericOp);
/// Returns true if the op could result in undefined behavior.
bool mayHaveUndefinedBehaviorInMasking(Operation *op);
} // namespace mlir::iree_compiler
#endif // IREE_COMPILER_CODEGEN_LLVMCPU_UTILS_H_