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

Reply via email to