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~

Reply via email to