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;
}

Reply via email to