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).