diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f15bb2bd5b99..be07c9afd0c6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2011-06-10  Jan Hubicka  <jh@suse.cz>
+
+	* cgraph.c (cgraph_set_nothrow_flag_1): Update cgraph after
+	setting the nothrow flag.
+	* ipa-reference.c (propagate): Skip aliases.
+	* ipa-pure-const.c (propagate_pure_const): Skip aliases.
+	(propagate_nothrow): Skip aliases; do not update cgraph.
+	(local_pure_const): Do not update cgraph.
+	* tree-profile.c (tree_profiling): Do fixup_cfg.
+
 2011-06-10  Jan Hubicka  <jh@suse.cz>
 
 	* ipa.c (cgraph_non_local_node_p_1): Break out from ...;
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 4dffdc4010a7..f5fd150baac9 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -2681,7 +2681,13 @@ cgraph_make_node_local (struct cgraph_node *node)
 static bool
 cgraph_set_nothrow_flag_1 (struct cgraph_node *node, void *data)
 {
+  struct cgraph_edge *e;
+
   TREE_NOTHROW (node->decl) = data != NULL;
+
+  if (data != NULL)
+    for (e = node->callers; e; e = e->next_caller)
+      e->can_throw_external = false;
   return false;
 }
 
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c
index b56e48ad6f05..0414273c655f 100644
--- a/gcc/ipa-pure-const.c
+++ b/gcc/ipa-pure-const.c
@@ -1116,6 +1116,9 @@ propagate_pure_const (void)
       int count = 0;
       node = order[i];
 
+      if (node->alias)
+	continue;
+
       if (dump_file && (dump_flags & TDF_DETAILS))
 	fprintf (dump_file, "Starting cycle\n");
 
@@ -1383,6 +1386,9 @@ propagate_nothrow (void)
       bool can_throw = false;
       node = order[i];
 
+      if (node->alias)
+	continue;
+
       /* Find the worst state for any node in the cycle.  */
       w = node;
       while (w)
@@ -1430,10 +1436,7 @@ propagate_nothrow (void)
 	  funct_state w_l = get_function_state (w);
 	  if (!can_throw && !TREE_NOTHROW (w->decl))
 	    {
-	      struct cgraph_edge *e;
 	      cgraph_set_nothrow_flag (w, true);
-	      for (e = w->callers; e; e = e->next_caller)
-	        e->can_throw_external = false;
 	      if (dump_file)
 		fprintf (dump_file, "Function found to be nothrow: %s\n",
 			 cgraph_node_name (w));
@@ -1640,11 +1643,7 @@ local_pure_const (void)
     }
   if (!l->can_throw && !TREE_NOTHROW (current_function_decl))
     {
-      struct cgraph_edge *e;
-
       cgraph_set_nothrow_flag (node, true);
-      for (e = node->callers; e; e = e->next_caller)
-	e->can_throw_external = false;
       changed = true;
       if (dump_file)
 	fprintf (dump_file, "Function found to be nothrow: %s\n",
diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c
index 7ee52dacda1d..05024b4989ee 100644
--- a/gcc/ipa-reference.c
+++ b/gcc/ipa-reference.c
@@ -645,6 +645,8 @@ propagate (void)
       struct ipa_dfs_info * w_info;
 
       node = order[i];
+      if (node->alias)
+	continue;
       node_info = get_reference_vars_info (node);
       gcc_assert (node_info);
 
@@ -802,6 +804,8 @@ propagate (void)
 	  struct ipa_dfs_info * w_info;
 
 	  node = order[i];
+	  if (node->alias)
+	    continue;
 	  node_info = get_reference_vars_info (node);
 	  node_g = &node_info->global;
 	  node_l = &node_info->local;
@@ -885,7 +889,7 @@ propagate (void)
       ipa_reference_global_vars_info_t node_g;
       ipa_reference_optimization_summary_t opt;
 
-      if (!node->analyzed)
+      if (!node->analyzed || node->alias)
         continue;
 
       node_info = get_reference_vars_info (node);
diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c
index ab51e261a56a..3bc4d5c532cd 100644
--- a/gcc/tree-profile.c
+++ b/gcc/tree-profile.c
@@ -470,8 +470,7 @@ tree_profiling (void)
   for (node = cgraph_nodes; node; node = node->next)
     {
       if (!node->analyzed
-	  || !gimple_has_body_p (node->decl)
-	  || !(!node->clone_of || node->decl != node->clone_of->decl))
+	  || !gimple_has_body_p (node->decl))
 	continue;
 
       /* Don't profile functions produced for builtin stuff.  */
@@ -485,6 +484,8 @@ tree_profiling (void)
       /* Re-set global shared temporary variable for edge-counters.  */
       gcov_type_tmp_var = NULL_TREE;
 
+      /* Local pure-const may imply need to fixup the cfg.  */
+      execute_fixup_cfg ();
       branch_prob ();
 
       if (! flag_branch_probabilities