summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/tree-ssa-dce.c7
-rw-r--r--gcc/tree-ssa-operands.c49
3 files changed, 43 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 02a7f16d879..d3ca6b516ca 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index ccdf14a1702..ace9ef9972d 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -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 ();
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index 0045dd875ec..ed0d34de2df 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -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;
}
}