diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d20066c4cbb4..d053f30da87a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-10-01 Richard Guenther + + PR tree-optimization/37617 + * tree-ssa-pre.c (create_expression_by_pieces): During FRE + do not add to the NEW_SETS. + 2008-10-01 Richard Guenther PR middle-end/37285 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 16a233a5c7f6..d2f70a06b657 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-10-01 Richard Guenther + + PR tree-optimization/37617 + * gcc.c-torture/compile/pr37617.c: New testcase. + 2008-10-01 Richard Guenther PR middle-end/37285 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37617.c b/gcc/testsuite/gcc.c-torture/compile/pr37617.c new file mode 100644 index 000000000000..901b8cabf225 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr37617.c @@ -0,0 +1,19 @@ +typedef union +{ + char *string; + double dval; + float fval; +} yystype; +char *f(void) +{ + yystype tok; + tok.dval = 0; + return (tok.string); +} +char *f1(void) +{ + yystype tok; + tok.fval = 0; + return (tok.string); +} + diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index cd344af2d101..84c884b060cf 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2885,7 +2885,8 @@ create_expression_by_pieces (basic_block block, pre_expr expr, VN_INFO (forcedname)->value_id = get_next_value_id (); nameexpr = get_or_alloc_expr_for_name (forcedname); add_to_value (VN_INFO (forcedname)->value_id, nameexpr); - bitmap_value_replace_in_set (NEW_SETS (block), nameexpr); + if (!in_fre) + bitmap_value_replace_in_set (NEW_SETS (block), nameexpr); bitmap_value_replace_in_set (AVAIL_OUT (block), nameexpr); } mark_symbols_for_renaming (stmt);