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

            Bug ID: 67287
           Summary: FRE should CSE sqrt() calls even with -ferrno-math
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
  Target Milestone: ---

double sqrt(double x);
double t (double x)
{
  double a = sqrt (x);
  double b = sqrt (x);
  return a * b;
}

should be optimized to

double t (double x)
{
  double a = sqrt (x);
  return a * a;
}

with -fmath-errno.  FRE currently gives up too early and the alias oracle
can handle errno-style references (but it can't use a call as a "ref", so
the "errno"-only side-effect has to be modeled by creating a special ref
for performing the walking for math builtins setting errno as their only
side-effect).

We may not miscompile

  sqrt (x);
  errno = 0;
  sqrt (x);
  if (errno != 0)
   ...

to CSE the second sqrt.

Reply via email to