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