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
This commit is contained in:
Diego Novillo 2005-11-08 16:09:51 -05:00
parent 230d8ead8c
commit da11c5d226
4 changed files with 41 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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