MLIR
20.0.0git
|
#include "mlir/Conversion/MathToFuncs/MathToFuncs.h"
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
#include "mlir/Dialect/Func/IR/FuncOps.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
#include "mlir/Dialect/Math/IR/Math.h"
#include "mlir/Dialect/SCF/IR/SCF.h"
#include "mlir/Dialect/Utils/IndexingUtils.h"
#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/ImplicitLocOpBuilder.h"
#include "mlir/IR/TypeUtilities.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Transforms/DialectConversion.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/TypeSwitch.h"
#include "llvm/Support/Debug.h"
#include "mlir/Conversion/Passes.h.inc"
Go to the source code of this file.
Namespaces | |
mlir | |
Include the generated interface declarations. | |
Macros | |
#define | GEN_PASS_DEF_CONVERTMATHTOFUNCS |
#define | DEBUG_TYPE "math-to-funcs" |
#define | DBGS() (llvm::dbgs() << "[" DEBUG_TYPE "]: ") |
Functions | |
static FunctionType | getElementalFuncTypeForOp (Operation *op) |
static func::FuncOp | createElementIPowIFunc (ModuleOp *module, Type elementType) |
Create linkonce_odr function to implement the power function with the given elementType type inside module . More... | |
static func::FuncOp | createElementFPowIFunc (ModuleOp *module, FunctionType funcType) |
Create linkonce_odr function to implement the power function with the given funcType type inside module . More... | |
static func::FuncOp | createCtlzFunc (ModuleOp *module, Type elementType) |
Create function to implement the ctlz function the given elementType type inside module . More... | |
#define DBGS | ( | ) | (llvm::dbgs() << "[" DEBUG_TYPE "]: ") |
Definition at line 36 of file MathToFuncs.cpp.
#define DEBUG_TYPE "math-to-funcs" |
Definition at line 35 of file MathToFuncs.cpp.
#define GEN_PASS_DEF_CONVERTMATHTOFUNCS |
Definition at line 29 of file MathToFuncs.cpp.
|
static |
Create function to implement the ctlz function the given elementType
type inside module
.
The elementType
must be IntegerType, an the created function has 'IntegerType (*)(IntegerType)' function type.
template <typename T> T __mlir_math_ctlz_*(T x) { bits = sizeof(x) * 8; if (x == 0) return bits;
uint32_t n = 0; for (int i = 1; i < bits; ++i) { if (x < 0) continue; n++; x <<= 1; } return n; }
Converts to (for i32):
func.func private @__mlir_math_ctlz_i32(arg: i32) -> i32 { c_32 = arith.constant 32 : index c_0 = arith.constant 0 : i32 arg_eq_zero = arith.cmpi eq, arg, c_0 : i1 out = scf.if arg_eq_zero { scf.yield c_32 : i32 } else { c_1index = arith.constant 1 : index c_1i32 = arith.constant 1 : i32 n = arith.constant 0 : i32 arg_out, n_out = scf.for i = c_1index to c_32 step c_1index iter_args(arg_iter = arg, n_iter = n) -> (i32, i32) { cond = arith.cmpi slt, arg_iter, c_0 : i32 yield_val = scf.if cond { scf.yield arg_iter, n_iter : i32, i32 } else { arg_next = arith.shli arg_iter, c_1i32 : i32 n_next = arith.addi n_iter, c_1i32 : i32 scf.yield arg_next, n_next : i32, i32 } scf.yield yield_val: i32, i32 } scf.yield n_out : i32 } return out: i32 }
Definition at line 651 of file MathToFuncs.cpp.
References mlir::ImplicitLocOpBuilder::atBlockEnd(), mlir::ImplicitLocOpBuilder::create(), mlir::OpBuilder::create(), mlir::Operation::create(), DBGS, mlir::get(), mlir::Builder::getContext(), mlir::Builder::getIndexType(), mlir::Builder::getIntegerAttr(), mlir::Type::getIntOrFloatBitWidth(), mlir::OpState::getLoc(), mlir::Type::print(), and mlir::OpBuilder::setInsertionPointToStart().
|
static |
Create linkonce_odr function to implement the power function with the given funcType
type inside module
.
The funcType
must be 'FloatType (*)(FloatType, IntegerType)' function type.
template <typename T> Tb __mlir_math_fpowi_*(Tb b, Tp p) { if (p == Tp{0}) return Tb{1}; bool isNegativePower{p < Tp{0}} bool isMin{p == std::numeric_limits<Tp>::min()}; if (isMin) { p = std::numeric_limits<Tp>::max(); } else if (isNegativePower) { p = -p; } Tb result = Tb{1}; Tb origBase = Tb{b}; while (true) { if (p & Tp{1}) result *= b; p >>= Tp{1}; if (p == Tp{0}) break; b *= b; } if (isMin) { result *= origBase; } if (isNegativePower) { result = Tb{1} / result; } return result; }
if (isNegativePower) { result = Tb{1} / result; }
Definition at line 412 of file MathToFuncs.cpp.
References mlir::ImplicitLocOpBuilder::atBlockEnd(), mlir::ImplicitLocOpBuilder::create(), mlir::OpBuilder::createBlock(), mlir::Region::end(), mlir::get(), mlir::Block::getArgument(), mlir::Builder::getContext(), mlir::Builder::getFloatAttr(), mlir::Builder::getIntegerAttr(), mlir::ImplicitLocOpBuilder::getLoc(), mlir::Block::getParent(), and mlir::OpBuilder::setInsertionPointToEnd().
|
static |
Create linkonce_odr function to implement the power function with the given elementType
type inside module
.
The elementType
must be IntegerType, an the created function has 'IntegerType (*)(IntegerType, IntegerType)' function type.
template <typename T> T __mlir_math_ipowi_*(T b, T p) { if (p == T(0)) return T(1); if (p < T(0)) { if (b == T(0)) return T(1) / T(0); // trigger div-by-zero if (b == T(1)) return T(1); if (b == T(-1)) { if (p & T(1)) return T(-1); return T(1); } return T(0); } T result = T(1); while (true) { if (p & T(1)) result *= b; p >>= T(1); if (p == T(0)) return result; b *= b; } }
Definition at line 185 of file MathToFuncs.cpp.
References mlir::ImplicitLocOpBuilder::atBlockEnd(), mlir::ImplicitLocOpBuilder::create(), mlir::OpBuilder::createBlock(), mlir::Region::end(), mlir::get(), mlir::Builder::getContext(), mlir::Builder::getIntegerAttr(), mlir::Type::getIntOrFloatBitWidth(), mlir::ImplicitLocOpBuilder::getLoc(), mlir::Block::getParent(), and mlir::OpBuilder::setInsertionPointToEnd().
|
static |
Definition at line 142 of file MathToFuncs.cpp.
References mlir::get(), mlir::Operation::getContext(), mlir::Operation::getNumOperands(), mlir::Operation::getNumResults(), mlir::Operation::operand_type_begin(), mlir::Operation::operand_type_end(), mlir::Operation::result_type_begin(), and mlir::Operation::result_type_end().