[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