https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124171
--- Comment #2 from Vineet Gupta <vineetg at gcc dot gnu.org> ---
While the changes above fix the argument promotion in caller, it seems to
regress the return value promotion in caller (which was already happening, but
not anymore for some cases).
_Bool bar_bool(void);
int foo_bool_ne1(void) {
if (bar_bool() != 1) return 0; else return 1;
}
-O2
W/ patch (NOK) | w/o patch (OK)
|
foo_bool_ne1: | foo_bool_ne1:
call bar_bool | call bar_bool
exit | r0 &= 0xff
| exit
Weirdly this works for char, and even for bool case above with != 0
_Bool bar_bool(void);
int foo_bool_ne0(void) {
if (bar_bool() != 0) return 0; else return 1;
}
foo_bool_ne0:
call bar_bool
w0 ^= 1
r0 &= 0xff
exit
Currently debugging this.