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

            Bug ID: 108281
           Summary: float value range estimation missing (vs. integer)
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: aleks at physik dot tu-berlin.de
  Target Milestone: ---

"gcc -O3" and optional: "-funsafe-math-optimizations" (isnan)
GCC ignores ranges of float numbers for optimization, tested via
https://godbolt.org/
For many frequent used functions (or even all in math.h) gcc could know a range
limit and concidering it for comparisons.

#include <math.h>
int ranges(float x) {
    if (x!=x) return -1; // optional NAN check
    if (cos(x) < -1.0f) return -2;
    if (sin(x) >  1.0f) return -3;
    if (fabs(x) < 0.0f) return -4;
    if (atan(x) < -2.0f) return -5; // +-PI/2
    if (exp(x) < 0.0f) return -6;
    if (sqrt(x) < 0.0f) return -7;
    if (log(x)  < 90.0f) return -8; // ln(FLT_MAX)=88.8
    // ln(DBL_MAX) = 709.8
    return 0; // the only valid return (beside -1)
}
int sqr2(float x) { // squares give non-negative results
    return x*x < 0.0f; // == false
}
int ax2(float x) {
    return fabs(x) > -1.0f; // == true
}
int cmp_sqrt(float x, float y) { // similar (!sadly very often seen!)
    //x = fabs(x); y = fabs(y); // optional sign removal line
    return sqrtf(x) < sqrtf(y); // == (x < y), hint: sqrt=slow
}

Reply via email to