re PR tree-optimization/42078 (ICE in gimple_assign_set_rhs_code)

gcc/ChangeLog:
PR tree-optimization/42078
* gimple.h (gimple_replace_lhs): New declaration.
* gimple.c (gimple_replace_lhs): New function.
* tree-ssa-math-opts.c (execute_cse_reciprocals): Call it before
modifying the call.
gcc/testsuite/ChangeLog:
PR tree-optimization/42078
* gcc.dg/pr42078.c: New test.

From-SVN: r154400
This commit is contained in:
Alexandre Oliva 2009-11-21 05:04:30 +00:00
parent 04482dd105
commit 21cf718065
6 changed files with 70 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2009-11-21 Alexandre Oliva <aoliva@redhat.com>
PR tree-optimization/42078
* gimple.h (gimple_replace_lhs): New declaration.
* gimple.c (gimple_replace_lhs): New function.
* tree-ssa-math-opts.c (execute_cse_reciprocals): Call it before
modifying the call.
2009-11-20 Sebastian Pop <sebastian.pop@amd.com>
* config/i386/sse.md (*xop_pmacsdql_mem): Don't call reg_mentioned_p.

View File

@ -1981,6 +1981,39 @@ gimple_set_lhs (gimple stmt, tree lhs)
gcc_unreachable();
}
/* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a
GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an
expression with a different value.
This will update any annotations (say debug bind stmts) referring
to the original LHS, so that they use the RHS instead. This is
done even if NLHS and LHS are the same, for it is understood that
the RHS will be modified afterwards, and NLHS will not be assigned
an equivalent value.
Adjusting any non-annotation uses of the LHS, if needed, is a
responsibility of the caller.
The effect of this call should be pretty much the same as that of
inserting a copy of STMT before STMT, and then removing the
original stmt, at which time gsi_remove() would have update
annotations, but using this function saves all the inserting,
copying and removing. */
void
gimple_replace_lhs (gimple stmt, tree nlhs)
{
if (MAY_HAVE_DEBUG_STMTS)
{
tree lhs = gimple_get_lhs (stmt);
gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt);
insert_debug_temp_for_var_def (NULL, lhs);
}
gimple_set_lhs (stmt, nlhs);
}
/* Return a deep copy of statement STMT. All the operands from STMT
are reallocated and copied using unshare_expr. The DEF, USE, VDEF

View File

@ -843,6 +843,7 @@ void gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *, enum tree_code,
tree, tree);
tree gimple_get_lhs (const_gimple);
void gimple_set_lhs (gimple, tree);
void gimple_replace_lhs (gimple, tree);
gimple gimple_copy (gimple);
bool is_gimple_operand (const_tree);
void gimple_set_modified (gimple, bool);

View File

@ -1,3 +1,8 @@
2009-11-21 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/42078
* gcc.dg/pr42078.c: New test.
2009-11-19 Andy Hutchinson <hutchinsonandy@gcc.gnu.org>
PR Testsuite/42114

View File

@ -0,0 +1,22 @@
/* PR tree-optimization/42078 */
/* { dg-do compile } */
/* { dg-options "-g -O -ffast-math" } */
double sqrt (double x);
float
foo (float x)
{
float y = sqrt (x);
return x / y;
}
inline float
bar (float x)
{
float y = sqrt (x);
float a = y;
float b = y;
float c = y;
return x / y;
}

View File

@ -563,6 +563,7 @@ execute_cse_reciprocals (void)
if (fail)
continue;
gimple_replace_lhs (stmt1, arg1);
gimple_call_set_fndecl (stmt1, fndecl);
update_stmt (stmt1);