https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68122

--- Comment #8 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
I'm testing the following which skips internal fns, but I don't know if that's
the right thing for TM.  At least it fixes all the ICEs I see.

I can post this to ML if it passes testing and we can discuss there.

--- gcc/trans-mem.c
+++ gcc/trans-mem.c
@@ -649,6 +649,8 @@ diagnose_tm_1 (gimple_stmt_iterator *gsi, bool
*handled_ops_p,
     case GIMPLE_CALL:
       {
        tree fn = gimple_call_fn (stmt);
+       if (fn == NULL_TREE)
+         break;

        if ((d->summary_flags & DIAG_TM_OUTER) == 0
            && is_tm_may_cancel_outer (fn))
@@ -4316,6 +4318,8 @@ ipa_tm_scan_irr_block (basic_block bb)
              break;

            fn = gimple_call_fn (stmt);
+           if (fn == NULL_TREE)
+             break;

            /* Functions with the attribute are by definition irrevocable.  */
            if (is_tm_irrevocable (fn))
@@ -5109,6 +5113,10 @@ ipa_tm_transform_calls_redirect (struct cgraph_node
*node,
   struct cgraph_edge *e = node->get_edge (stmt);
   tree fndecl = gimple_call_fndecl (stmt);

+  /* Skip internal functions.  */
+  if (gimple_call_fn (stmt) == NULL_TREE)
+    return;
+
   /* For indirect calls, pass the address through the runtime.  */
   if (fndecl == NULL)
     {

Reply via email to