[flang-commits] [flang] [mlir] [flang][OpenMP] Support for "atomic compare capture" (PR #202315)

Tom Eccles via flang-commits flang-commits at lists.llvm.org
Thu Jun 18 09:41:44 PDT 2026


================
@@ -617,6 +646,17 @@ void Fortran::lower::omp::lowerAtomic(
       expectedVal = builder.createConvert(loc, elemTypeOfX, expectedVal);
     }
 
+    // If this is a compare+capture, generate the read op first.
----------------
tblah wrote:

This miss categorises cases where the read op is conditional for example
```
subroutine s_fail_only(x, e, d, v)
  integer :: x, e, d, v
  !$omp atomic compare capture
  if (x .eq. e) then
    x = d
  else
    v = x
  end if
  !$omp end atomic
end subroutine
```

Generates `v=x` unconditionally:
```
  func.func @_QPs_fail_only(%arg0: !fir.ref<i32> {fir.bindc_name = "x"}, %arg1: !fir.ref<i32> {fir.bindc_name = "e"}, %arg2: !fir.ref<i32> {fir.bindc_name = "d"}, %arg3: !fir.ref<i32> {fir.bindc_name = "v"}) {
    %0 = fir.dummy_scope : !fir.dscope
    %1:2 = hlfir.declare %arg2 dummy_scope %0 arg 3 {uniq_name = "_QFs_fail_onlyEd"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
    %2:2 = hlfir.declare %arg1 dummy_scope %0 arg 2 {uniq_name = "_QFs_fail_onlyEe"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
    %3:2 = hlfir.declare %arg3 dummy_scope %0 arg 4 {uniq_name = "_QFs_fail_onlyEv"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
    %4:2 = hlfir.declare %arg0 dummy_scope %0 arg 1 {uniq_name = "_QFs_fail_onlyEx"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
    %5 = fir.load %2#0 : !fir.ref<i32>
    omp.atomic.capture memory_order(relaxed) {
      omp.atomic.read %3#0 = %4#0 : !fir.ref<i32>, !fir.ref<i32>, i32
      omp.atomic.compare %4#0 : !fir.ref<i32> {
      ^bb0(%arg4: i32):
        %6 = arith.cmpi eq, %arg4, %5 : i32
        %7 = fir.load %1#0 : !fir.ref<i32>
        %8 = arith.select %6, %7, %arg4 : i32
        omp.yield(%8 : i32)
      }
    }
    return
  }
}
```

https://github.com/llvm/llvm-project/pull/202315


More information about the flang-commits mailing list