diff options
author | Diego Novillo <dnovillo@gcc.gnu.org> | 2005-11-08 16:09:51 -0500 |
---|---|---|
committer | Diego Novillo <dnovillo@gcc.gnu.org> | 2005-11-08 16:09:51 -0500 |
commit | da11c5d2261283280dade0b9a7942ed56c4e67de (patch) | |
tree | 7ce2ce0fa788bb9692659c1a68227c1f9d006c4c | |
parent | 230d8ead8c85ba9068412c1773401b0f1cd44148 (diff) | |
download | gcc-da11c5d2261283280dade0b9a7942ed56c4e67de.zip gcc-da11c5d2261283280dade0b9a7942ed56c4e67de.tar.gz gcc-da11c5d2261283280dade0b9a7942ed56c4e67de.tar.bz2 |
re PR c++/23046 (ICE in set_value_range, at tree-vrp.c:191)
2005-11-08 James A. Morrison <phython@gcc.gnu.org>
Diego Novillo <dnovillo@redhat.com>
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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr23046.C | 11 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 18 |
4 files changed, 41 insertions, 0 deletions
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 <phython@gcc.gnu.org> + Diego Novillo <dnovillo@redhat.com> + + PR 23046 + * tree-vrp.c (register_edge_assert_for): Do not register + always-false predicates. + 2005-11-08 Devang Patel <dpatel@apple.com> 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 <dnovillo@redhat.com> + + PR 23046 + * g++.dg/tree-ssa/pr23046.C: New test. + 2005-11-08 Devang Patel <dpatel@apple.com> 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 |