aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorYury Gribov <tetra2005@gmail.com>2018-05-23 07:40:43 +0000
committerMartin Liska <marxin@gcc.gnu.org>2018-05-23 07:40:43 +0000
commitad4f3f5d4eb21c886b168a092cc7e5860e3b3119 (patch)
tree4d4faf458c5f0a9360d69a79fa3a4e41b6beae2b /gcc/tree-vrp.c
parentb72feab889cd7925fab59771269638fcc88bc195 (diff)
downloadgcc-ad4f3f5d4eb21c886b168a092cc7e5860e3b3119.zip
gcc-ad4f3f5d4eb21c886b168a092cc7e5860e3b3119.tar.gz
gcc-ad4f3f5d4eb21c886b168a092cc7e5860e3b3119.tar.bz2
re PR tree-optimization/85822 (Maybe wrong code in VRP since r249150)
PR tree-optimization/85822 From-SVN: r260566
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index aa53db6..6c482dd 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3844,10 +3844,10 @@ register_edge_assert_for_1 (tree op, enum tree_code code,
Such comparison can yield assertions like
X >= XX...X00...0
X <= XX...X11...1
- in case of COND_OP being NE_EXPR or
+ in case of COND_OP being EQ_EXPR or
X < XX...X00...0
X > XX...X11...1
- in case of EQ_EXPR. */
+ in case of NE_EXPR. */
static bool
is_masked_range_test (tree name, tree valt, enum tree_code cond_code,
@@ -3867,6 +3867,10 @@ is_masked_range_test (tree name, tree valt, enum tree_code cond_code,
wi::tree_to_wide_ref mask = wi::to_wide (maskt);
wide_int inv_mask = ~mask;
+ /* Must have been removed by now so don't bother optimizing. */
+ if (mask == 0 || inv_mask == 0)
+ return false;
+
/* Assume VALT is INTEGER_CST. */
wi::tree_to_wide_ref val = wi::to_wide (valt);
@@ -3907,9 +3911,6 @@ is_masked_range_test (tree name, tree valt, enum tree_code cond_code,
*low = wide_int_to_tree (type, val);
*high = wide_int_to_tree (type, val | inv_mask);
- if (wi::neg_p (val, TYPE_SIGN (type)))
- std::swap (*low, *high);
-
return true;
}