On 2012-10-30 05:32, Aldy Hernandez wrote:
> + // If we have a ``_transaction_cancel [[outer]]'', there is only
> + // one abnormal edge: to the transaction marked OUTER.
> + tree arg = gimple_call_arg (stmt, 0);
> + if (TREE_CODE (arg) == INTEGER_CST)
> + {
> + if (TREE_INT_CST_LOW (arg) & AR_OUTERABORT)
> + {
> + // Find the GTMA_IS_OUTER transaction.
> + for (; region; region = region->outer)
> + {
> + if (region->original_transaction_was_outer)
> + {
> + make_edge (bb, region->entry_block, EDGE_ABNORMAL);
> + return;
> + }
> + }
> + // The front-end should have caught outer aborts without
> + // an outer transaction.
> + gcc_unreachable ();
Err, no the final check there would be if the current function includes
attribute may_throw_abort_outer (sp). Just return here I think for now.
Otherwise it looks ok. Obviously we can do better for the aborts, but
I think that can be fixed in follow-up patches.
r~