https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110419
--- Comment #15 from Mikael Morin <mikael at gcc dot gnu.org> --- rs6000_pass_by_reference returns true with -m32, and false with -m64. So the second argument is passed by reference with -m32, and by value with -m64. So the code in val looks right, it is the code in p calling val which isn't. val is declared as: void val (character(kind=1)[1:1] & restrict x, character(kind=1)[1:1] c, integer(kind=8) _x, integer(kind=8) _c) so the second argument has array type, whereas p calls val with: void p () { ... character(kind=1) char.5_3; <bb 2> : ... val (&"A"[1]{lb: 1 sz: 1}, char.5_3, 1, 1); [static-chain: &FRAME.6] so the second actual argument has non-array type.