diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td @@ -231,8 +231,24 @@ def LLVM_FMulOp : LLVM_ArithmeticOp<"fmul", "CreateFMul">; def LLVM_FDivOp : LLVM_ArithmeticOp<"fdiv", "CreateFDiv">; def LLVM_FRemOp : LLVM_ArithmeticOp<"frem", "CreateFRem">; + +// Floating point unary operations. def LLVM_FNegOp : LLVM_UnaryArithmeticOp<"fneg", "CreateFNeg">; +def LLVM_RsqrtOp : LLVM_Op<"rsqrt", [NoSideEffect, SameOperandsAndResultType]>, + 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::sqrt, {$in->getType()}); + auto sqrt = builder.CreateCall(fn, {$in}); + $res = builder.CreateFDiv(llvm::ConstantFP::get(sqrt->getType(), 1), sqrt); + }]; + let parser = [{ return impl::parseOneResultSameOperandTypeOp(parser, result); }]; + let printer = [{ mlir::impl::printOneResultOp(this->getOperation(), p); }]; +} + // Memory-related operations. def LLVM_AllocaOp : LLVM_OneResultOp<"alloca">, @@ -736,7 +752,7 @@ def LLVM_FMulAddOp : LLVM_TernarySameArgsIntrinsicOp<"fmuladd">; def LLVM_SqrtOp : LLVM_UnaryIntrinsicOp<"sqrt">; -def LLVM_LogOp : LLVM_Op<"intr.log", [NoSideEffect]>, +def LLVM_LogOp : LLVM_Op<"intr.log", [NoSideEffect, SameOperandsAndResultType]>, Arguments<(ins LLVM_Type:$in)>, Results<(outs LLVM_Type:$res)> { let llvmBuilder = [{ diff --git a/mlir/test/Dialect/LLVMIR/roundtrip.mlir b/mlir/test/Dialect/LLVMIR/roundtrip.mlir --- a/mlir/test/Dialect/LLVMIR/roundtrip.mlir +++ b/mlir/test/Dialect/LLVMIR/roundtrip.mlir @@ -97,6 +97,10 @@ // CHECK: %29 = llvm.fneg %arg1 : !llvm.float %29 = llvm.fneg %arg1 : !llvm.float +// Floating point unary operations. +// CHECK: %30 = llvm.rsqrt %arg1 : !llvm.float + %30 = llvm.rsqrt %arg1 : !llvm.float + // CHECK: llvm.return llvm.return }