From: Nicolas Vasilache Date: Wed, 11 Dec 2019 23:25:00 +0000 (-0800) Subject: Add std.log* and llvm.intr.log* that correspond to the LLVMIR intrinsics X-Git-Tag: llvmorg-11-init~1466^2~92 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9dfa84a269e245ebaff032f698a798f71da2c1b5;p=platform%2Fupstream%2Fllvm.git Add std.log* and llvm.intr.log* that correspond to the LLVMIR intrinsics PiperOrigin-RevId: 285073483 --- diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td index 166cc5c4..a711914 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td @@ -684,4 +684,38 @@ def LLVM_ExpOp : LLVM_Op<"intr.exp", [NoSideEffect]>, $res = builder.CreateCall(fn, {$in}); }]; } + +def LLVM_LogOp : LLVM_Op<"intr.log", [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::log, {$in->getType()}); + $res = builder.CreateCall(fn, {$in}); + }]; +} + +def LLVM_Log10Op : LLVM_Op<"intr.log10", [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::log10, {$in->getType()}); + $res = builder.CreateCall(fn, {$in}); + }]; +} + +def LLVM_Log2Op : LLVM_Op<"intr.log2", [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::log2, {$in->getType()}); + $res = builder.CreateCall(fn, {$in}); + }]; +} + #endif // LLVMIR_OPS diff --git a/mlir/include/mlir/Dialect/StandardOps/Ops.td b/mlir/include/mlir/Dialect/StandardOps/Ops.td index c67e345..8e21a8b 100644 --- a/mlir/include/mlir/Dialect/StandardOps/Ops.td +++ b/mlir/include/mlir/Dialect/StandardOps/Ops.td @@ -837,6 +837,18 @@ def LoadOp : Std_Op<"load"> { let hasCanonicalizer = 1; } +def LogOp : FloatUnaryOp<"log"> { + let summary = "base-e logarithm of the specified value"; +} + +def Log10Op : FloatUnaryOp<"log10"> { + let summary = "base-10 logarithm of the specified value"; +} + +def Log2Op : FloatUnaryOp<"log2"> { + let summary = "base-2 logarithm of the specified value"; +} + def MemRefCastOp : CastOp<"memref_cast"> { let summary = "memref cast operation"; let description = [{ diff --git a/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp b/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp index 794683e..933c0cf 100644 --- a/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp +++ b/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp @@ -812,6 +812,15 @@ using BinaryOpLLVMOpLowering = NaryOpLLVMOpLowering; struct ExpOpLowering : public UnaryOpLLVMOpLowering { using Super::Super; }; +struct LogOpLowering : public UnaryOpLLVMOpLowering { + using Super::Super; +}; +struct Log10OpLowering : public UnaryOpLLVMOpLowering { + using Super::Super; +}; +struct Log2OpLowering : public UnaryOpLLVMOpLowering { + using Super::Super; +}; struct AddIOpLowering : public BinaryOpLLVMOpLowering { using Super::Super; }; @@ -2004,6 +2013,9 @@ void mlir::populateStdToLLVMConversionPatterns( DivISOpLowering, DivIUOpLowering, ExpOpLowering, + LogOpLowering, + Log10OpLowering, + Log2OpLowering, FPExtLowering, FPTruncLowering, FuncOpConversion, diff --git a/mlir/test/Target/llvmir-intrinsics.mlir b/mlir/test/Target/llvmir-intrinsics.mlir index bc08a04..2a85569 100644 --- a/mlir/test/Target/llvmir-intrinsics.mlir +++ b/mlir/test/Target/llvmir-intrinsics.mlir @@ -18,8 +18,41 @@ llvm.func @exp_test(%arg0: !llvm.float, %arg1: !llvm<"<8 x float>">) { llvm.return } +// CHECK-LABEL: @log_test +llvm.func @log_test(%arg0: !llvm.float, %arg1: !llvm<"<8 x float>">) { + // CHECK: call float @llvm.log.f32 + "llvm.intr.log"(%arg0) : (!llvm.float) -> !llvm.float + // CHECK: call <8 x float> @llvm.log.v8f32 + "llvm.intr.log"(%arg1) : (!llvm<"<8 x float>">) -> !llvm<"<8 x float>"> + llvm.return +} + +// CHECK-LABEL: @log10_test +llvm.func @log10_test(%arg0: !llvm.float, %arg1: !llvm<"<8 x float>">) { + // CHECK: call float @llvm.log10.f32 + "llvm.intr.log10"(%arg0) : (!llvm.float) -> !llvm.float + // CHECK: call <8 x float> @llvm.log10.v8f32 + "llvm.intr.log10"(%arg1) : (!llvm<"<8 x float>">) -> !llvm<"<8 x float>"> + llvm.return +} + +// CHECK-LABEL: @log2_test +llvm.func @log2_test(%arg0: !llvm.float, %arg1: !llvm<"<8 x float>">) { + // CHECK: call float @llvm.log2.f32 + "llvm.intr.log2"(%arg0) : (!llvm.float) -> !llvm.float + // CHECK: call <8 x float> @llvm.log2.v8f32 + "llvm.intr.log2"(%arg1) : (!llvm<"<8 x float>">) -> !llvm<"<8 x float>"> + llvm.return +} + // Check that intrinsics are declared with appropriate types. // CHECK: declare float @llvm.fmuladd.f32.f32.f32(float, float, float) // CHECK: declare <8 x float> @llvm.fmuladd.v8f32.v8f32.v8f32(<8 x float>, <8 x float>, <8 x float>) #0 // CHECK: declare float @llvm.exp.f32(float) // CHECK: declare <8 x float> @llvm.exp.v8f32(<8 x float>) #0 +// CHECK: declare float @llvm.log.f32(float) +// CHECK: declare <8 x float> @llvm.log.v8f32(<8 x float>) #0 +// CHECK: declare float @llvm.log10.f32(float) +// CHECK: declare <8 x float> @llvm.log10.v8f32(<8 x float>) #0 +// CHECK: declare float @llvm.log2.f32(float) +// CHECK: declare <8 x float> @llvm.log2.v8f32(<8 x float>) #0