Index: tree-ssa-pre.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/tree-ssa-pre.c,v retrieving revision 2.95 diff -u -p -r2.95 tree-ssa-pre.c --- tree-ssa-pre.c 26 Jun 2005 21:21:32 -0000 2.95 +++ tree-ssa-pre.c 13 Jul 2005 01:33:11 -0000 @@ -2334,8 +2334,15 @@ 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; + + 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); Index: testsuite/gcc.c-torture/compile/pr21840.c =================================================================== RCS file: testsuite/gcc.c-torture/compile/pr21840.c diff -N testsuite/gcc.c-torture/compile/pr21840.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/gcc.c-torture/compile/pr21840.c 13 Jul 2005 01:33:11 -0000 @@ -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](); +}