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

--- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> ---
Testcase that we'd break with removing the canonicalization for the
non-single-use case:

int bar (double, double);
int
foo (double a)
{
  double x = 2./a;
  double y = 4./a;
  return x * 2.  == y || bar (x, y);
}

note that the transform is guarded with a different flag than the reverse
done by the recip pass (-fassociative-math vs. -freciprocal-math).  So it
isn't a canonicalization (which we should be able to always undo).

That said, before moving the pattern it was effectively only applied to
the single-use (if GIMPLE optimizers didn't feed fold with enough IL to
trigger it).

Reply via email to