tree-ssa-dce.c (propagate_necessity): Handle GIMPLE_TRANSACTION.

* tree-ssa-dce.c (propagate_necessity): Handle GIMPLE_TRANSACTION.
        * tree-ssa-operands.c (parse_ssa_operands): Add virtual operands
        for GIMPLE_TRANSACTION.  Tidy if's into a switch.

From-SVN: r184107
This commit is contained in:
Richard Henderson 2012-02-10 09:44:31 -08:00 committed by Richard Henderson
parent 1e98f62d74
commit 1d4fb4935c
3 changed files with 43 additions and 19 deletions

View file

@ -1,3 +1,9 @@
2012-02-10 Richard Henderson <rth@redhat.com>
* tree-ssa-dce.c (propagate_necessity): Handle GIMPLE_TRANSACTION.
* tree-ssa-operands.c (parse_ssa_operands): Add virtual operands
for GIMPLE_TRANSACTION. Tidy if's into a switch.
2012-02-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
Ira Rosen <irar@il.ibm.com>

View file

@ -965,6 +965,13 @@ propagate_necessity (struct edge_list *el)
mark_aliased_reaching_defs_necessary (stmt, op);
}
}
else if (gimple_code (stmt) == GIMPLE_TRANSACTION)
{
/* The beginning of a transaction is a memory barrier. */
/* ??? If we were really cool, we'd only be a barrier
for the memories touched within the transaction. */
mark_all_reaching_defs_necessary (stmt);
}
else
gcc_unreachable ();

View file

@ -1043,35 +1043,46 @@ static void
parse_ssa_operands (gimple stmt)
{
enum gimple_code code = gimple_code (stmt);
size_t i, n, start = 0;
if (code == GIMPLE_ASM)
get_asm_expr_operands (stmt);
else if (is_gimple_debug (stmt))
switch (code)
{
case GIMPLE_ASM:
get_asm_expr_operands (stmt);
break;
case GIMPLE_TRANSACTION:
/* The start of a transaction is a memory barrier. */
add_virtual_operand (stmt, opf_def | opf_use);
break;
case GIMPLE_DEBUG:
if (gimple_debug_bind_p (stmt)
&& gimple_debug_bind_has_value_p (stmt))
get_expr_operands (stmt, gimple_debug_bind_get_value_ptr (stmt),
opf_use | opf_no_vops);
}
else
{
size_t i, start = 0;
break;
if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
{
get_expr_operands (stmt, gimple_op_ptr (stmt, 0), opf_def);
start = 1;
}
for (i = start; i < gimple_num_ops (stmt); i++)
get_expr_operands (stmt, gimple_op_ptr (stmt, i), opf_use);
case GIMPLE_RETURN:
append_vuse (gimple_vop (cfun));
goto do_default;
case GIMPLE_CALL:
/* Add call-clobbered operands, if needed. */
if (code == GIMPLE_CALL)
maybe_add_call_vops (stmt);
maybe_add_call_vops (stmt);
/* FALLTHRU */
if (code == GIMPLE_RETURN)
append_vuse (gimple_vop (cfun));
case GIMPLE_ASSIGN:
get_expr_operands (stmt, gimple_op_ptr (stmt, 0), opf_def);
start = 1;
/* FALLTHRU */
default:
do_default:
n = gimple_num_ops (stmt);
for (i = start; i < n; i++)
get_expr_operands (stmt, gimple_op_ptr (stmt, i), opf_use);
break;
}
}