https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92305
--- Comment #15 from Tobias Burnus <burnus at gcc dot gnu.org> --- The mentioned patch (for a related case but not relevant for this bug) is now committed as r278114, see https://gcc.gnu.org/ml/gcc-patches/2019-11/msg00990.html Regarding the issue in this bug: Janne pointed out that powerpc64le-unknown-linux-gnu is LE and (segher:) "it is obviously ELFv2 code" / "so, it's LE". Which means the endian issue is not the problem. The data type matches caller and callee as far as I debugged (looking at the source code and debug_tree). (Namely, all Boolean arguments are one-byte types.) New hypothesis: 00:28 < segher> there are only 8 integer argument registers; everything after that goes in memory 00:28 < segher> in your testcase, two things are passed via memory 00:29 < segher> those are of course suspicious, but it could be something else entirely that is going wrong I created a C test case, which is very similar (esp. on -O0 -fdump-tree-optimized level, Fortran has more of insn in the -fdump-rtl-expand) and the C one works. Maybe it helps someone to understand the issue better; it didn't help me so far. – Fortran example is in Comment 9, C example is here: #include <stdbool.h> #include <stdlib.h> void callee(double aa, double bb, void *c_aptr, void *c_bptr, double **aptr, double **bptr, bool _aa, bool _bb, bool _c_aptr, bool _c_bptr) { if (!_c_aptr | !_c_bptr) abort(); } void caller() { double aa, bb; void *c_aptr, *c_bptr; double *aptr, *bptr; callee (aa, bb, c_aptr, c_bptr, &aptr, &bptr, true, true, true, true); } int main() { caller(); return 0; }