https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124809
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Slightly cleaned up:
unsigned short a, c, d;
short
foo (short g, short h)
{
return h;
}
short
bar (short g, short h)
{
return g;
}
__attribute__((noipa)) void
baz (...)
{
__builtin_abort ();
}
__attribute__((noinline)) int
qux (signed char g)
{
unsigned short j;
int b = 0, k;
while (d < 8)
{
if ((b = a != g) ^ a)
{
j = b + a;
k = j;
return a ? 0 : k >> a;
}
b = foo (d && c, a);
}
baz (b);
return 100;
}
__attribute__((noinline)) int
fred (signed char g)
{
unsigned short j;
int b = 0, k;
while (d < 8)
{
if ((b = a != g) ^ a)
{
j = b + a;
k = j;
return a ? 0 : k >> a;
}
b = bar (a, d && c);
}
baz (b);
return 100;
}
int
main ()
{
if (qux (1) != 1 || fred (1) != 1)
__builtin_abort ();
}