[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