From fe83f5439acb1ce8d12d46e991e88aecf5d7c6dc Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Wed, 13 Jul 2005 02:33:10 +0000 Subject: [PATCH] re PR middle-end/21840 (ICE while building Linux kernel (seg fault), missing cast) 2005-07-12 Andrew Pinski PR tree-opt/21840 * tree-ssa-pre.c (eliminate): Convert the sprime to the correct type if *rhs_p is not a SSA_NAME. 2005-07-12 Andrew Pinski PR tree-opt/21840 * gcc.c-torture/compile/pr21840.c: New test. From-SVN: r101960 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr21840.c | 11 +++++++++++ gcc/tree-ssa-pre.c | 9 +++++++++ 4 files changed, 31 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr21840.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bb00a8fc7bc..3f3d0feb01e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-07-12 Andrew Pinski + + PR tree-opt/21840 + * tree-ssa-pre.c (eliminate): Convert the sprime to the correct type + if *rhs_p is not a SSA_NAME. + 2005-07-12 Daniel Berlin Fix PR tree-optimization/22422 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index db5906ccd8a..15b1c4dbd4d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-07-12 Andrew Pinski + + PR tree-opt/21840 + * gcc.c-torture/compile/pr21840.c: New test. + 2005-07-12 Jan Hubicka * gcc.c-torture/compile/pr22379.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21840.c b/gcc/testsuite/gcc.c-torture/compile/pr21840.c new file mode 100644 index 00000000000..bec3d6bf5d7 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr21840.c @@ -0,0 +1,11 @@ +void fn_show_state(void); +typedef void (*fn_handler_fn)(void); +static fn_handler_fn fn_handler[1]; + +void k_spec(unsigned char value) +{ + void *func = fn_handler[value]; + if (func == fn_show_state ) + return; + fn_handler[value](); +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index eab18d34a16..fbfda11cebe 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2334,8 +2334,17 @@ eliminate (void) fprintf (dump_file, " in "); print_generic_stmt (dump_file, stmt, 0); } + if (TREE_CODE (sprime) == SSA_NAME) NECESSARY (SSA_NAME_DEF_STMT (sprime)) = 1; + /* We need to make sure the new and old types actually match, + which may require adding a simple cast, which fold_convert + will do for us. */ + if (TREE_CODE (*rhs_p) != SSA_NAME + && !tree_ssa_useless_type_conversion_1 (TREE_TYPE (*rhs_p), + TREE_TYPE (sprime))) + sprime = fold_convert (TREE_TYPE (*rhs_p), sprime); + pre_stats.eliminations++; propagate_tree_value (rhs_p, sprime); update_stmt (stmt);