提交 7d7c61bf 编写于 作者: M Marcel Koester 提交者: TensorFlower Gardener

Added LLVM ops and lowering phases from standard dialect for FAbs, FCeil, Cos, FNeg, CopySign.

Added test cases for the newly added LLVM operations and lowering features.

Closes #300

COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/300 from dfki-jugr:std_to_llvm da6168bbc1a369ae2e99ad3881fdddd82f075dd4
PiperOrigin-RevId: 286231169
Change-Id: I364bda2adad4054052a3a53b4cb1c3de1102864f
上级 f4941d91
......@@ -662,40 +662,40 @@ def LLVM_ConstantOp
// operations and intrinsics. However, we systematically prefix them with
// "intr." to avoid potential name clashes.
def LLVM_FMulAddOp : LLVM_Op<"intr.fmuladd", [NoSideEffect]>,
Arguments<(ins LLVM_Type:$a, LLVM_Type:$b, LLVM_Type:$c)>,
Results<(outs LLVM_Type:$res)> {
let llvmBuilder = [{
llvm::Module *module = builder.GetInsertBlock()->getModule();
llvm::Function *fn = llvm::Intrinsic::getDeclaration(
module, llvm::Intrinsic::fmuladd,
{$a->getType(), $b->getType(), $c->getType()});
$res = builder.CreateCall(fn, {$a, $b, $c});
}];
class LLVM_UnaryIntrinsicOp<string func, list<OpTrait> traits = []> :
LLVM_OneResultOp<"intr." # func,
!listconcat([NoSideEffect, SameOperandsAndResultType], traits)>,
Arguments<(ins LLVM_Type:$in)>,
LLVM_Builder<"$res = builder.CreateCall(llvm::Intrinsic::getDeclaration("
"builder.GetInsertBlock()->getModule(), llvm::Intrinsic::" # func # ","
"{$in->getType()}), {$in});"> {
}
def LLVM_Prefetch : LLVM_ZeroResultOp<"intr.prefetch">,
Arguments<(ins LLVM_Type:$addr, LLVM_Type:$rw,
LLVM_Type:$hint, LLVM_Type:$cache)> {
let llvmBuilder = [{
llvm::Module *module = builder.GetInsertBlock()->getModule();
llvm::Function *fn = llvm::Intrinsic::getDeclaration(
module, llvm::Intrinsic::prefetch, $addr->getType());
builder.CreateCall(fn, {$addr, $rw, $hint, $cache});
}];
class LLVM_BinaryIntrinsicOp<string func, list<OpTrait> traits = []> :
LLVM_OneResultOp<"intr." # func,
!listconcat([NoSideEffect, SameOperandsAndResultType], traits)>,
Arguments<(ins LLVM_Type:$a, LLVM_Type:$b)>,
LLVM_Builder<"$res = builder.CreateCall(llvm::Intrinsic::getDeclaration("
"builder.GetInsertBlock()->getModule(), llvm::Intrinsic::" # func # ","
"{$a->getType(), $b->getType()}), {$a, $b});"> {
}
def LLVM_ExpOp : LLVM_Op<"intr.exp", [NoSideEffect]>,
Arguments<(ins LLVM_Type:$in)>,
Results<(outs LLVM_Type:$res)> {
let llvmBuilder = [{
llvm::Module *module = builder.GetInsertBlock()->getModule();
llvm::Function *fn = llvm::Intrinsic::getDeclaration(
module, llvm::Intrinsic::exp, {$in->getType()});
$res = builder.CreateCall(fn, {$in});
}];
class LLVM_TernaryIntrinsicOp<string func, list<OpTrait> traits = []> :
LLVM_OneResultOp<"intr." # func,
!listconcat([NoSideEffect, SameOperandsAndResultType], traits)>,
Arguments<(ins LLVM_Type:$a, LLVM_Type:$b, LLVM_Type:$c)>,
LLVM_Builder<"$res = builder.CreateCall(llvm::Intrinsic::getDeclaration("
"builder.GetInsertBlock()->getModule(), llvm::Intrinsic::" # func # ","
"{$a->getType(), $b->getType(), $c->getType()}), {$a, $b, $c});"> {
}
def LLVM_ExpOp : LLVM_UnaryIntrinsicOp<"exp">;
def LLVM_FAbsOp : LLVM_UnaryIntrinsicOp<"fabs">;
def LLVM_FCeilOp : LLVM_UnaryIntrinsicOp<"ceil">;
def LLVM_CosOp : LLVM_UnaryIntrinsicOp<"cos">;
def LLVM_CopySignOp : LLVM_BinaryIntrinsicOp<"copysign">;
def LLVM_FMulAddOp : LLVM_TernaryIntrinsicOp<"fmuladd">;
def LLVM_LogOp : LLVM_Op<"intr.log", [NoSideEffect]>,
Arguments<(ins LLVM_Type:$in)>,
Results<(outs LLVM_Type:$res)> {
......@@ -729,4 +729,15 @@ def LLVM_Log2Op : LLVM_Op<"intr.log2", [NoSideEffect]>,
}];
}
def LLVM_Prefetch : LLVM_ZeroResultOp<"intr.prefetch">,
Arguments<(ins LLVM_Type:$addr, LLVM_Type:$rw,
LLVM_Type:$hint, LLVM_Type:$cache)> {
let llvmBuilder = [{
llvm::Module *module = builder.GetInsertBlock()->getModule();
llvm::Function *fn = llvm::Intrinsic::getDeclaration(
module, llvm::Intrinsic::prefetch, $addr->getType());
builder.CreateCall(fn, {$addr, $rw, $hint, $cache});
}];
}
#endif // LLVMIR_OPS
......@@ -781,6 +781,15 @@ using BinaryOpLLVMOpLowering = NaryOpLLVMOpLowering<SourceOp, TargetOp, 2>;
// Specific lowerings.
// FIXME: this should be tablegen'ed.
struct AbsFOpLowering : public UnaryOpLLVMOpLowering<AbsFOp, LLVM::FAbsOp> {
using Super::Super;
};
struct CeilFOpLowering : public UnaryOpLLVMOpLowering<CeilFOp, LLVM::FCeilOp> {
using Super::Super;
};
struct CosOpLowering : public UnaryOpLLVMOpLowering<CosOp, LLVM::CosOp> {
using Super::Super;
};
struct ExpOpLowering : public UnaryOpLLVMOpLowering<ExpOp, LLVM::ExpOp> {
using Super::Super;
};
......@@ -793,6 +802,9 @@ struct Log10OpLowering : public UnaryOpLLVMOpLowering<Log10Op, LLVM::Log10Op> {
struct Log2OpLowering : public UnaryOpLLVMOpLowering<Log2Op, LLVM::Log2Op> {
using Super::Super;
};
struct NegFOpLowering : public UnaryOpLLVMOpLowering<NegFOp, LLVM::FNegOp> {
using Super::Super;
};
struct AddIOpLowering : public BinaryOpLLVMOpLowering<AddIOp, LLVM::AddOp> {
using Super::Super;
};
......@@ -838,6 +850,10 @@ struct DivFOpLowering : public BinaryOpLLVMOpLowering<DivFOp, LLVM::FDivOp> {
struct RemFOpLowering : public BinaryOpLLVMOpLowering<RemFOp, LLVM::FRemOp> {
using Super::Super;
};
struct CopySignOpLowering
: public BinaryOpLLVMOpLowering<CopySignOp, LLVM::CopySignOp> {
using Super::Super;
};
struct SelectOpLowering
: public OneToOneLLVMOpLowering<SelectOp, LLVM::SelectOp> {
using Super::Super;
......@@ -2051,15 +2067,19 @@ void mlir::populateStdToLLVMNonMemoryConversionPatterns(
// FIXME: this should be tablegen'ed
// clang-format off
patterns.insert<
AbsFOpLowering,
AddFOpLowering,
AddIOpLowering,
AndOpLowering,
BranchOpLowering,
CallIndirectOpLowering,
CallOpLowering,
CeilFOpLowering,
CmpFOpLowering,
CmpIOpLowering,
CondBranchOpLowering,
CopySignOpLowering,
CosOpLowering,
ConstLLVMOpLowering,
DivFOpLowering,
DivISOpLowering,
......@@ -2073,6 +2093,7 @@ void mlir::populateStdToLLVMNonMemoryConversionPatterns(
IndexCastOpLowering,
MulFOpLowering,
MulIOpLowering,
NegFOpLowering,
OrOpLowering,
PrefetchOpLowering,
RemFOpLowering,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册