diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td @@ -37,10 +37,13 @@ class LLVM_CountZerosIntrinsicOp traits = []> : LLVM_OneResultIntrOp { - let arguments = (ins LLVM_Type:$in, I<1>:$zero_undefined); + let arguments = (ins LLVM_Type:$in, I1:$zero_undefined); +} + +def LLVM_AbsOp : LLVM_OneResultIntrOp<"abs", [], [0], [NoSideEffect]> { + let arguments = (ins LLVM_Type:$in, I1:$is_int_min_poison); } -def LLVM_AbsOp : LLVM_UnaryIntrinsicOp<"abs">; def LLVM_CopySignOp : LLVM_BinarySameArgsIntrinsicOp<"copysign">; def LLVM_CosOp : LLVM_UnaryIntrinsicOp<"cos">; def LLVM_ExpOp : LLVM_UnaryIntrinsicOp<"exp">; diff --git a/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp b/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp --- a/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp +++ b/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp @@ -19,7 +19,6 @@ namespace { using AbsFOpLowering = VectorConvertToLLVMPattern; -using AbsIOpLowering = VectorConvertToLLVMPattern; using CeilOpLowering = VectorConvertToLLVMPattern; using CopySignOpLowering = VectorConvertToLLVMPattern; @@ -41,11 +40,11 @@ using SinOpLowering = VectorConvertToLLVMPattern; using SqrtOpLowering = VectorConvertToLLVMPattern; -// A `CtLz/CtTz(a)` is converted into `CtLz/CtTz(a, false)`. +// A `CtLz/CtTz/absi(a)` is converted into `CtLz/CtTz/absi(a, false)`. template -struct CountOpLowering : public ConvertOpToLLVMPattern { +struct IntOpWithFlagLowering : public ConvertOpToLLVMPattern { using ConvertOpToLLVMPattern::ConvertOpToLLVMPattern; - using Super = CountOpLowering; + using Super = IntOpWithFlagLowering; LogicalResult matchAndRewrite(MathOp op, typename MathOp::Adaptor adaptor, @@ -83,9 +82,10 @@ }; using CountLeadingZerosOpLowering = - CountOpLowering; + IntOpWithFlagLowering; using CountTrailingZerosOpLowering = - CountOpLowering; + IntOpWithFlagLowering; +using AbsIOpLowering = IntOpWithFlagLowering; // A `expm1` is converted into `exp - 1`. struct ExpM1OpLowering : public ConvertOpToLLVMPattern { diff --git a/mlir/test/Conversion/MathToLLVM/math-to-llvm.mlir b/mlir/test/Conversion/MathToLLVM/math-to-llvm.mlir --- a/mlir/test/Conversion/MathToLLVM/math-to-llvm.mlir +++ b/mlir/test/Conversion/MathToLLVM/math-to-llvm.mlir @@ -10,13 +10,20 @@ %2 = math.sqrt %arg0 : f32 // CHECK: = "llvm.intr.sqrt"(%{{.*}}) : (f64) -> f64 %3 = math.sqrt %arg4 : f64 - // CHECK: = "llvm.intr.abs"(%{{.*}}) : (i32) -> i32 - %4 = math.absi %arg2 : i32 func.return } // ----- +func.func @absi(%arg0: i32) -> i32 { + // CHECK: %[[FALSE:.*]] = llvm.mlir.constant(false + // CHECK: = "llvm.intr.abs"(%{{.*}}, %[[FALSE]]) : (i32, i1) -> i32 + %0 = math.absi %arg0 : i32 + return %0 : i32 +} + +// ----- + // CHECK-LABEL: func @log1p( // CHECK-SAME: f32 func.func @log1p(%arg0 : f32) {