diff --git a/third_party/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/third_party/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td index a8b427e2d94da8038a780566702a1765d449bc40..2f7a9808bd18c3d0e863b3660aab71125b1f548b 100644 --- a/third_party/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ b/third_party/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 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 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 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 diff --git a/third_party/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp b/third_party/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp index 897135a8bbb050569e4f9c87a7d29f97f6166e74..ea8501b9a7e0e42fdecd5d4333bceeb9b23257df 100644 --- a/third_party/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp +++ b/third_party/mlir/lib/Conversion/StandardToLLVM/ConvertStandardToLLVM.cpp @@ -781,6 +781,15 @@ using BinaryOpLLVMOpLowering = NaryOpLLVMOpLowering; // Specific lowerings. // FIXME: this should be tablegen'ed. +struct AbsFOpLowering : public UnaryOpLLVMOpLowering { + using Super::Super; +}; +struct CeilFOpLowering : public UnaryOpLLVMOpLowering { + using Super::Super; +}; +struct CosOpLowering : public UnaryOpLLVMOpLowering { + using Super::Super; +}; struct ExpOpLowering : public UnaryOpLLVMOpLowering { using Super::Super; }; @@ -793,6 +802,9 @@ struct Log10OpLowering : public UnaryOpLLVMOpLowering { struct Log2OpLowering : public UnaryOpLLVMOpLowering { using Super::Super; }; +struct NegFOpLowering : public UnaryOpLLVMOpLowering { + using Super::Super; +}; struct AddIOpLowering : public BinaryOpLLVMOpLowering { using Super::Super; }; @@ -838,6 +850,10 @@ struct DivFOpLowering : public BinaryOpLLVMOpLowering { struct RemFOpLowering : public BinaryOpLLVMOpLowering { using Super::Super; }; +struct CopySignOpLowering + : public BinaryOpLLVMOpLowering { + using Super::Super; +}; struct SelectOpLowering : public OneToOneLLVMOpLowering { using Super::Super; @@ -2051,15 +2067,19 @@ void mlir::populateStdToLLVMNonMemoryConversionPatterns( // FIXME: this should be tablegen'ed // clang-format off patterns.insert< + AbsFOpLowering, AddFOpLowering, AddIOpLowering, AndOpLowering, BranchOpLowering, CallIndirectOpLowering, CallOpLowering, + CeilFOpLowering, CmpFOpLowering, CmpIOpLowering, CondBranchOpLowering, + CopySignOpLowering, + CosOpLowering, ConstLLVMOpLowering, DivFOpLowering, DivISOpLowering, @@ -2073,6 +2093,7 @@ void mlir::populateStdToLLVMNonMemoryConversionPatterns( IndexCastOpLowering, MulFOpLowering, MulIOpLowering, + NegFOpLowering, OrOpLowering, PrefetchOpLowering, RemFOpLowering,