diff options
| author | Marcel Koester <marcel.koester@dfki.de> | 2019-12-18 11:27:09 -0800 |
|---|---|---|
| committer | A. Unique TensorFlower <gardener@tensorflow.org> | 2019-12-18 11:42:43 -0800 |
| commit | 6054610bbe0fcec5b9c71fded7c342b7bcaf3513 (patch) | |
| tree | 53969cf1829134ab85ce9f176b6ee69a8a6f79d8 /mlir/include | |
| parent | d9b500d3bb151bfb96073b0d66e8338a5c0186d5 (diff) | |
| download | bcm5719-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.td | 67 |
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 |

