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