This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug middle-end/31058] overflow warnings should not be enabled with -Wall



------- Comment #22 from rguenth at gcc dot gnu dot org  2007-03-08 16:38 -------
Note that one reason we do not optimize the dead code is the stupidity of VRP
dealing with the IL in the second pass.  While in the first pass VRP figures
out a range of [0,5] for w_6 in

<bb 2>:
  uexp.1_1 = uexp;
  if (uexp.1_1 <= 159) goto <L0>; else goto <L1>;

<L0>:;
  D.1770_3 = 160 - uexp.1_1;
  D.1778_5 = D.1770_3 >> 5;
  w_6 = (int) D.1778_5;

in the second VRP pass we get w_6 as varying...  Appearantly the difference
starts with the

   D.1778_5 = D.1770_3 >> 5;

statement where the first pass gets [0, 5] and the second [0, +INF].  It
looks like this is because the first pass sees

   D.1778_5 = D.1770_3 / 32;

instead.  It seems to be the VRP pass itself calling fold_stmt on the
division and producing the (unhandled) division.  Fixing that makes the
warning (and the dead code) go away.

Index: gcc/tree-vrp.c
===================================================================
*** gcc/tree-vrp.c      (revision 122691)
--- gcc/tree-vrp.c      (working copy)
*************** extract_range_from_binary_expr (value_ra
*** 1568,1573 ****
--- 1568,1574 ----
        && code != CEIL_DIV_EXPR
        && code != EXACT_DIV_EXPR
        && code != ROUND_DIV_EXPR
+       && code != RSHIFT_EXPR
        && code != MIN_EXPR
        && code != MAX_EXPR
        && code != BIT_AND_EXPR
*************** extract_range_from_binary_expr (value_ra
*** 1735,1741 ****
           || code == FLOOR_DIV_EXPR
           || code == CEIL_DIV_EXPR
           || code == EXACT_DIV_EXPR
!          || code == ROUND_DIV_EXPR)
      {
        tree val[4];
        size_t i;
--- 1736,1743 ----
           || code == FLOOR_DIV_EXPR
           || code == CEIL_DIV_EXPR
           || code == EXACT_DIV_EXPR
!          || code == ROUND_DIV_EXPR
!          || code == RSHIFT_EXPR)
      {
        tree val[4];
        size_t i;


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31058


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]