Implement ranger folder for __builtin_signbit.
authorAldy Hernandez <aldyh@redhat.com>
Wed, 31 Aug 2022 12:41:29 +0000 (14:41 +0200)
committerAldy Hernandez <aldyh@redhat.com>
Thu, 1 Sep 2022 11:19:08 +0000 (13:19 +0200)
commit0550e306d4b5aaf7bdb6e908d265dbaa63344271
treee61be0d9aa862d268cae28a2f69c4bcf8f89aed0
parente9b0dd2afe7a9e8a3033340dfa26ec606930eef5
Implement ranger folder for __builtin_signbit.

Now that we keep track of the signbit, we can use it to fold __builtin_signbit.

I am assuming I don't have try too hard to get the actual signbit
number and 1 will do.  Especially, since we're inconsistent in trunk whether
we fold the builtin or whether we calculate it at runtime.

abulafia:~$ cat a.c
float nzero = -0.0;

main(){
    printf("0x%x\n", __builtin_signbit(-0.0));
    printf("0x%x\n", __builtin_signbit(nzero));
}
abulafia:~$ gcc a.c -w && ./a.out
0x1
0x80000000

It is amazing that we've been failing to fold something as simple as
this:

if (x > 5.0)
  num = __builtin_signbit (x);

It does the right thing now :-P.

gcc/ChangeLog:

* gimple-range-fold.cc
(fold_using_range::range_of_builtin_int_call): Add case for
CFN_BUILT_IN_SIGNBIT.

gcc/testsuite/ChangeLog:

* gcc.dg/tree-ssa/vrp-float-signbit-1.c: New test.
gcc/gimple-range-fold.cc
gcc/testsuite/gcc.dg/tree-ssa/vrp-float-signbit-1.c [new file with mode: 0644]