https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92305
--- Comment #8 from Tobias Burnus <burnus at gcc dot gnu.org> --- (In reply to Thomas Schwinge from comment #6) > On powerpc64le-unknown-linux-gnu I can reproduce it on a powerpc64le-unknown-linux-gnu w/o real offloading. It fails here for subroutine test_dummy_opt_val_callee_2 for if (.not.present(c_aptr) .or. .not.present(c_bptr)) stop 150 as both are marked as not present – that's completely unrelated to OpenMP (and happens with and without -fopenmp). The callee and caller are: test_dummy_opt_val_callee_2 (real(kind=8) aa, real(kind=8) bb, void * c_aptr, void * c_bptr, real(kind=8) * * aptr, real(kind=8) * * bptr, logical(kind=1) _aa, logical(kind=1) _bb, logical(kind=1) _c_aptr, logical(kind=1) _c_bptr) … if ((logical(kind=4)) !_c_aptr || (logical(kind=4)) !_c_bptr) _gfortran_stop_numeric (150, 0); And the call is: test_dummy_opt_val_callee_2 (aa, bb, c_aptr, c_bptr, &aptr, &bptr, 1, 1, 1, 1); At a glance, that looks fine – and a minimal test case also passes. My feeling is that something with passing the arguments goes wrong – which is hidden in the gimple and not visible in the tree dump.