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

--- Comment #3 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Maxim Egorushkin from comment #2)

> Could you provide an example where that "dangerous optimization" would break
> well-formed code please?

--cut here--
#include <stdio.h>

void positive (int a) { printf ("positive: %i\n", a); }
void nonpositive (int a) { printf ("nonpositive: %i\n", a); }

void
__attribute__((noinline))
g (int a, int b)
{
  int diff = a - b;

  if (diff > 0)
    return positive (diff);
  else
    return nonpositive (diff);
}

int
main ()
{
  int a = -0x80000000;
  int b = 0x01;

  g (a, b);

  return 0;
}
--cut here--

$ gcc -O2 ttt.c
$ ./a.out
positive: 2147483647

$ gcc -O0 ttt.c
$ ./a.out
positive: 2147483647

$ clang -O2 ttt.c
$ ./a.out
nonpositive: 2147483647          <--------- HERE!

$ clang -O0 ttt.c
$ ./a.out
positive: 2147483647

Reply via email to