diff --git a/flang/test/Lower/OpenMP/FIR/atomic-read.f90 b/flang/test/Lower/OpenMP/FIR/atomic-read.f90 index ff2b651953f2a..0079b347fac8d 100644 --- a/flang/test/Lower/OpenMP/FIR/atomic-read.f90 +++ b/flang/test/Lower/OpenMP/FIR/atomic-read.f90 @@ -14,7 +14,7 @@ !CHECK: %[[VAR_X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"} !CHECK: %[[VAR_Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"} !CHECK: omp.atomic.read %[[VAR_X]] = %[[VAR_Y]] memory_order(acquire) hint(uncontended) : !fir.ref, i32 -!CHECK: omp.atomic.read %[[VAR_A]] = %[[VAR_B]] memory_order(relaxed) hint(none) : !fir.ref>, !fir.char<1> +!CHECK: omp.atomic.read %[[VAR_A]] = %[[VAR_B]] memory_order(relaxed) : !fir.ref>, !fir.char<1> !CHECK: omp.atomic.read %[[VAR_C]] = %[[VAR_D]] memory_order(seq_cst) hint(contended) : !fir.ref>, !fir.logical<4> !CHECK: omp.atomic.read %[[VAR_E]] = %[[VAR_F]] hint(speculative) : !fir.ref>, !fir.char<1,8> !CHECK: omp.atomic.read %[[VAR_G]] = %[[VAR_H]] hint(nonspeculative) : !fir.ref, f32 diff --git a/flang/test/Lower/OpenMP/FIR/critical.f90 b/flang/test/Lower/OpenMP/FIR/critical.f90 index c6ac818fe21aa..b86729f8a98e3 100644 --- a/flang/test/Lower/OpenMP/FIR/critical.f90 +++ b/flang/test/Lower/OpenMP/FIR/critical.f90 @@ -2,7 +2,7 @@ !RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | fir-opt --fir-to-llvm-ir | FileCheck %s --check-prefix="OMPDialect" !RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | fir-opt --fir-to-llvm-ir | tco | FileCheck %s --check-prefix="LLVMIR" -!OMPDialect: omp.critical.declare @help2 hint(none) +!OMPDialect: omp.critical.declare @help2 !OMPDialect: omp.critical.declare @help1 hint(contended) subroutine omp_critical() diff --git a/flang/test/Lower/OpenMP/critical.f90 b/flang/test/Lower/OpenMP/critical.f90 index 9fbd172df9642..5a4d2e4815df4 100644 --- a/flang/test/Lower/OpenMP/critical.f90 +++ b/flang/test/Lower/OpenMP/critical.f90 @@ -1,6 +1,6 @@ !RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s -!CHECK: omp.critical.declare @help2 hint(none) +!CHECK: omp.critical.declare @help2 !CHECK: omp.critical.declare @help1 hint(contended) subroutine omp_critical() diff --git a/mlir/test/Conversion/OpenMPToLLVM/convert-to-llvmir.mlir b/mlir/test/Conversion/OpenMPToLLVM/convert-to-llvmir.mlir index 1df27dd9957e5..881d738b413ef 100644 --- a/mlir/test/Conversion/OpenMPToLLVM/convert-to-llvmir.mlir +++ b/mlir/test/Conversion/OpenMPToLLVM/convert-to-llvmir.mlir @@ -90,7 +90,7 @@ func.func @wsloop(%arg0: index, %arg1: index, %arg2: index, %arg3: index, %arg4: // CHECK-LABEL: @atomic_write // CHECK: (%[[ARG0:.*]]: !llvm.ptr) // CHECK: %[[VAL0:.*]] = llvm.mlir.constant(1 : i32) : i32 -// CHECK: omp.atomic.write %[[ARG0]] = %[[VAL0]] hint(none) memory_order(relaxed) : !llvm.ptr, i32 +// CHECK: omp.atomic.write %[[ARG0]] = %[[VAL0]] memory_order(relaxed) : !llvm.ptr, i32 func.func @atomic_write(%a: !llvm.ptr) -> () { %1 = arith.constant 1 : i32 omp.atomic.write %a = %1 hint(none) memory_order(relaxed) : !llvm.ptr, i32 @@ -474,4 +474,4 @@ llvm.func @_QPtarget_map_with_bounds(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %x: memref) { omp.atomic.read %v = %x hint(nonspeculative, contended) : memref, i32 // CHECK: omp.atomic.read %[[v]] = %[[x]] memory_order(seq_cst) hint(contended, speculative) : memref, i32 omp.atomic.read %v = %x hint(speculative, contended) memory_order(seq_cst) : memref, i32 - // CHECK: omp.atomic.read %[[v]] = %[[x]] memory_order(seq_cst) hint(none) : memref, i32 + // CHECK: omp.atomic.read %[[v]] = %[[x]] memory_order(seq_cst) : memref, i32 omp.atomic.read %v = %x hint(none) memory_order(seq_cst) : memref, i32 return } @@ -927,7 +927,7 @@ func.func @omp_atomic_write(%addr : memref, %val : i32) { omp.atomic.write %addr = %val memory_order(relaxed) : memref, i32 // CHECK: omp.atomic.write %[[ADDR]] = %[[VAL]] hint(uncontended, speculative) : memref, i32 omp.atomic.write %addr = %val hint(speculative, uncontended) : memref, i32 - // CHECK: omp.atomic.write %[[ADDR]] = %[[VAL]] hint(none) : memref, i32 + // CHECK: omp.atomic.write %[[ADDR]] = %[[VAL]] : memref, i32 omp.atomic.write %addr = %val hint(none) : memref, i32 return } @@ -1004,7 +1004,7 @@ func.func @omp_atomic_update(%x : memref, %expr : i32, %xBool : memref, omp.yield(%const:i32) } - // CHECK: omp.atomic.update hint(none) %[[X]] : memref + // CHECK: omp.atomic.update %[[X]] : memref // CHECK-NEXT: (%[[XVAL:.*]]: i32): // CHECK-NEXT: %[[NEWVAL:.*]] = llvm.add %[[XVAL]], %[[EXPR]] : i32 // CHECK-NEXT: omp.yield(%[[NEWVAL]] : i32) @@ -1181,7 +1181,7 @@ func.func @omp_atomic_capture(%v: memref, %x: memref, %expr: i32) { omp.atomic.write %x = %expr : memref, i32 } - // CHECK: omp.atomic.capture hint(none) { + // CHECK: omp.atomic.capture { // CHECK-NEXT: omp.atomic.update %[[x]] : memref // CHECK-NEXT: (%[[xval:.*]]: i32): // CHECK-NEXT: %[[newval:.*]] = llvm.add %[[xval]], %[[expr]] : i32 diff --git a/mlir/tools/mlir-tblgen/OpFormatGen.cpp b/mlir/tools/mlir-tblgen/OpFormatGen.cpp index bdb97866a47fc..18ca34379a71a 100644 --- a/mlir/tools/mlir-tblgen/OpFormatGen.cpp +++ b/mlir/tools/mlir-tblgen/OpFormatGen.cpp @@ -2009,6 +2009,16 @@ static void genEnumAttrPrinter(const NamedAttribute *var, const Operator &op, " }\n"; } +/// Generate a check that a DefaultValuedAttr has a value that is non-default. +static void genNonDefaultValueCheck(MethodBody &body, const Operator &op, + AttributeVariable &attrElement) { + FmtContext fctx; + Attribute attr = attrElement.getVar()->attr; + fctx.withBuilder("::mlir::OpBuilder((*this)->getContext())"); + body << " && " << op.getGetterName(attrElement.getVar()->name) << "Attr() != " + << tgfmt(attr.getConstBuilderTemplate(), &fctx, attr.getDefaultValue()); +} + /// Generate the check for the anchor of an optional group. static void genOptionalGroupPrinterAnchor(FormatElement *anchor, const Operator &op, @@ -2042,12 +2052,7 @@ static void genOptionalGroupPrinterAnchor(FormatElement *anchor, if (attr.hasDefaultValue()) { // Consider a default-valued attribute as present if it's not the // default value. - FmtContext fctx; - fctx.withBuilder("::mlir::OpBuilder((*this)->getContext())"); - body << " && " << op.getGetterName(element->getVar()->name) - << "Attr() != " - << tgfmt(attr.getConstBuilderTemplate(), &fctx, - attr.getDefaultValue()); + genNonDefaultValueCheck(body, op, *element); return; } llvm_unreachable("attribute must be optional or default-valued"); @@ -2158,7 +2163,6 @@ void OperationFormat::genElementPrinter(FormatElement *element, // Emit the OIList if (auto *oilist = dyn_cast(element)) { - genLiteralPrinter(" ", body, shouldEmitSpace, lastWasPunctuation); for (auto clause : oilist->getClauses()) { LiteralElement *lelement = std::get<0>(clause); ArrayRef pelement = std::get<1>(clause); @@ -2170,8 +2174,14 @@ void OperationFormat::genElementPrinter(FormatElement *element, for (VariableElement *var : vars) { TypeSwitch(var) .Case([&](AttributeVariable *attrEle) { - body << " || " << op.getGetterName(attrEle->getVar()->name) + body << " || (" << op.getGetterName(attrEle->getVar()->name) << "Attr()"; + Attribute attr = attrEle->getVar()->attr; + if (attr.hasDefaultValue()) { + // Don't print default-valued attributes. + genNonDefaultValueCheck(body, op, *attrEle); + } + body << ")"; }) .Case([&](OperandVariable *ele) { if (ele->getVar()->isVariadic()) {