[PATCH] D74406: Add RsqrtOp to LLVM dialect.

Adrian Kuegel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 11 06:37:24 PST 2020


akuegel created this revision.
Herald added subscribers: llvm-commits, Joonsoo, liufengdb, aartbik, lucyrfox, mgester, arpith-jacob, nicolasvasilache, antiagainst, shauheen, burmako, jpienaar, rriddle, mehdi_amini.
Herald added a project: LLVM.
akuegel edited the summary of this revision.
akuegel added reviewers: herhut, pifon2a.

Add a convenience Op Rsqrt which is 1 / sqrt.

Also add the SameOperandsAndResultType trait to the Log Op.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D74406

Files:
  mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
  mlir/test/Dialect/LLVMIR/roundtrip.mlir


Index: mlir/test/Dialect/LLVMIR/roundtrip.mlir
===================================================================
--- mlir/test/Dialect/LLVMIR/roundtrip.mlir
+++ 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
 }
Index: mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
===================================================================
--- mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ 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 = [{


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D74406.243850.patch
Type: text/x-patch
Size: 2192 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200211/758db894/attachment.bin>


More information about the llvm-commits mailing list