From da11c5d2261283280dade0b9a7942ed56c4e67de Mon Sep 17 00:00:00 2001 From: Diego Novillo Date: Tue, 8 Nov 2005 16:09:51 -0500 Subject: [PATCH] re PR c++/23046 (ICE in set_value_range, at tree-vrp.c:191) 2005-11-08 James A. Morrison Diego Novillo PR 23046 * tree-vrp.c (register_edge_assert_for): Do not register always-false predicates. testsuite/ PR 23046 * g++.dg/tree-ssa/pr23046.C: New test. From-SVN: r106656 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/tree-ssa/pr23046.C | 11 +++++++++++ gcc/tree-vrp.c | 18 ++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr23046.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f792d3..5d6bfe6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-11-08 James A. Morrison + Diego Novillo + + PR 23046 + * tree-vrp.c (register_edge_assert_for): Do not register + always-false predicates. + 2005-11-08 Devang Patel PR tree-optimization/23115 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6ea0741..6444335 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-11-08 Diego Novillo + + PR 23046 + * g++.dg/tree-ssa/pr23046.C: New test. + 2005-11-08 Devang Patel PR tree-optimization/23115 diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr23046.C b/gcc/testsuite/g++.dg/tree-ssa/pr23046.C new file mode 100644 index 0000000..eb8f395 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr23046.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +enum eumtype { ENUM1, ENUM2 }; +void g(const eumtype kind ); +void f(long i); +void g(const eumtype kind) +{ + if ((kind != ENUM1) && (kind != ENUM2)) + f(kind); +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 929908b..d49c4d4 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -2504,6 +2504,24 @@ register_edge_assert_for (tree name, edge e, block_stmt_iterator si) need to invert the sign comparison. */ if (is_else_edge) comp_code = invert_tree_comparison (comp_code, 0); + + /* Do not register always-false predicates. FIXME, this + works around a limitation in fold() when dealing with + enumerations. Given 'enum { N1, N2 } x;', fold will not + fold 'if (x > N2)' to 'if (0)'. */ + if ((comp_code == GT_EXPR || comp_code == LT_EXPR) + && (INTEGRAL_TYPE_P (TREE_TYPE (val)) + || SCALAR_FLOAT_TYPE_P (TREE_TYPE (val)))) + { + tree min = TYPE_MIN_VALUE (TREE_TYPE (val)); + tree max = TYPE_MAX_VALUE (TREE_TYPE (val)); + + if (comp_code == GT_EXPR && compare_values (val, max) == 0) + return false; + + if (comp_code == LT_EXPR && compare_values (val, min) == 0) + return false; + } } } else -- 2.7.4