diff --git a/mlir/lib/Conversion/ArithmeticToLLVM/ArithmeticToLLVM.cpp b/mlir/lib/Conversion/ArithmeticToLLVM/ArithmeticToLLVM.cpp --- a/mlir/lib/Conversion/ArithmeticToLLVM/ArithmeticToLLVM.cpp +++ b/mlir/lib/Conversion/ArithmeticToLLVM/ArithmeticToLLVM.cpp @@ -68,6 +68,18 @@ VectorConvertToLLVMPattern; using SelectOpLowering = VectorConvertToLLVMPattern; +using MaxFOpLowering = + VectorConvertToLLVMPattern; +using MaxSIOpLowering = + VectorConvertToLLVMPattern; +using MaxUIOpLowering = + VectorConvertToLLVMPattern; +using MinFOpLowering = + VectorConvertToLLVMPattern; +using MinSIOpLowering = + VectorConvertToLLVMPattern; +using MinUIOpLowering = + VectorConvertToLLVMPattern; //===----------------------------------------------------------------------===// // Op Lowering Patterns @@ -321,7 +333,13 @@ BitcastOpLowering, CmpIOpLowering, CmpFOpLowering, - SelectOpLowering + SelectOpLowering, + MaxFOpLowering, + MaxUIOpLowering, + MaxSIOpLowering, + MinFOpLowering, + MinUIOpLowering, + MinSIOpLowering >(converter); // clang-format on } diff --git a/mlir/test/Conversion/ArithmeticToLLVM/arith-to-llvm.mlir b/mlir/test/Conversion/ArithmeticToLLVM/arith-to-llvm.mlir --- a/mlir/test/Conversion/ArithmeticToLLVM/arith-to-llvm.mlir +++ b/mlir/test/Conversion/ArithmeticToLLVM/arith-to-llvm.mlir @@ -383,3 +383,27 @@ %0 = arith.select %arg0, %arg1, %arg2 : i32 return %0 : i32 } + +// ----- + +// CHECK-LABEL: @minmaxi +func.func @minmaxi(%arg0 : i32, %arg1 : i32) -> i32 { + // CHECK: = "llvm.intr.smin"(%arg0, %arg1) : (i32, i32) -> i32 + %0 = arith.minsi %arg0, %arg1 : i32 + // CHECK: = "llvm.intr.smax"(%arg0, %arg1) : (i32, i32) -> i32 + %1 = arith.maxsi %arg0, %arg1 : i32 + // CHECK: = "llvm.intr.umin"(%arg0, %arg1) : (i32, i32) -> i32 + %2 = arith.minui %arg0, %arg1 : i32 + // CHECK: = "llvm.intr.umax"(%arg0, %arg1) : (i32, i32) -> i32 + %3 = arith.maxui %arg0, %arg1 : i32 + return %0 : i32 +} + +// CHECK-LABEL: @minmaxf +func.func @minmaxf(%arg0 : f32, %arg1 : f32) -> f32 { + // CHECK: = "llvm.intr.minnum"(%arg0, %arg1) : (f32, f32) -> f32 + %0 = arith.minf %arg0, %arg1 : f32 + // CHECK: = "llvm.intr.maxnum"(%arg0, %arg1) : (f32, f32) -> f32 + %1 = arith.maxf %arg0, %arg1 : f32 + return %0 : f32 +}