[Mlir-commits] [mlir] [flang] Fix build issue in flang caused by adding new LLVM IR instructions in #137701 (PR #138198)
Jonathan Thackray
llvmlistbot at llvm.org
Thu May 1 15:40:05 PDT 2025
https://github.com/jthackray updated https://github.com/llvm/llvm-project/pull/138198
>From 83b1785c98749197a6aae31ac1dc40860f3c8a5b Mon Sep 17 00:00:00 2001
From: Jonathan Thackray <jonathan.thackray at arm.com>
Date: Thu, 1 May 2025 21:21:33 +0100
Subject: [PATCH 1/2] [flang] Fix build issue in flang caused by adding new
LLVM IR instructions in #137701
Fix a compile error (with LLVM_ENABLE_WERROR=On) when building `bin/flang`:
```
enumeration values 'FMaximum' and 'FMinimum' not handled in switch
```
caused by adding new LLVM IR instructions in #137701.
This wasn't picked up by the auto CI test on GitHub, so I hadn't
realised until @kazutakahirata notified me about it.
---
mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td
index 6c0fe363d5551..596f562911f8f 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td
@@ -110,6 +110,8 @@ def AtomicBinOpUSubCond : LLVM_EnumAttrCase<"usub_cond",
"usub_cond", "USubCond", 17>;
def AtomicBinOpUSubSat : LLVM_EnumAttrCase<"usub_sat",
"usub_sat", "USubSat", 18>;
+def AtomicBinOpFMaximum : LLVM_EnumAttrCase<"fmaximum", "fmaximum", "FMaximum", 19>;
+def AtomicBinOpFMinimum : LLVM_EnumAttrCase<"fminimum", "fminimum", "FMinimum", 20>;
// A sentinel value that has no MLIR counterpart.
def AtomicBadBinOp : LLVM_EnumAttrCase<"", "", "BAD_BINOP", 0>;
@@ -122,7 +124,8 @@ def AtomicBinOp : LLVM_EnumAttr<
AtomicBinOpNand, AtomicBinOpOr, AtomicBinOpXor, AtomicBinOpMax,
AtomicBinOpMin, AtomicBinOpUMax, AtomicBinOpUMin, AtomicBinOpFAdd,
AtomicBinOpFSub, AtomicBinOpFMax, AtomicBinOpFMin, AtomicBinOpUIncWrap,
- AtomicBinOpUDecWrap, AtomicBinOpUSubCond, AtomicBinOpUSubSat],
+ AtomicBinOpUDecWrap, AtomicBinOpUSubCond, AtomicBinOpUSubSat,
+ AtomicBinOpFMaximum, AtomicBinOpFMinimum],
[AtomicBadBinOp]> {
let cppNamespace = "::mlir::LLVM";
}
>From 2db656e47e4969c48daf930bf0abc23ef4c07c09 Mon Sep 17 00:00:00 2001
From: Jonathan Thackray <jonathan.thackray at arm.com>
Date: Thu, 1 May 2025 23:38:50 +0100
Subject: [PATCH 2/2] fixup! Add tests for mlir
---
mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp | 3 ++-
mlir/test/Target/LLVMIR/Import/instructions.ll | 6 +++++-
mlir/test/Target/LLVMIR/llvmir.mlir | 10 +++++++++-
3 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index d0ac39f538a1f..67113da69cc7a 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -3285,7 +3285,8 @@ void AtomicRMWOp::build(OpBuilder &builder, OperationState &state,
LogicalResult AtomicRMWOp::verify() {
auto valType = getVal().getType();
if (getBinOp() == AtomicBinOp::fadd || getBinOp() == AtomicBinOp::fsub ||
- getBinOp() == AtomicBinOp::fmin || getBinOp() == AtomicBinOp::fmax) {
+ getBinOp() == AtomicBinOp::fmin || getBinOp() == AtomicBinOp::fmax ||
+ getBinOp() == AtomicBinOp::fminimum || getBinOp() == AtomicBinOp::fmaximum) {
if (isCompatibleVectorType(valType)) {
if (isScalableVectorType(valType))
return emitOpError("expected LLVM IR fixed vector type");
diff --git a/mlir/test/Target/LLVMIR/Import/instructions.ll b/mlir/test/Target/LLVMIR/Import/instructions.ll
index 2098d85c18c3f..1ca303f44da8a 100644
--- a/mlir/test/Target/LLVMIR/Import/instructions.ll
+++ b/mlir/test/Target/LLVMIR/Import/instructions.ll
@@ -471,11 +471,15 @@ define void @atomic_rmw(ptr %ptr1, i32 %val1, ptr %ptr2, float %val2) {
%18 = atomicrmw usub_cond ptr %ptr1, i32 %val1 acquire
; CHECK: llvm.atomicrmw usub_sat %[[PTR1]], %[[VAL1]] acquire
%19 = atomicrmw usub_sat ptr %ptr1, i32 %val1 acquire
+ ; CHECK: llvm.atomicrmw fmaximum %[[PTR2]], %[[VAL2]] acquire
+ %20 = atomicrmw fmaximum ptr %ptr2, float %val2 acquire
+ ; CHECK: llvm.atomicrmw fminimum %[[PTR2]], %[[VAL2]] acquire
+ %21 = atomicrmw fminimum ptr %ptr2, float %val2 acquire
; CHECK: llvm.atomicrmw volatile
; CHECK-SAME: syncscope("singlethread")
; CHECK-SAME: {alignment = 8 : i64}
- %20 = atomicrmw volatile udec_wrap ptr %ptr1, i32 %val1 syncscope("singlethread") acquire, align 8
+ %22 = atomicrmw volatile udec_wrap ptr %ptr1, i32 %val1 syncscope("singlethread") acquire, align 8
ret void
}
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index 9852c4051f0d0..f60fc1a5ed55e 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -1555,11 +1555,19 @@ llvm.func @atomicrmw(
%21 = llvm.atomicrmw fmax %f16_vec_ptr, %f16_vec monotonic : !llvm.ptr, vector<2xf16>
// CHECK: atomicrmw fmin ptr %{{.*}}, <2 x half> %{{.*}} monotonic
%22 = llvm.atomicrmw fmin %f16_vec_ptr, %f16_vec monotonic : !llvm.ptr, vector<2xf16>
+ // CHECK: atomicrmw fmaximum ptr %{{.*}}, float %{{.*}} monotonic
+ %23 = llvm.atomicrmw fmaximum %f32_ptr, %f32 monotonic : !llvm.ptr, f32
+ // CHECK: atomicrmw fminimum ptr %{{.*}}, float %{{.*}} monotonic
+ %24 = llvm.atomicrmw fminimum %f32_ptr, %f32 monotonic : !llvm.ptr, f32
+ // CHECK: atomicrmw fmaximum ptr %{{.*}}, <2 x half> %{{.*}} monotonic
+ %25 = llvm.atomicrmw fmaximum %f16_vec_ptr, %f16_vec monotonic : !llvm.ptr, vector<2xf16>
+ // CHECK: atomicrmw fminimum ptr %{{.*}}, <2 x half> %{{.*}} monotonic
+ %26 = llvm.atomicrmw fminimum %f16_vec_ptr, %f16_vec monotonic : !llvm.ptr, vector<2xf16>
// CHECK: atomicrmw volatile
// CHECK-SAME: syncscope("singlethread")
// CHECK-SAME: align 8
- %23 = llvm.atomicrmw volatile udec_wrap %i32_ptr, %i32 syncscope("singlethread") monotonic {alignment = 8 : i64} : !llvm.ptr, i32
+ %27 = llvm.atomicrmw volatile udec_wrap %i32_ptr, %i32 syncscope("singlethread") monotonic {alignment = 8 : i64} : !llvm.ptr, i32
llvm.return
}
More information about the Mlir-commits
mailing list