This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/31178] VRP can infer a range for b in a >> b and a << b
- From: "rguenth at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 15 Mar 2007 14:43:36 -0000
- Subject: [Bug tree-optimization/31178] VRP can infer a range for b in a >> b and a << b
- References: <bug-31178-10053@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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