From 4c445590e158cf39a9ca00fa1586b25c0851bd72 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 18 Apr 2013 09:54:58 +0200 Subject: [PATCH] re PR tree-optimization/56984 (ICE in tree_vrp.c) PR tree-optimization/56984 * tree-vrp.c (register_edge_assert_for_2): For (x >> M) < N and (x >> M) >= N don't register any assertion if N << M is the minimum value. * gcc.c-torture/compile/pr56984.c: New test. From-SVN: r198051 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.c-torture/compile/pr56984.c | 9 +++++++++ gcc/tree-vrp.c | 8 +++++++- 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr56984.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 104f3170c74..fd7d6efc8fa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-04-18 Jakub Jelinek + + PR tree-optimization/56984 + * tree-vrp.c (register_edge_assert_for_2): For (x >> M) < N + and (x >> M) >= N don't register any assertion if N << M is the + minimum value. + 2013-04-18 Steven Bosscher * lower-subreg.c (resolve_simple_move): If called self-recursive, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 61d7a8245b1..64ffe8f4a7e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2013-04-18 Jakub Jelinek + PR tree-optimization/56984 + * gcc.c-torture/compile/pr56984.c: New test. + PR rtl-optimization/56992 * gcc.dg/pr56992.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr56984.c b/gcc/testsuite/gcc.c-torture/compile/pr56984.c new file mode 100644 index 00000000000..bd00bee88ee --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr56984.c @@ -0,0 +1,9 @@ +/* PR tree-optimization/56984 */ + +int +foo (int x) +{ + if ((x >> 31) < -1) + x++; + return x; +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index be1a3808cf5..5b4321a3a27 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -4895,7 +4895,13 @@ register_edge_assert_for_2 (tree name, edge e, gimple_stmt_iterator bsi, new_comp_code = comp_code == EQ_EXPR ? LE_EXPR : GT_EXPR; } else if (comp_code == LT_EXPR || comp_code == GE_EXPR) - new_val = val2; + { + double_int minval + = double_int::min_value (prec, TYPE_UNSIGNED (TREE_TYPE (val))); + new_val = val2; + if (minval == tree_to_double_int (new_val)) + new_val = NULL_TREE; + } else { double_int maxval -- 2.30.2