diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td @@ -28,14 +28,17 @@ def FMFcontract : I32BitEnumAttrCaseBit<"contract", 4>; def FMFafn : I32BitEnumAttrCaseBit<"afn", 5>; def FMFreassoc : I32BitEnumAttrCaseBit<"reassoc", 6>; -def FMFfast : I32BitEnumAttrCaseBit<"fast", 7>; +def FMFfast : I32BitEnumAttrCaseGroup<"fast", + [ FMFnnan, FMFninf, FMFnsz, FMFarcp, FMFcontract, FMFafn, FMFreassoc]>; def FastmathFlags : I32BitEnumAttr< "FastmathFlags", "LLVM fastmath flags", [FMFnnan, FMFninf, FMFnsz, FMFarcp, FMFcontract, FMFafn, FMFreassoc, FMFfast ]> { + let separator = ","; let cppNamespace = "::mlir::LLVM"; + let printBitEnumPrimaryGroups = 1; } def LLVM_FMFAttr : DialectAttr< diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp --- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp +++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp @@ -2839,26 +2839,9 @@ op->hasTrait(); } -static constexpr const FastmathFlags fastmathFlagsList[] = { - // clang-format off - FastmathFlags::nnan, - FastmathFlags::ninf, - FastmathFlags::nsz, - FastmathFlags::arcp, - FastmathFlags::contract, - FastmathFlags::afn, - FastmathFlags::reassoc, - FastmathFlags::fast, - // clang-format on -}; - void FMFAttr::print(AsmPrinter &printer) const { printer << "<"; - auto flags = llvm::make_filter_range(fastmathFlagsList, [&](auto flag) { - return bitEnumContains(this->getFlags(), flag); - }); - llvm::interleaveComma(flags, printer, - [&](auto flag) { printer << stringifyEnum(flag); }); + printer << stringifyFastmathFlags(this->getFlags()); printer << ">"; } diff --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp --- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp @@ -157,7 +157,6 @@ {FastmathFlags::contract, &llvmFMF::setAllowContract}, {FastmathFlags::afn, &llvmFMF::setApproxFunc}, {FastmathFlags::reassoc, &llvmFMF::setAllowReassoc}, - {FastmathFlags::fast, &llvmFMF::setFast}, // clang-format on }; llvm::FastMathFlags ret; diff --git a/mlir/test/Dialect/LLVMIR/roundtrip.mlir b/mlir/test/Dialect/LLVMIR/roundtrip.mlir --- a/mlir/test/Dialect/LLVMIR/roundtrip.mlir +++ b/mlir/test/Dialect/LLVMIR/roundtrip.mlir @@ -444,7 +444,7 @@ // CHECK: {{.*}} = llvm.fadd %arg0, %arg1 : f32 %8 = llvm.fadd %arg0, %arg1 {fastmathFlags = #llvm.fastmath<>} : f32 -// CHECK: {{.*}} = llvm.fadd %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 +// CHECK: {{.*}} = llvm.fadd %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 %9 = llvm.fadd %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 // CHECK: {{.*}} = llvm.fneg %arg0 : f32