summaryrefslogtreecommitdiffstats
path: root/mlir/include
diff options
context:
space:
mode:
authorMarcel Koester <marcel.koester@dfki.de>2019-12-18 11:27:09 -0800
committerA. Unique TensorFlower <gardener@tensorflow.org>2019-12-18 11:42:43 -0800
commit6054610bbe0fcec5b9c71fded7c342b7bcaf3513 (patch)
tree53969cf1829134ab85ce9f176b6ee69a8a6f79d8 /mlir/include
parentd9b500d3bb151bfb96073b0d66e8338a5c0186d5 (diff)
downloadbcm5719-llvm-6054610bbe0fcec5b9c71fded7c342b7bcaf3513.tar.gz
bcm5719-llvm-6054610bbe0fcec5b9c71fded7c342b7bcaf3513.zip
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 tensorflow/mlir#300 COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/300 from dfki-jugr:std_to_llvm da6168bbc1a369ae2e99ad3881fdddd82f075dd4 PiperOrigin-RevId: 286231169
Diffstat (limited to 'mlir/include')
-rw-r--r--mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td67
1 files changed, 39 insertions, 28 deletions
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index a8b427e2d94..2f7a9808bd1 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -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
OpenPOWER on IntegriCloud