Index: ChangeLog.tm-merge
===================================================================
--- ChangeLog.tm-merge	(revision 181067)
+++ ChangeLog.tm-merge	(working copy)
@@ -58,8 +58,10 @@
 	* calls.c (is_tm_builtin): New.
 	(flags_from_decl_or_type): Add ECF_TM_OPS for TM clones.
 	* cfgbuild.c (make_edges): Add edges for REG_TM notes.
-	* cfgexpand.c (expand_gimple_stmt): Add REG_TM notes.
+	* cfgexpand.c (expand_call_stmt): Call
+	mark_transaction_restart_calls.
 	(gimple_expand_cfg): Free the tm_restart map.
+	(mark_transaction_restart_calls): New.
 	* cfgrtl.c (purge_dead_edges): Look for REG_TM notes.
 	* cgraph.c (dump_cgraph_node): Handle tm_clone.
 	* cgraph.h (struct cgraph_node): Add tm_clone field.
Index: cfgexpand.c
===================================================================
--- cfgexpand.c	(revision 181067)
+++ cfgexpand.c	(working copy)
@@ -1802,6 +1802,38 @@ expand_gimple_cond (basic_block bb, gimp
   return new_bb;
 }
 
+/* Mark all calls that can have a transaction restart.  */
+
+static void
+mark_transaction_restart_calls (gimple stmt)
+{
+  struct tm_restart_node dummy;
+  void **slot;
+
+  if (!cfun->gimple_df->tm_restart)
+    return;
+
+  dummy.stmt = stmt;
+  slot = htab_find_slot (cfun->gimple_df->tm_restart, &dummy, NO_INSERT);
+  if (slot)
+    {
+      struct tm_restart_node *n = (struct tm_restart_node *) *slot;
+      tree list = n->label_or_list;
+      rtx insn;
+
+      for (insn = next_real_insn (get_last_insn ());
+	   !CALL_P (insn);
+	   insn = next_real_insn (insn))
+	continue;
+
+      if (TREE_CODE (list) == LABEL_DECL)
+	add_reg_note (insn, REG_TM, label_rtx (list));
+      else
+	for (; list ; list = TREE_CHAIN (list))
+	  add_reg_note (insn, REG_TM, label_rtx (TREE_VALUE (list)));
+    }
+}
+
 /* A subroutine of expand_gimple_stmt_1, expanding one GIMPLE_CALL
    statement STMT.  */
 
@@ -1888,6 +1920,8 @@ expand_call_stmt (gimple stmt)
     expand_assignment (lhs, exp, false);
   else
     expand_expr_real_1 (exp, const0_rtx, VOIDmode, EXPAND_NORMAL, NULL);
+
+  mark_transaction_restart_calls (stmt);
 }
 
 /* A subroutine of expand_gimple_stmt, expanding one gimple statement
@@ -2096,32 +2130,6 @@ expand_gimple_stmt (gimple stmt)
 	}
     }
 
-  /* Mark all calls that can have a transaction restart.  */
-  if (cfun->gimple_df->tm_restart && is_gimple_call (stmt))
-    {
-      struct tm_restart_node dummy;
-      void **slot;
-
-      dummy.stmt = stmt;
-      slot = htab_find_slot (cfun->gimple_df->tm_restart, &dummy, NO_INSERT);
-      if (slot)
-	{
-	  struct tm_restart_node *n = (struct tm_restart_node *) *slot;
-	  tree list = n->label_or_list;
-	  rtx insn;
-
-	  for (insn = next_real_insn (last); !CALL_P (insn);
-	       insn = next_real_insn (insn))
-	    continue;
-
-	  if (TREE_CODE (list) == LABEL_DECL)
-	    add_reg_note (insn, REG_TM, label_rtx (list));
-	  else
-	    for (; list ; list = TREE_CHAIN (list))
-	      add_reg_note (insn, REG_TM, label_rtx (TREE_VALUE (list)));
-	}
-    }
-
   return last;
 }
 
