https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69556
James Greenhalgh <jgreenhalgh at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jgreenhalgh at gcc dot gnu.org,
| |rguenth at gcc dot gnu.org
--- Comment #3 from James Greenhalgh <jgreenhalgh at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #2)
> (In reply to Andrew Pinski from comment #1)
> > I suspect we should disable "Fold (C1/X)*C2 into (C1*C2)/X" for gimple then
> > and have it only for generic.
>
> Or check for single use of the divide.
I had thought that was what the :s in the first line of pattern was trying to
do:
(simplify
(mult (rdiv:s REAL_CST@0 @1) REAL_CST@2)
(if (flag_associative_math)
(with
{ tree tem = const_binop (MULT_EXPR, type, @0, @2); }
(if (tem)
(rdiv { tem; } @1)))))
If I capture the rdiv, and explicitly check it for single_use (as in the
untested patch below), then the rule fails. So there's either a
misunderstanding/disagreement here about what :s implies, or the match.pd
machinery has a bug.
diff --git a/gcc/match.pd b/gcc/match.pd
index 5f28215..9460a9b 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -445,11 +445,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
/* Fold (C1/X)*C2 into (C1*C2)/X. */
(simplify
- (mult (rdiv:s REAL_CST@0 @1) REAL_CST@2)
+ (mult (rdiv:s@3 REAL_CST@0 @1) REAL_CST@2)
(if (flag_associative_math)
(with
{ tree tem = const_binop (MULT_EXPR, type, @0, @2); }
- (if (tem)
+ (if (tem && single_use (@3))
(rdiv { tem; } @1)))))
/* Convert C1/(X*C2) into (C1/C2)/X */