https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103857

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #3)
> Reduced testcase:
> int f(int a, int b, int c)
> {
>   if (a != b && a != c) __builtin_unreachable();
>   return a == b ? b : c;
> }
> 
> This should just translate into:
> int f1(int a, int b, int c)
> {
>   if (a != b && a != c) __builtin_unreachable();
>   return a;
> }
> 
> The ^ part is not needed really if it is just selecting between two values.

Oh it was swapping around the two values:

int f(int a, int b, int c)
{
  if (a != b && a != c) __builtin_unreachable();
  return a == b ? c : b;
}
int f1(int a, int b, int c)
{
  if (a != b && a != c) __builtin_unreachable();
  return a ^ b ^ c;
}

And then the ^ are needed.

Reply via email to