From 420111e9e4159bdf13fc4014c437aa712eba85ad Mon Sep 17 00:00:00 2001 From: "Ivan R. Ivanov" Date: Sat, 4 Apr 2026 19:17:37 +0200 Subject: [PATCH] [mlir][LLVM] Fix incorrect verification of atomicrmw f{min,max}imumnum (#190474) Fix llvm.atomicrmw fminimumnum and fmaximumnum to correctly take the float operation verification path. --- mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp | 4 +++- mlir/test/Dialect/LLVMIR/roundtrip.mlir | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp index 88b4857b5295..2b603efadb47 100644 --- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp +++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp @@ -3663,7 +3663,9 @@ LogicalResult AtomicRMWOp::verify() { if (getBinOp() == AtomicBinOp::fadd || getBinOp() == AtomicBinOp::fsub || getBinOp() == AtomicBinOp::fmin || getBinOp() == AtomicBinOp::fmax || getBinOp() == AtomicBinOp::fminimum || - getBinOp() == AtomicBinOp::fmaximum) { + getBinOp() == AtomicBinOp::fmaximum || + getBinOp() == AtomicBinOp::fminimumnum || + getBinOp() == AtomicBinOp::fmaximumnum) { if (isCompatibleVectorType(valType)) { if (isScalableVectorType(valType)) return emitOpError("expected LLVM IR fixed vector type"); diff --git a/mlir/test/Dialect/LLVMIR/roundtrip.mlir b/mlir/test/Dialect/LLVMIR/roundtrip.mlir index ee8c990f34d2..83d1f1b8e288 100644 --- a/mlir/test/Dialect/LLVMIR/roundtrip.mlir +++ b/mlir/test/Dialect/LLVMIR/roundtrip.mlir @@ -547,6 +547,8 @@ func.func @atomicrmw(%ptr : !llvm.ptr, %f32 : f32, %f16_vec : vector<2xf16>) { %1 = llvm.atomicrmw volatile fsub %ptr, %f32 syncscope("singlethread") monotonic {alignment = 16 : i64} : !llvm.ptr, f32 // CHECK: llvm.atomicrmw fmin %{{.*}}, %{{.*}} monotonic : !llvm.ptr, vector<2xf16> %2 = llvm.atomicrmw fmin %ptr, %f16_vec monotonic : !llvm.ptr, vector<2xf16> + // CHECK: llvm.atomicrmw fminimumnum %{{.*}}, %{{.*}} monotonic : !llvm.ptr, f32 + %3 = llvm.atomicrmw fminimumnum %ptr, %f32 monotonic : !llvm.ptr, f32 llvm.return }