On Mon, 1 Dec 2014, Richard Biener wrote:
The following fixes the oldest bug in my list of assigned PRs, namely
combining A / CST / CST' to A / (CST * CST'). extract_muldiv does
this in fold-const.c (but it fails to optimize to zero when CST * CST'
overflows).
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard.
2014-12-01 Richard Biener <rguent...@suse.de>
PR tree-optimization/15346
* Makefile.in (gimple-match.o-warn): Remove -Wno-unused-parameter,
add -Wno-unused-but-set-variable.
* match.pd: Combine two successive divisions.
* gcc.dg/tree-ssa/forwprop-32.c: New testcase.
Index: gcc/match.pd
===================================================================
--- gcc/match.pd (revision 218140)
+++ gcc/match.pd (working copy)
@@ -129,6 +129,19 @@ (define_operator_list inverted_tcc_compa
&& TYPE_UNSIGNED (type))
(trunc_div @0 @1)))
+/* Combine two successive divisions. */
+(for div (trunc_div ceil_div floor_div round_div exact_div)
+ (simplify
+ (div (div @0 INTEGER_CST@1) INTEGER_CST@2)
+ (with {
+ bool overflow_p;
+ wide_int mul = wi::mul (@1, @2, TYPE_SIGN (type), &overflow_p);
+ }
+ (if (!overflow_p)
+ (div @0 { wide_int_to_tree (type, mul); }))
+ (if (overflow_p)
+ { build_zero_cst (type); }))))
+
Can't you have something like:
INT_MIN / 2 / (INT_MIN / -2) == -1
where
2 * (INT_MIN / -2)
overflows?
--
Marc Glisse