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:
parent
04482dd105
commit
21cf718065
|
@ -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.
|
||||
|
|
33
gcc/gimple.c
33
gcc/gimple.c
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue