[flang-commits] [flang] [llvm] [flang][MIF] Adding lowering for EVENT POST/WAIT statements (PR #210283)
Dan Bonachea via flang-commits
flang-commits at lists.llvm.org
Mon Aug 17 21:54:24 PDT 2026
================
@@ -0,0 +1,45 @@
+// RUN: fir-opt --mif-convert %s | FileCheck %s
+
+func.func @_QQmain() attributes {fir.bindc_name = "EVENT_TEST"} {
+ %0 = fir.alloca !fir.array<0xi64>
+ %1 = fir.alloca !fir.array<1xi64>
+ %2 = fir.dummy_scope : !fir.dscope
+ %3 = fir.address_of(@_QFEdata_ready) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_event_type{_QM__fortran_builtinsT__builtin_event_type.__m1:i64,_QM__fortran_builtinsT__builtin_event_type.__m2:i64,_QM__fortran_builtinsT__builtin_event_type.__m3:i64,_QM__fortran_builtinsT__builtin_event_type.__m4:i64,_QM__fortran_builtinsT__builtin_event_type.__m5:i64,_QM__fortran_builtinsT__builtin_event_type.__m6:i64,_QM__fortran_builtinsT__builtin_event_type.__m7:i64,_QM__fortran_builtinsT__builtin_event_type.__m8:i64}>>
+ %c1_i64 = arith.constant 1 : i64
+ %c0 = arith.constant 0 : index
+ %4 = fir.coordinate_of %1, %c0 : (!fir.ref<!fir.array<1xi64>>, index) -> !fir.ref<i64>
+ fir.store %c1_i64 to %4 : !fir.ref<i64>
+ %5 = fir.embox %1 : (!fir.ref<!fir.array<1xi64>>) -> !fir.box<!fir.array<1xi64>>
+ %6 = fir.embox %0 : (!fir.ref<!fir.array<0xi64>>) -> !fir.box<!fir.array<0xi64>>
+ mif.alloc_coarray %3 lcobounds %5 ucobounds %6 {uniq_name = "_QFEdata_ready"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_event_type{_QM__fortran_builtinsT__builtin_event_type.__m1:i64,_QM__fortran_builtinsT__builtin_event_type.__m2:i64,_QM__fortran_builtinsT__builtin_event_type.__m3:i64,_QM__fortran_builtinsT__builtin_event_type.__m4:i64,_QM__fortran_builtinsT__builtin_event_type.__m5:i64,_QM__fortran_builtinsT__builtin_event_type.__m6:i64,_QM__fortran_builtinsT__builtin_event_type.__m7:i64,_QM__fortran_builtinsT__builtin_event_type.__m8:i64}>>, !fir.box<!fir.array<1xi64>>, !fir.box<!fir.array<0xi64>>) -> ()
+ %7:2 = hlfir.declare %3 {uniq_name = "_QFEdata_ready"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_event_type{_QM__fortran_builtinsT__builtin_event_type.__m1:i64,_QM__fortran_builtinsT__builtin_event_type.__m2:i64,_QM__fortran_builtinsT__builtin_event_type.__m3:i64,_QM__fortran_builtinsT__builtin_event_type.__m4:i64,_QM__fortran_builtinsT__builtin_event_type.__m5:i64,_QM__fortran_builtinsT__builtin_event_type.__m6:i64,_QM__fortran_builtinsT__builtin_event_type.__m7:i64,_QM__fortran_builtinsT__builtin_event_type.__m8:i64}>>) -> (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_event_type{_QM__fortran_builtinsT__builtin_event_type.__m1:i64,_QM__fortran_builtinsT__builtin_event_type.__m2:i64,_QM__fortran_builtinsT__builtin_event_type.__m3:i64,_QM__fortran_builtinsT__builtin_event_type.__m4:i64,_QM__fortran_builtinsT__builtin_event_type.__m5:i64,_QM__fortran_builtinsT__builtin_event_type.__m6:i64,_QM__fortran_builtinsT__builtin_event_type.__m7:i64,_QM__fortran_builtinsT__builtin_event_type.__m8:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_event_type{_QM__fortran_builtinsT__builtin_event_type.__m1:i64,_QM__fortran_builtinsT__builtin_event_type.__m2:i64,_QM__fortran_builtinsT__builtin_event_type.__m3:i64,_QM__fortran_builtinsT__builtin_event_type.__m4:i64,_QM__fortran_builtinsT__builtin_event_type.__m5:i64,_QM__fortran_builtinsT__builtin_event_type.__m6:i64,_QM__fortran_builtinsT__builtin_event_type.__m7:i64,_QM__fortran_builtinsT__builtin_event_type.__m8:i64}>>)
----------------
bonachea wrote:
> Normally, this should be fixed with the rebase and the latest commit added. The default initialization is performed in the body of the fir.global level for the “_QFEdata_ready” variable.
@JDPailleux Unfortunately that didn't work. I suspect you don't understand the problem.
The `_QFEdata_ready` global variable is not the coarray event data, it just holds a _pointer_ to the coarray `event_type` data on the coarray heap. The coarray heap object where the `event_type` data lives is currently allocated inside `_QQmain` by `mif.alloc_coarray`/`prif_allocate_coarray`. The initialization of the coarray `event_type` data must happen _AFTER_ the coarray heap space is allocated by `mif.alloc_coarray`/`prif_allocate_coarray` (because it doesn't exist before then), and that still appears to not be happening.
I've confirmed using 3f6bfad5d7f7d5cfcc0a50904712a63a464e8889 and a debugger that the coarray heap space allocated by `prif_allocate_coarray` for the event variable remains uninitialized:
```cgpu$ cat event_test2.F90
program event_test
use iso_fortran_env, only: event_type
implicit none
type(event_type) :: data_ready[*]
integer :: me
me = this_image()
event post(data_ready[1])
if (me == 1) then
event wait(data_ready, UNTIL_COUNT=1)
end if
end program
cgpu$ flang --version
flang version 24.0.0git (git at github.com:SiPearl/llvm-project.git 3f6bfad5d7f7d5cfcc0a50904712a63a464e8889)
Target: x86_64-unknown-linux-gnu
Thread model: posix
cgpu$ flang -g -O0 -fcoarray event_test2.F90 -L <redacted>/lib/ -lcaffeine-smp-seq -lgasnet-smp-seq
warning: Support for multi image Fortran features is still experimental and in development.
cgpu$ env GASNET_PSHM_NODES=1 gdb ./a.out
GNU gdb (Ubuntu 15.1-1ubuntu1~24.04.1) 15.1
[...]
Reading symbols from ./a.out...
(gdb) r
Starting program: <redacted>/flang/a.out
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
^C
Program received signal SIGINT, Interrupt.
0x000055555556cbcd in gasneti_nonatomic_read (
_p=0x555555827394 <_gasneti_progressfn_enabled_gasneti_pf_debug_counted_COUNTED>, _flags=0)
at inst-llvm-inst-events2/include/gasnet_atomicops.h:1040
1040 GASNETI_ATOMIC_FENCED_READ_DEFN(nonatomic,gasneti_nonatomic_read,_gasneti_scalar_atomic_read,gasneti_nonatomic_)
(gdb) where
#0 0x000055555556cbcd in gasneti_nonatomic_read (
_p=0x555555827394 <_gasneti_progressfn_enabled_gasneti_pf_debug_counted_COUNTED>, _flags=0)
at inst-llvm-inst-events2/include/gasnet_atomicops.h:1040
#1 0x0000555555567b4c in _gasneti_AMPoll () at inst-llvm-inst-events2/include/gasnet_help.h:1323
#2 0x000055555556bf16 in _gasnet_AMPoll () at inst-llvm-inst-events2/include/gasnet_help.h:1535
#3 0x000055555556be02 in caf_event_wait (event_var_ptr=0x7fffef8006a8, threshold=1, segment_boundary=1,
acquire_fence=1, maybe_concurrent=0) at ././src/caffeine/caffeine.c:436
#4 0x0000555555574161 in prif::prif_event_wait (event_var_ptr=..., until_count=1,
stat=<error reading variable: Cannot access memory at address 0x0>, errmsg=...,
errmsg_alloc=<error reading variable: Location address is not set.>)
at <redacted>/caffeine/src/caffeine/events_s.F90:45
#5 0x0000555555560eec in EVENT_TEST () at event_test2.F90:12
(gdb) frame 3
#3 0x000055555556be02 in caf_event_wait (event_var_ptr=0x7fffef8006a8, threshold=1, segment_boundary=1,
acquire_fence=1, maybe_concurrent=0) at ././src/caffeine/caffeine.c:436
436 gasnet_AMPoll();
(gdb) print/x event_var_ptr
$3 = 0x7fffef8006a8
(gdb) print/x *(uint64_t(*)[8])event_var_ptr
$7 = {0xdeadbeefdeadbef0, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef,
0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef, 0xdeadbeefdeadbeef}
```
`0xdeadbeef` is the "poison" initialization value that recent versions of Caffeine write to coarray heap memory at allocation time with `-DASSERTIONS`, showing this event coarray was never initialized after allocation. The first word is `0xdeadbef0` because the `prif_event_post` operation incremented the garbage value by 1.
If you try with a recent snapshot of Caffeine `main` branch built with `-DASSERTIONS` you should also see a hang inside `prif_event_wait` and these same uninitialized poison values.
https://github.com/llvm/llvm-project/pull/210283
More information about the flang-commits
mailing list