Skip to content

Commit 6f39995

Browse files
authored
[mlir] Ensure fmaximum/fminimum is defined in mlir/Dialect/LLVMIR/LLVMEnums.td (#138198)
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 builders on GitHub, so I hadn't realised until @kazutakahirata notified me about it.
1 parent ae34440 commit 6f39995

File tree

4 files changed

+21
-4
lines changed

4 files changed

+21
-4
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ def AtomicBinOpUSubCond : LLVM_EnumAttrCase<"usub_cond",
110110
"usub_cond", "USubCond", 17>;
111111
def AtomicBinOpUSubSat : LLVM_EnumAttrCase<"usub_sat",
112112
"usub_sat", "USubSat", 18>;
113+
def AtomicBinOpFMaximum : LLVM_EnumAttrCase<"fmaximum", "fmaximum", "FMaximum", 19>;
114+
def AtomicBinOpFMinimum : LLVM_EnumAttrCase<"fminimum", "fminimum", "FMinimum", 20>;
113115

114116
// A sentinel value that has no MLIR counterpart.
115117
def AtomicBadBinOp : LLVM_EnumAttrCase<"", "", "BAD_BINOP", 0>;
@@ -122,7 +124,8 @@ def AtomicBinOp : LLVM_EnumAttr<
122124
AtomicBinOpNand, AtomicBinOpOr, AtomicBinOpXor, AtomicBinOpMax,
123125
AtomicBinOpMin, AtomicBinOpUMax, AtomicBinOpUMin, AtomicBinOpFAdd,
124126
AtomicBinOpFSub, AtomicBinOpFMax, AtomicBinOpFMin, AtomicBinOpUIncWrap,
125-
AtomicBinOpUDecWrap, AtomicBinOpUSubCond, AtomicBinOpUSubSat],
127+
AtomicBinOpUDecWrap, AtomicBinOpUSubCond, AtomicBinOpUSubSat,
128+
AtomicBinOpFMaximum, AtomicBinOpFMinimum],
126129
[AtomicBadBinOp]> {
127130
let cppNamespace = "::mlir::LLVM";
128131
}

mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3285,7 +3285,9 @@ void AtomicRMWOp::build(OpBuilder &builder, OperationState &state,
32853285
LogicalResult AtomicRMWOp::verify() {
32863286
auto valType = getVal().getType();
32873287
if (getBinOp() == AtomicBinOp::fadd || getBinOp() == AtomicBinOp::fsub ||
3288-
getBinOp() == AtomicBinOp::fmin || getBinOp() == AtomicBinOp::fmax) {
3288+
getBinOp() == AtomicBinOp::fmin || getBinOp() == AtomicBinOp::fmax ||
3289+
getBinOp() == AtomicBinOp::fminimum ||
3290+
getBinOp() == AtomicBinOp::fmaximum) {
32893291
if (isCompatibleVectorType(valType)) {
32903292
if (isScalableVectorType(valType))
32913293
return emitOpError("expected LLVM IR fixed vector type");

mlir/test/Target/LLVMIR/Import/instructions.ll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,11 +471,15 @@ define void @atomic_rmw(ptr %ptr1, i32 %val1, ptr %ptr2, float %val2) {
471471
%18 = atomicrmw usub_cond ptr %ptr1, i32 %val1 acquire
472472
; CHECK: llvm.atomicrmw usub_sat %[[PTR1]], %[[VAL1]] acquire
473473
%19 = atomicrmw usub_sat ptr %ptr1, i32 %val1 acquire
474+
; CHECK: llvm.atomicrmw fmaximum %[[PTR2]], %[[VAL2]] acquire
475+
%20 = atomicrmw fmaximum ptr %ptr2, float %val2 acquire
476+
; CHECK: llvm.atomicrmw fminimum %[[PTR2]], %[[VAL2]] acquire
477+
%21 = atomicrmw fminimum ptr %ptr2, float %val2 acquire
474478

475479
; CHECK: llvm.atomicrmw volatile
476480
; CHECK-SAME: syncscope("singlethread")
477481
; CHECK-SAME: {alignment = 8 : i64}
478-
%20 = atomicrmw volatile udec_wrap ptr %ptr1, i32 %val1 syncscope("singlethread") acquire, align 8
482+
%22 = atomicrmw volatile udec_wrap ptr %ptr1, i32 %val1 syncscope("singlethread") acquire, align 8
479483
ret void
480484
}
481485

mlir/test/Target/LLVMIR/llvmir.mlir

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1555,11 +1555,19 @@ llvm.func @atomicrmw(
15551555
%21 = llvm.atomicrmw fmax %f16_vec_ptr, %f16_vec monotonic : !llvm.ptr, vector<2xf16>
15561556
// CHECK: atomicrmw fmin ptr %{{.*}}, <2 x half> %{{.*}} monotonic
15571557
%22 = llvm.atomicrmw fmin %f16_vec_ptr, %f16_vec monotonic : !llvm.ptr, vector<2xf16>
1558+
// CHECK: atomicrmw fmaximum ptr %{{.*}}, float %{{.*}} monotonic
1559+
%23 = llvm.atomicrmw fmaximum %f32_ptr, %f32 monotonic : !llvm.ptr, f32
1560+
// CHECK: atomicrmw fminimum ptr %{{.*}}, float %{{.*}} monotonic
1561+
%24 = llvm.atomicrmw fminimum %f32_ptr, %f32 monotonic : !llvm.ptr, f32
1562+
// CHECK: atomicrmw fmaximum ptr %{{.*}}, <2 x half> %{{.*}} monotonic
1563+
%25 = llvm.atomicrmw fmaximum %f16_vec_ptr, %f16_vec monotonic : !llvm.ptr, vector<2xf16>
1564+
// CHECK: atomicrmw fminimum ptr %{{.*}}, <2 x half> %{{.*}} monotonic
1565+
%26 = llvm.atomicrmw fminimum %f16_vec_ptr, %f16_vec monotonic : !llvm.ptr, vector<2xf16>
15581566

15591567
// CHECK: atomicrmw volatile
15601568
// CHECK-SAME: syncscope("singlethread")
15611569
// CHECK-SAME: align 8
1562-
%23 = llvm.atomicrmw volatile udec_wrap %i32_ptr, %i32 syncscope("singlethread") monotonic {alignment = 8 : i64} : !llvm.ptr, i32
1570+
%27 = llvm.atomicrmw volatile udec_wrap %i32_ptr, %i32 syncscope("singlethread") monotonic {alignment = 8 : i64} : !llvm.ptr, i32
15631571
llvm.return
15641572
}
15651573

0 commit comments

Comments
 (0)