aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-12-17 10:29:12 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-12-17 10:29:12 +0100
commit4c57980f9d30e6947025424536eeed42bf6e1239 (patch)
tree1a8656d47d66e823737ac3e415884b56dda90702 /gcc/tree-vrp.c
parent8f94a8c4cc27e04b3c8ef2f8b650263aab6ff4db (diff)
downloadgcc-4c57980f9d30e6947025424536eeed42bf6e1239.zip
gcc-4c57980f9d30e6947025424536eeed42bf6e1239.tar.gz
gcc-4c57980f9d30e6947025424536eeed42bf6e1239.tar.bz2
re PR tree-optimization/64322 (More optimize opportunity for constant folding)
PR tree-optimization/64322 * tree-vrp.c (extract_range_from_binary_expr_1): Attempt to derive range for RSHIFT_EXPR even if vr0 range is not VR_RANGE or is symbolic. * gcc.dg/tree-ssa/vrp95.c: New test. From-SVN: r218812
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index bd238d5..c49c942 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -2434,6 +2434,7 @@ extract_range_from_binary_expr_1 (value_range_t *vr,
&& code != MAX_EXPR
&& code != PLUS_EXPR
&& code != MINUS_EXPR
+ && code != RSHIFT_EXPR
&& (vr0.type == VR_VARYING
|| vr1.type == VR_VARYING
|| vr0.type != vr1.type
@@ -2948,6 +2949,15 @@ extract_range_from_binary_expr_1 (value_range_t *vr,
{
if (code == RSHIFT_EXPR)
{
+ /* Even if vr0 is VARYING or otherwise not usable, we can derive
+ useful ranges just from the shift count. E.g.
+ x >> 63 for signed 64-bit x is always [-1, 0]. */
+ if (vr0.type != VR_RANGE || symbolic_range_p (&vr0))
+ {
+ vr0.type = type = VR_RANGE;
+ vr0.min = vrp_val_min (expr_type);
+ vr0.max = vrp_val_max (expr_type);
+ }
extract_range_from_multiplicative_op_1 (vr, code, &vr0, &vr1);
return;
}