From 072e921b8bf09701f42b10fbdae1c648abfeef7c Mon Sep 17 00:00:00 2001 From: dnovillo Date: Tue, 8 Nov 2005 21:09:51 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106656 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 4f792d3ecd1..5d6bfe6aec6 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 6ea074165f2..644433544f2 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 00000000000..eb8f395580b --- /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 929908bf473..d49c4d40d32 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.11.0