------- Comment #1 from rguenth at gcc dot gnu dot org 2007-03-15 14:43 ------- This is blocked by the same fact as PR30317 in that ASSERT_EXPRs can only assert half-ranges or single valued ranges. This makes the following prototype not assert [0, prec) but [-INF, prec) instead :(
Index: tree-vrp.c =================================================================== *** tree-vrp.c (revision 122953) --- tree-vrp.c (working copy) *************** infer_value_range (tree stmt, tree op, e *** 3113,3118 **** --- 3113,3134 ---- } } + /* We can assume that the shift argument of a left or right shift + is within zero and the type precision of the shifted operand. */ + if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT + && (TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == RSHIFT_EXPR + || TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == LSHIFT_EXPR) + && TREE_OPERAND (GIMPLE_STMT_OPERAND (stmt, 1), 1) == op) + { + tree lop = TREE_OPERAND (GIMPLE_STMT_OPERAND (stmt, 1), 0); + tree lop_type = TREE_TYPE (lop); + + /* Unfortunately we only can infer half-ranges here. */ + *val_p = build_int_cst (lop_type, TYPE_PRECISION (lop_type) - 1); + *comp_code_p = LE_EXPR; + return true; + } + return false; } -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- BugsThisDependsOn| |30317 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31178