This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] n-th try: move profiling to SSA form


This makes a simple IPA pass out of profile instrumentation and read,
scheduled after early optimizations.  That gets rid of the early
non-SSA IPA inliner (that was supposed to make -fprofile-generate and
tramp3d happy).  It also moves profile instrumentation to where
we envision it to be for the WHOPR profile generate/use.

This version now properly updates pure/const state of functions
and thus passes SPEC 2k build and profiledbootstrap.

Bootstrapped and tested on x86_64-unknown-linux-gnu.  I will apply
this tomorrow if there are no objections.

Thanks,
Richard.

2010-10-04  Richard Guenther  <rguenther@suse.de>

	* value-prof.c (gimple_divmod_fixed_value): Work on SSA form.
	(gimple_mod_pow2): Likewise.
	(gimple_mod_subtract): Likewise.
	(gimple_ic): Likewise.
	(gimple_stringop_fixed_value): Likewise.
	* tree-profile.c (tree_init_edge_profiler): Mark profile
	functions nothrow and leaf.
	(add_abnormal_goto_call_edges): Remove.
	(tree_gen_edge_profiler): Work on SSA form.
	(tree_gen_ic_profiler): Likewise.  Simplify.
	(do_tree_profiling): Update SSA form.
	(pass_tree_profile): Remove.
	(do_tree_profiling): Likewise.
	(gate_tree_profile_ipa): New function.
	(pass_ipa_tree_profile): New.
	(tree_profiling): Re-write as IPA pass.  Properly drop const/pure
	state of instrumented functions.
	* passes.c (init_optimization_passes): Remove early non-SSA
	inlining.  Move profiling after early optimizations.
	* ipa-inline.c (cgraph_gate_ipa_early_inlining): Remove.
	(pass_ipa_early_inline): Likewise.
	* tree-pass.h (pass_ipa_early_inline): Remove.
	(pass_tree_profile): Likewise.
	(pass_ipa_tree_profile): Declare.

	* gcc.dg/tree-prof/val-prof-1.c: Adjust.
	* gcc.dg/tree-prof/val-prof-2.c: Likewise.
	* gcc.dg/tree-prof/val-prof-3.c: Likewise.
	* gcc.dg/tree-prof/val-prof-4.c: Likewise.
	* gcc.dg/tree-prof/val-prof-5.c: Likewise.
	* gcc.dg/tree-prof/val-prof-7.c: Likewise.
	* gcc.dg/tree-prof/stringop-1.c: Likewise.
	* gcc.dg/tree-prof/stringop-2.c: Likewise.
	* gcc.dg/tree-prof/ic-misattribution-1.c: Likewise.
	* gcc.dg/tree-prof/indir-call-prof.c: Likewise.
	* gcc.dg/tree-prof/update-loopch.c: Likewise.
	* g++.dg/tree-prof/indir-call-prof.C: Likewise.
	* g++.dg/tree-prof/inline_mismatch_args.C: Likewise.
	* gcc.dg/tree-prof/tracer-1.c: Likewise.
	* gcc.dg/tree-ssa/inline-4.c: Likewise.
	* gcc.dg/tree-ssa/inline-3.c: Likewise.
	* gcc.dg/tree-ssa/20080530.c: Likewise.
	* g++.dg/tree-ssa/inline-3.C: Likewise.
	* g++.dg/tree-ssa/inline-1.C: Likewise.
	* g++.dg/tree-ssa/inline-2.C: Likewise.
	* gcc.dg/profile-dir-1.c: Likewise.
	* gcc.dg/profile-dir-2.c: Likewise.
	* gcc.dg/profile-dir-3.c: Likewise.

Index: gcc/value-prof.c
===================================================================
*** gcc/value-prof.c.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/value-prof.c	2010-10-04 13:20:24.000000000 +0200
*************** gimple_divmod_fixed_value (gimple stmt,
*** 558,564 ****
  			   gcov_type all)
  {
    gimple stmt1, stmt2, stmt3;
!   tree tmp1, tmp2, tmpv;
    gimple bb1end, bb2end, bb3end;
    basic_block bb, bb2, bb3, bb4;
    tree optype, op1, op2;
--- 558,564 ----
  			   gcov_type all)
  {
    gimple stmt1, stmt2, stmt3;
!   tree tmp0, tmp1, tmp2, tmpv;
    gimple bb1end, bb2end, bb3end;
    basic_block bb, bb2, bb3, bb4;
    tree optype, op1, op2;
*************** gimple_divmod_fixed_value (gimple stmt,
*** 576,594 ****
    bb = gimple_bb (stmt);
    gsi = gsi_for_stmt (stmt);
  
!   tmpv = create_tmp_var (optype, "PROF");
!   tmp1 = create_tmp_var (optype, "PROF");
!   stmt1 = gimple_build_assign (tmpv, fold_convert (optype, value));
    stmt2 = gimple_build_assign (tmp1, op2);
!   stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmpv, NULL_TREE, NULL_TREE);
    gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
    gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
    gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
    bb1end = stmt3;
  
!   tmp2 = create_tmp_var (optype, "PROF");
    stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2,
! 					op1, tmpv);
    gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
    bb2end = stmt1;
  
--- 576,597 ----
    bb = gimple_bb (stmt);
    gsi = gsi_for_stmt (stmt);
  
!   tmpv = create_tmp_reg (optype, "PROF");
!   tmp0 = make_ssa_name (tmpv, NULL);
!   tmp1 = make_ssa_name (tmpv, NULL);
!   stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value));
!   SSA_NAME_DEF_STMT (tmp0) = stmt1;
    stmt2 = gimple_build_assign (tmp1, op2);
!   SSA_NAME_DEF_STMT (tmp1) = stmt2;
!   stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
    gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
    gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
    gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
    bb1end = stmt3;
  
!   tmp2 = make_rename_temp (optype, "PROF");
    stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2,
! 					op1, tmp0);
    gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
    bb2end = stmt1;
  
*************** static tree
*** 711,717 ****
  gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all)
  {
    gimple stmt1, stmt2, stmt3, stmt4;
!   tree tmp2, tmp3;
    gimple bb1end, bb2end, bb3end;
    basic_block bb, bb2, bb3, bb4;
    tree optype, op1, op2;
--- 714,720 ----
  gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all)
  {
    gimple stmt1, stmt2, stmt3, stmt4;
!   tree tmp2, tmp3, tmpv;
    gimple bb1end, bb2end, bb3end;
    basic_block bb, bb2, bb3, bb4;
    tree optype, op1, op2;
*************** gimple_mod_pow2 (gimple stmt, int prob,
*** 729,740 ****
    bb = gimple_bb (stmt);
    gsi = gsi_for_stmt (stmt);
  
!   result = create_tmp_var (optype, "PROF");
!   tmp2 = create_tmp_var (optype, "PROF");
!   tmp3 = create_tmp_var (optype, "PROF");
    stmt2 = gimple_build_assign_with_ops (PLUS_EXPR, tmp2, op2,
  					build_int_cst (optype, -1));
    stmt3 = gimple_build_assign_with_ops (BIT_AND_EXPR, tmp3, tmp2, op2);
    stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
  			     NULL_TREE, NULL_TREE);
    gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
--- 732,746 ----
    bb = gimple_bb (stmt);
    gsi = gsi_for_stmt (stmt);
  
!   result = make_rename_temp (optype, "PROF");
!   tmpv = create_tmp_var (optype, "PROF");
!   tmp2 = make_ssa_name (tmpv, NULL);
!   tmp3 = make_ssa_name (tmpv, NULL);
    stmt2 = gimple_build_assign_with_ops (PLUS_EXPR, tmp2, op2,
  					build_int_cst (optype, -1));
+   SSA_NAME_DEF_STMT (tmp2) = stmt2;
    stmt3 = gimple_build_assign_with_ops (BIT_AND_EXPR, tmp3, tmp2, op2);
+   SSA_NAME_DEF_STMT (tmp3) = stmt3;
    stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
  			     NULL_TREE, NULL_TREE);
    gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
*************** gimple_mod_subtract (gimple stmt, int pr
*** 881,890 ****
    bb = gimple_bb (stmt);
    gsi = gsi_for_stmt (stmt);
  
!   result = create_tmp_var (optype, "PROF");
!   tmp1 = create_tmp_var (optype, "PROF");
    stmt1 = gimple_build_assign (result, op1);
    stmt2 = gimple_build_assign (tmp1, op2);
    stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
    gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
    gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
--- 887,897 ----
    bb = gimple_bb (stmt);
    gsi = gsi_for_stmt (stmt);
  
!   result = make_rename_temp (optype, "PROF");
!   tmp1 = make_ssa_name (create_tmp_var (optype, "PROF"), NULL);
    stmt1 = gimple_build_assign (result, op1);
    stmt2 = gimple_build_assign (tmp1, op2);
+   SSA_NAME_DEF_STMT (tmp1) = stmt2;
    stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
    gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
    gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
*************** gimple_ic (gimple icall_stmt, struct cgr
*** 1092,1098 ****
  	   int prob, gcov_type count, gcov_type all)
  {
    gimple dcall_stmt, load_stmt, cond_stmt;
!   tree tmp1, tmpv, tmp;
    basic_block cond_bb, dcall_bb, icall_bb, join_bb;
    tree optype = build_pointer_type (void_type_node);
    edge e_cd, e_ci, e_di, e_dj, e_ij;
--- 1099,1105 ----
  	   int prob, gcov_type count, gcov_type all)
  {
    gimple dcall_stmt, load_stmt, cond_stmt;
!   tree tmp0, tmp1, tmpv, tmp;
    basic_block cond_bb, dcall_bb, icall_bb, join_bb;
    tree optype = build_pointer_type (void_type_node);
    edge e_cd, e_ci, e_di, e_dj, e_ij;
*************** gimple_ic (gimple icall_stmt, struct cgr
*** 1102,1121 ****
    cond_bb = gimple_bb (icall_stmt);
    gsi = gsi_for_stmt (icall_stmt);
  
!   tmpv = create_tmp_var (optype, "PROF");
!   tmp1 = create_tmp_var (optype, "PROF");
    tmp = unshare_expr (gimple_call_fn (icall_stmt));
!   load_stmt = gimple_build_assign (tmpv, tmp);
    gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
  
    tmp = fold_convert (optype, build_addr (direct_call->decl,
  					  current_function_decl));
    load_stmt = gimple_build_assign (tmp1, tmp);
    gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
  
!   cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmpv, NULL_TREE, NULL_TREE);
    gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
  
    dcall_stmt = gimple_copy (icall_stmt);
    gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
    gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
--- 1109,1134 ----
    cond_bb = gimple_bb (icall_stmt);
    gsi = gsi_for_stmt (icall_stmt);
  
!   tmpv = create_tmp_reg (optype, "PROF");
!   tmp0 = make_ssa_name (tmpv, NULL);
!   tmp1 = make_ssa_name (tmpv, NULL);
    tmp = unshare_expr (gimple_call_fn (icall_stmt));
!   load_stmt = gimple_build_assign (tmp0, tmp);
!   SSA_NAME_DEF_STMT (tmp0) = load_stmt;
    gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
  
    tmp = fold_convert (optype, build_addr (direct_call->decl,
  					  current_function_decl));
    load_stmt = gimple_build_assign (tmp1, tmp);
+   SSA_NAME_DEF_STMT (tmp1) = load_stmt;
    gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
  
!   cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
    gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
  
+   gimple_set_vdef (icall_stmt, NULL_TREE);
+   gimple_set_vuse (icall_stmt, NULL_TREE);
+   update_stmt (icall_stmt);
    dcall_stmt = gimple_copy (icall_stmt);
    gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
    gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
*************** gimple_ic (gimple icall_stmt, struct cgr
*** 1151,1156 ****
--- 1164,1184 ----
    e_ij->probability = REG_BR_PROB_BASE;
    e_ij->count = all - count;
  
+   /* Insert PHI node for the call result if necessary.  */
+   if (gimple_call_lhs (icall_stmt)
+       && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME)
+     {
+       tree result = gimple_call_lhs (icall_stmt);
+       gimple phi = create_phi_node (result, join_bb);
+       SSA_NAME_DEF_STMT (result) = phi;
+       gimple_call_set_lhs (icall_stmt,
+ 			   make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
+       add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
+       gimple_call_set_lhs (dcall_stmt,
+ 			   make_ssa_name (SSA_NAME_VAR (result), dcall_stmt));
+       add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
+     }
+ 
    /* Fix eh edges */
    lp_nr = lookup_stmt_eh_lp (icall_stmt);
    if (lp_nr != 0)
*************** gimple_stringop_fixed_value (gimple vcal
*** 1289,1295 ****
  			     gcov_type count, gcov_type all)
  {
    gimple tmp_stmt, cond_stmt, icall_stmt;
!   tree tmp1, tmpv, vcall_size, optype;
    basic_block cond_bb, icall_bb, vcall_bb, join_bb;
    edge e_ci, e_cv, e_iv, e_ij, e_vj;
    gimple_stmt_iterator gsi;
--- 1317,1323 ----
  			     gcov_type count, gcov_type all)
  {
    gimple tmp_stmt, cond_stmt, icall_stmt;
!   tree tmp0, tmp1, tmpv, vcall_size, optype;
    basic_block cond_bb, icall_bb, vcall_bb, join_bb;
    edge e_ci, e_cv, e_iv, e_ij, e_vj;
    gimple_stmt_iterator gsi;
*************** gimple_stringop_fixed_value (gimple vcal
*** 1307,1322 ****
    optype = TREE_TYPE (vcall_size);
  
    tmpv = create_tmp_var (optype, "PROF");
!   tmp1 = create_tmp_var (optype, "PROF");
!   tmp_stmt = gimple_build_assign (tmpv, fold_convert (optype, icall_size));
    gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
  
    tmp_stmt = gimple_build_assign (tmp1, vcall_size);
    gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
  
!   cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmpv, NULL_TREE, NULL_TREE);
    gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
  
    icall_stmt = gimple_copy (vcall_stmt);
    gimple_call_set_arg (icall_stmt, size_arg, icall_size);
    gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
--- 1335,1356 ----
    optype = TREE_TYPE (vcall_size);
  
    tmpv = create_tmp_var (optype, "PROF");
!   tmp0 = make_ssa_name (tmpv, NULL);
!   tmp1 = make_ssa_name (tmpv, NULL);
!   tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size));
!   SSA_NAME_DEF_STMT (tmp0) = tmp_stmt;
    gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
  
    tmp_stmt = gimple_build_assign (tmp1, vcall_size);
+   SSA_NAME_DEF_STMT (tmp1) = tmp_stmt;
    gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
  
!   cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
    gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
  
+   gimple_set_vdef (vcall_stmt, NULL);
+   gimple_set_vuse (vcall_stmt, NULL);
+   update_stmt (vcall_stmt);
    icall_stmt = gimple_copy (vcall_stmt);
    gimple_call_set_arg (icall_stmt, size_arg, icall_size);
    gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
Index: gcc/tree-profile.c
===================================================================
*** gcc/tree-profile.c.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/tree-profile.c	2010-10-04 15:56:02.000000000 +0200
*************** tree_init_edge_profiler (void)
*** 120,125 ****
--- 120,129 ----
        tree_interval_profiler_fn
  	      = build_fn_decl ("__gcov_interval_profiler",
  				     interval_profiler_fn_type);
+       TREE_NOTHROW (tree_interval_profiler_fn) = 1;
+       DECL_ATTRIBUTES (tree_interval_profiler_fn)
+ 	= tree_cons (get_identifier ("leaf"), NULL,
+ 		     DECL_ATTRIBUTES (tree_interval_profiler_fn));
  
        /* void (*) (gcov_type *, gcov_type)  */
        pow2_profiler_fn_type
*************** tree_init_edge_profiler (void)
*** 128,133 ****
--- 132,141 ----
  					  NULL_TREE);
        tree_pow2_profiler_fn = build_fn_decl ("__gcov_pow2_profiler",
  						   pow2_profiler_fn_type);
+       TREE_NOTHROW (tree_pow2_profiler_fn) = 1;
+       DECL_ATTRIBUTES (tree_pow2_profiler_fn)
+ 	= tree_cons (get_identifier ("leaf"), NULL,
+ 		     DECL_ATTRIBUTES (tree_pow2_profiler_fn));
  
        /* void (*) (gcov_type *, gcov_type)  */
        one_value_profiler_fn_type
*************** tree_init_edge_profiler (void)
*** 137,142 ****
--- 145,154 ----
        tree_one_value_profiler_fn
  	      = build_fn_decl ("__gcov_one_value_profiler",
  				     one_value_profiler_fn_type);
+       TREE_NOTHROW (tree_one_value_profiler_fn) = 1;
+       DECL_ATTRIBUTES (tree_one_value_profiler_fn)
+ 	= tree_cons (get_identifier ("leaf"), NULL,
+ 		     DECL_ATTRIBUTES (tree_one_value_profiler_fn));
  
        tree_init_ic_make_global_vars ();
  
*************** tree_init_edge_profiler (void)
*** 149,154 ****
--- 161,171 ----
        tree_indirect_call_profiler_fn
  	      = build_fn_decl ("__gcov_indirect_call_profiler",
  				     ic_profiler_fn_type);
+       TREE_NOTHROW (tree_indirect_call_profiler_fn) = 1;
+       DECL_ATTRIBUTES (tree_indirect_call_profiler_fn)
+ 	= tree_cons (get_identifier ("leaf"), NULL,
+ 		     DECL_ATTRIBUTES (tree_indirect_call_profiler_fn));
+ 
        /* void (*) (gcov_type *, gcov_type)  */
        average_profiler_fn_type
  	      = build_function_type_list (void_type_node,
*************** tree_init_edge_profiler (void)
*** 156,164 ****
--- 173,190 ----
        tree_average_profiler_fn
  	      = build_fn_decl ("__gcov_average_profiler",
  				     average_profiler_fn_type);
+       TREE_NOTHROW (tree_average_profiler_fn) = 1;
+       DECL_ATTRIBUTES (tree_average_profiler_fn)
+ 	= tree_cons (get_identifier ("leaf"), NULL,
+ 		     DECL_ATTRIBUTES (tree_average_profiler_fn));
        tree_ior_profiler_fn
  	      = build_fn_decl ("__gcov_ior_profiler",
  				     average_profiler_fn_type);
+       TREE_NOTHROW (tree_ior_profiler_fn) = 1;
+       DECL_ATTRIBUTES (tree_ior_profiler_fn)
+ 	= tree_cons (get_identifier ("leaf"), NULL,
+ 		     DECL_ATTRIBUTES (tree_ior_profiler_fn));
+ 
        /* LTO streamer needs assembler names.  Because we create these decls
           late, we need to initialize them by hand.  */
        DECL_ASSEMBLER_NAME (tree_interval_profiler_fn);
*************** tree_init_edge_profiler (void)
*** 170,189 ****
      }
  }
  
- /* New call was added, make goto call edges if neccesary.  */
- 
- static void
- add_abnormal_goto_call_edges (gimple_stmt_iterator gsi)
- {
-   gimple stmt = gsi_stmt (gsi);
- 
-   if (!stmt_can_make_abnormal_goto (stmt))
-     return;
-   if (!gsi_end_p (gsi))
-     split_block (gimple_bb (stmt), stmt);
-   make_abnormal_goto_edges (gimple_bb (stmt), true);
- }
- 
  /* Output instructions as GIMPLE trees to increment the edge
     execution count, and insert them on E.  We rely on
     gsi_insert_on_edge to preserve the order.  */
--- 196,201 ----
*************** tree_gen_edge_profiler (int edgeno, edge
*** 197,209 ****
    /* We share one temporary variable declaration per function.  This
       gets re-set in tree_profiling.  */
    if (gcov_type_tmp_var == NULL_TREE)
!     gcov_type_tmp_var = create_tmp_var (gcov_type_node, "PROF_edge_counter");
    ref = tree_coverage_counter_ref (GCOV_COUNTER_ARCS, edgeno);
    one = build_int_cst (gcov_type_node, 1);
    stmt1 = gimple_build_assign (gcov_type_tmp_var, ref);
    stmt2 = gimple_build_assign_with_ops (PLUS_EXPR, gcov_type_tmp_var,
! 					gcov_type_tmp_var, one);
!   stmt3 = gimple_build_assign (unshare_expr (ref), gcov_type_tmp_var);
    gsi_insert_on_edge (e, stmt1);
    gsi_insert_on_edge (e, stmt2);
    gsi_insert_on_edge (e, stmt3);
--- 209,223 ----
    /* We share one temporary variable declaration per function.  This
       gets re-set in tree_profiling.  */
    if (gcov_type_tmp_var == NULL_TREE)
!     gcov_type_tmp_var = create_tmp_reg (gcov_type_node, "PROF_edge_counter");
    ref = tree_coverage_counter_ref (GCOV_COUNTER_ARCS, edgeno);
    one = build_int_cst (gcov_type_node, 1);
    stmt1 = gimple_build_assign (gcov_type_tmp_var, ref);
+   gimple_assign_set_lhs (stmt1, make_ssa_name (gcov_type_tmp_var, stmt1));
    stmt2 = gimple_build_assign_with_ops (PLUS_EXPR, gcov_type_tmp_var,
! 					gimple_assign_lhs (stmt1), one);
!   gimple_assign_set_lhs (stmt2, make_ssa_name (gcov_type_tmp_var, stmt2));
!   stmt3 = gimple_build_assign (unshare_expr (ref), gimple_assign_lhs (stmt2));
    gsi_insert_on_edge (e, stmt1);
    gsi_insert_on_edge (e, stmt2);
    gsi_insert_on_edge (e, stmt3);
*************** tree_gen_interval_profiler (histogram_va
*** 246,252 ****
    call = gimple_build_call (tree_interval_profiler_fn, 4,
  			    ref_ptr, val, start, steps);
    gsi_insert_before (&gsi, call, GSI_NEW_STMT);
-   add_abnormal_goto_call_edges (gsi);
  }
  
  /* Output instructions as GIMPLE trees to increment the power of two histogram
--- 260,265 ----
*************** tree_gen_pow2_profiler (histogram_value
*** 267,273 ****
    val = prepare_instrumented_value (&gsi, value);
    call = gimple_build_call (tree_pow2_profiler_fn, 2, ref_ptr, val);
    gsi_insert_before (&gsi, call, GSI_NEW_STMT);
-   add_abnormal_goto_call_edges (gsi);
  }
  
  /* Output instructions as GIMPLE trees for code to find the most common value.
--- 280,285 ----
*************** tree_gen_one_value_profiler (histogram_v
*** 288,294 ****
    val = prepare_instrumented_value (&gsi, value);
    call = gimple_build_call (tree_one_value_profiler_fn, 2, ref_ptr, val);
    gsi_insert_before (&gsi, call, GSI_NEW_STMT);
-   add_abnormal_goto_call_edges (gsi);
  }
  
  
--- 300,305 ----
*************** tree_gen_ic_profiler (histogram_value va
*** 316,325 ****
      __gcov_indirect_call_callee = (void *) indirect call argument;
     */
  
!   tmp1 = create_tmp_var (ptr_void, "PROF");
    stmt1 = gimple_build_assign (ic_gcov_type_ptr_var, ref_ptr);
    stmt2 = gimple_build_assign (tmp1, unshare_expr (value->hvalue.value));
!   stmt3 = gimple_build_assign (ic_void_ptr_var, tmp1);
  
    gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
    gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
--- 327,337 ----
      __gcov_indirect_call_callee = (void *) indirect call argument;
     */
  
!   tmp1 = create_tmp_reg (ptr_void, "PROF");
    stmt1 = gimple_build_assign (ic_gcov_type_ptr_var, ref_ptr);
    stmt2 = gimple_build_assign (tmp1, unshare_expr (value->hvalue.value));
!   gimple_assign_set_lhs (stmt2, make_ssa_name (tmp1, stmt2));
!   stmt3 = gimple_build_assign (ic_void_ptr_var, gimple_assign_lhs (stmt2));
  
    gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
    gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
*************** tree_gen_ic_func_profiler (void)
*** 337,387 ****
  {
    struct cgraph_node * c_node = cgraph_node (current_function_decl);
    gimple_stmt_iterator gsi;
-   edge e;
-   basic_block bb;
-   edge_iterator ei;
    gimple stmt1, stmt2;
!   tree tree_uid, cur_func, counter_ptr, ptr_var;
  
    if (cgraph_only_called_directly_p (c_node))
      return;
  
    tree_init_edge_profiler ();
  
!   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
!     {
!       tree void0;
  
!       bb = split_edge (e);
!       gsi = gsi_start_bb (bb);
  
!       cur_func = force_gimple_operand_gsi (&gsi,
! 					   build_addr (current_function_decl,
! 						       current_function_decl),
! 					   true, NULL_TREE,
! 					   true, GSI_NEW_STMT);
!       counter_ptr = force_gimple_operand_gsi (&gsi, ic_gcov_type_ptr_var,
! 					      true, NULL_TREE, false,
! 					      GSI_NEW_STMT);
!       ptr_var = force_gimple_operand_gsi (&gsi, ic_void_ptr_var,
! 					  true, NULL_TREE, false,
! 					  GSI_NEW_STMT);
!       tree_uid = build_int_cst (gcov_type_node, c_node->pid);
!       stmt1 = gimple_build_call (tree_indirect_call_profiler_fn, 4,
! 				 counter_ptr, tree_uid, cur_func, ptr_var);
!       gsi_insert_after (&gsi, stmt1, GSI_NEW_STMT);
!       gcc_assert (EDGE_COUNT (bb->succs) == 1);
!       bb = split_edge (EDGE_I (bb->succs, 0));
!       add_abnormal_goto_call_edges (gsi);
! 
!       gsi = gsi_start_bb (bb);
!       /* Set __gcov_indirect_call_callee to 0,
!          so that calls from other modules won't get misattributed
! 	 to the last caller of the current callee. */
!       void0 = build_int_cst (build_pointer_type (void_type_node), 0);
!       stmt2 = gimple_build_assign (ic_void_ptr_var, void0);
!       gsi_insert_after (&gsi, stmt2, GSI_NEW_STMT);
!     }
  }
  
  /* Output instructions as GIMPLE trees for code to find the most common value
--- 349,386 ----
  {
    struct cgraph_node * c_node = cgraph_node (current_function_decl);
    gimple_stmt_iterator gsi;
    gimple stmt1, stmt2;
!   tree tree_uid, cur_func, counter_ptr, ptr_var, void0;
  
    if (cgraph_only_called_directly_p (c_node))
      return;
  
    tree_init_edge_profiler ();
  
!   gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR));
  
!   cur_func = force_gimple_operand_gsi (&gsi,
! 				       build_addr (current_function_decl,
! 						   current_function_decl),
! 				       true, NULL_TREE,
! 				       true, GSI_SAME_STMT);
!   counter_ptr = force_gimple_operand_gsi (&gsi, ic_gcov_type_ptr_var,
! 					  true, NULL_TREE, true,
! 					  GSI_SAME_STMT);
!   ptr_var = force_gimple_operand_gsi (&gsi, ic_void_ptr_var,
! 				      true, NULL_TREE, true,
! 				      GSI_SAME_STMT);
!   tree_uid = build_int_cst (gcov_type_node, c_node->pid);
!   stmt1 = gimple_build_call (tree_indirect_call_profiler_fn, 4,
! 			     counter_ptr, tree_uid, cur_func, ptr_var);
!   gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
  
!   /* Set __gcov_indirect_call_callee to 0,
!      so that calls from other modules won't get misattributed
!      to the last caller of the current callee. */
!   void0 = build_int_cst (build_pointer_type (void_type_node), 0);
!   stmt2 = gimple_build_assign (ic_void_ptr_var, void0);
!   gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
  }
  
  /* Output instructions as GIMPLE trees for code to find the most common value
*************** tree_gen_average_profiler (histogram_val
*** 420,426 ****
    val = prepare_instrumented_value (&gsi, value);
    call = gimple_build_call (tree_average_profiler_fn, 2, ref_ptr, val);
    gsi_insert_before (&gsi, call, GSI_NEW_STMT);
-   add_abnormal_goto_call_edges (gsi);
  }
  
  /* Output instructions as GIMPLE trees to increment the ior histogram
--- 419,424 ----
*************** tree_gen_ior_profiler (histogram_value v
*** 441,521 ****
    val = prepare_instrumented_value (&gsi, value);
    call = gimple_build_call (tree_ior_profiler_fn, 2, ref_ptr, val);
    gsi_insert_before (&gsi, call, GSI_NEW_STMT);
-   add_abnormal_goto_call_edges (gsi);
  }
  
! /* Return 1 if tree-based profiling is in effect, else 0.
!    If it is, set up hooks for tree-based profiling.
!    Gate for pass_tree_profile.  */
! 
! static bool
! do_tree_profiling (void)
! {
!   if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
!     {
!       tree_register_profile_hooks ();
!       gimple_register_value_prof_hooks ();
!       return true;
!     }
!   return false;
! }
  
  static unsigned int
  tree_profiling (void)
  {
    /* Don't profile functions produced at destruction time, particularly
       the gcov datastructure initializer.  Don't profile if it has been
       already instrumented either (when OpenMP expansion creates
       child function from already instrumented body).  */
!   if (cgraph_state == CGRAPH_STATE_FINISHED
!       || cfun->after_tree_profile)
      return 0;
  
!   /* Don't profile functions produced for builtin stuff.  */
!   if (DECL_SOURCE_LOCATION (current_function_decl) == BUILTINS_LOCATION)
!     return 0;
  
!   /* Re-set global shared temporary variable for edge-counters.  */
!   gcov_type_tmp_var = NULL_TREE;
  
!   branch_prob ();
  
-   if (! flag_branch_probabilities
-       && flag_profile_values)
-     tree_gen_ic_func_profiler ();
- 
-   if (flag_branch_probabilities
-       && flag_profile_values
-       && flag_value_profile_transformations)
-     value_profile_transformations ();
-   /* The above could hose dominator info.  Currently there is
-      none coming in, this is a safety valve.  It should be
-      easy to adjust it, if and when there is some.  */
-   free_dominance_info (CDI_DOMINATORS);
-   free_dominance_info (CDI_POST_DOMINATORS);
-   cfun->after_tree_profile = 1;
    return 0;
  }
  
! struct gimple_opt_pass pass_tree_profile =
  {
   {
!   GIMPLE_PASS,
!   "tree_profile",			/* name */
!   do_tree_profiling,			/* gate */
!   tree_profiling,			/* execute */
!   NULL,					/* sub */
!   NULL,					/* next */
!   0,					/* static_pass_number */
!   TV_BRANCH_PROB,			/* tv_id */
!   PROP_gimple_leh | PROP_cfg,		/* properties_required */
!   0,					/* properties_provided */
!   0,					/* properties_destroyed */
!   0,					/* todo_flags_start */
!   TODO_verify_stmts | TODO_dump_func	/* todo_flags_finish */
   }
  };
  
  struct profile_hooks tree_profile_hooks =
  {
    tree_init_edge_profiler,       /* init_edge_profiler */
--- 439,591 ----
    val = prepare_instrumented_value (&gsi, value);
    call = gimple_build_call (tree_ior_profiler_fn, 2, ref_ptr, val);
    gsi_insert_before (&gsi, call, GSI_NEW_STMT);
  }
  
! /* Profile all functions in the callgraph.  */
  
  static unsigned int
  tree_profiling (void)
  {
+   struct cgraph_node *node;
+ 
    /* Don't profile functions produced at destruction time, particularly
       the gcov datastructure initializer.  Don't profile if it has been
       already instrumented either (when OpenMP expansion creates
       child function from already instrumented body).  */
!   if (cgraph_state == CGRAPH_STATE_FINISHED)
      return 0;
  
!   tree_register_profile_hooks ();
!   gimple_register_value_prof_hooks ();
! 
!   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))
! 	continue;
! 
!       /* Don't profile functions produced for builtin stuff.  */
!       if (DECL_SOURCE_LOCATION (node->decl) == BUILTINS_LOCATION
! 	  || DECL_STRUCT_FUNCTION (node->decl)->after_tree_profile)
! 	continue;
! 
!       push_cfun (DECL_STRUCT_FUNCTION (node->decl));
!       current_function_decl = node->decl;
! 
!       /* Re-set global shared temporary variable for edge-counters.  */
!       gcov_type_tmp_var = NULL_TREE;
! 
!       branch_prob ();
! 
!       if (! flag_branch_probabilities
! 	  && flag_profile_values)
! 	tree_gen_ic_func_profiler ();
! 
!       if (flag_branch_probabilities
! 	  && flag_profile_values
! 	  && flag_value_profile_transformations)
! 	value_profile_transformations ();
! 
!       /* The above could hose dominator info.  Currently there is
! 	 none coming in, this is a safety valve.  It should be
! 	 easy to adjust it, if and when there is some.  */
!       free_dominance_info (CDI_DOMINATORS);
!       free_dominance_info (CDI_POST_DOMINATORS);
! 
!       current_function_decl = NULL;
!       pop_cfun ();
!     }
! 
!   /* Drop pure/const flags from instrumented functions.  */
!   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))
! 	continue;
! 
!       /* Don't profile functions produced for builtin stuff.  */
!       if (DECL_SOURCE_LOCATION (node->decl) == BUILTINS_LOCATION
! 	  || DECL_STRUCT_FUNCTION (node->decl)->after_tree_profile)
! 	continue;
! 
!       cgraph_set_readonly_flag (node, false);
!       cgraph_set_pure_flag (node, false);
!       cgraph_set_looping_const_or_pure_flag (node, false);
!     }
! 
!   /* Update call statements and rebuild the cgraph.  */
!   for (node = cgraph_nodes; node; node = node->next)
!     {
!       basic_block bb;
  
!       if (!node->analyzed
! 	  || !gimple_has_body_p (node->decl)
! 	  || !(!node->clone_of || node->decl != node->clone_of->decl))
! 	continue;
! 
!       /* Don't profile functions produced for builtin stuff.  */
!       if (DECL_SOURCE_LOCATION (node->decl) == BUILTINS_LOCATION
! 	  || DECL_STRUCT_FUNCTION (node->decl)->after_tree_profile)
! 	continue;
! 
!       push_cfun (DECL_STRUCT_FUNCTION (node->decl));
!       current_function_decl = node->decl;
! 
!       FOR_EACH_BB (bb)
! 	{
! 	  gimple_stmt_iterator gsi;
! 	  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
! 	    {
! 	      gimple stmt = gsi_stmt (gsi);
! 	      if (is_gimple_call (stmt))
! 		update_stmt (stmt);
! 	    }
! 	}
  
!       cfun->after_tree_profile = 1;
!       update_ssa (TODO_update_ssa);
! 
!       rebuild_cgraph_edges ();
! 
!       current_function_decl = NULL;
!       pop_cfun ();
!     }
  
    return 0;
  }
  
! /* When profile instrumentation, use or test coverage shall be performed.  */
! 
! static bool
! gate_tree_profile_ipa (void)
! {
!   return (!in_lto_p
! 	  && (flag_branch_probabilities || flag_test_coverage
! 	      || profile_arc_flag));
! }
! 
! struct simple_ipa_opt_pass pass_ipa_tree_profile =
  {
   {
!   SIMPLE_IPA_PASS,
!   "tree_profile_ipa",                  /* name */
!   gate_tree_profile_ipa,               /* gate */
!   tree_profiling,                      /* execute */
!   NULL,                                /* sub */
!   NULL,                                /* next */
!   0,                                   /* static_pass_number */
!   TV_IPA_PROFILE,                      /* tv_id */
!   0,                                   /* properties_required */
!   0,                                   /* properties_provided */
!   0,                                   /* properties_destroyed */
!   0,                                   /* todo_flags_start */
!   TODO_dump_func                       /* todo_flags_finish */
   }
  };
  
+ 
  struct profile_hooks tree_profile_hooks =
  {
    tree_init_edge_profiler,       /* init_edge_profiler */
Index: gcc/passes.c
===================================================================
*** gcc/passes.c.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/passes.c	2010-10-04 14:59:51.000000000 +0200
*************** init_optimization_passes (void)
*** 746,763 ****
    p = &all_small_ipa_passes;
    NEXT_PASS (pass_ipa_free_lang_data);
    NEXT_PASS (pass_ipa_function_and_variable_visibility);
-   NEXT_PASS (pass_ipa_early_inline);
-     {
-       struct opt_pass **p = &pass_ipa_early_inline.pass.sub;
-       NEXT_PASS (pass_early_inline);
-       NEXT_PASS (pass_inline_parameters);
-       NEXT_PASS (pass_rebuild_cgraph_edges);
-     }
    NEXT_PASS (pass_early_local_passes);
      {
        struct opt_pass **p = &pass_early_local_passes.pass.sub;
        NEXT_PASS (pass_fixup_cfg);
-       NEXT_PASS (pass_tree_profile);
        NEXT_PASS (pass_init_datastructures);
        NEXT_PASS (pass_expand_omp);
  
--- 746,755 ----
*************** init_optimization_passes (void)
*** 802,807 ****
--- 794,800 ----
        NEXT_PASS (pass_rebuild_cgraph_edges);
        NEXT_PASS (pass_inline_parameters);
      }
+   NEXT_PASS (pass_ipa_tree_profile);
    NEXT_PASS (pass_ipa_increase_alignment);
    NEXT_PASS (pass_ipa_matrix_reorg);
    NEXT_PASS (pass_ipa_lower_emutls);
Index: gcc/testsuite/gcc.dg/tree-prof/val-prof-1.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/val-prof-1.c.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-prof/val-prof-1.c	2010-10-04 15:57:55.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
  int a[1000];
  int b = 256;
  int c = 257;
--- 1,4 ----
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
  int a[1000];
  int b = 256;
  int c = 257;
*************** main ()
*** 15,22 ****
      }
    return 0;
  }
! /* { dg-final-use { scan-tree-dump "Div.mod by constant n=257 transformation on insn" "tree_profile"} } */
  /* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* != 257\\)" "optimized"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
--- 15,22 ----
      }
    return 0;
  }
! /* { dg-final-use { scan-ipa-dump "Div.mod by constant n_\[0-9\]*=257 transformation on insn" "tree_profile_ipa"} } */
  /* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* != 257\\)" "optimized"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/ipa-inline.c
===================================================================
*** gcc/ipa-inline.c.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/ipa-inline.c	2010-10-04 13:20:24.000000000 +0200
*************** struct gimple_opt_pass pass_early_inline
*** 1840,1875 ****
   }
  };
  
- /* When inlining shall be performed.  */
- static bool
- cgraph_gate_ipa_early_inlining (void)
- {
-   return (flag_early_inlining
- 	  && !in_lto_p
- 	  && (flag_branch_probabilities || flag_test_coverage
- 	      || profile_arc_flag));
- }
- 
- /* IPA pass wrapper for early inlining pass.  We need to run early inlining
-    before tree profiling so we have stand alone IPA pass for doing so.  */
- struct simple_ipa_opt_pass pass_ipa_early_inline =
- {
-  {
-   SIMPLE_IPA_PASS,
-   "einline_ipa",			/* name */
-   cgraph_gate_ipa_early_inlining,	/* gate */
-   NULL,					/* execute */
-   NULL,					/* sub */
-   NULL,					/* next */
-   0,					/* static_pass_number */
-   TV_INLINE_HEURISTICS,			/* tv_id */
-   0,	                                /* properties_required */
-   0,					/* properties_provided */
-   0,					/* properties_destroyed */
-   0,					/* todo_flags_start */
-   TODO_dump_cgraph 		        /* todo_flags_finish */
-  }
- };
  
  /* See if statement might disappear after inlining.  We are not terribly
     sophisficated, basically looking for simple abstraction penalty wrappers.  */
--- 1840,1845 ----
Index: gcc/testsuite/g++.dg/tree-prof/indir-call-prof.C
===================================================================
*** gcc/testsuite/g++.dg/tree-prof/indir-call-prof.C.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/testsuite/g++.dg/tree-prof/indir-call-prof.C	2010-10-04 16:20:03.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
  
  struct A {
    A () {}
--- 1,4 ----
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
  
  struct A {
    A () {}
*************** struct B : public A {
*** 15,20 ****
--- 15,21 ----
    { return 1; }
  };
  
+ void * __attribute__((noinline,noclone)) wrap (void *p) { return p; }
  int
  main (void)
  {
*************** main (void)
*** 23,39 ****
    
    A* p;
  
!   p = &a;
    p->AA ();
  
!   p = &b;
    p->AA ();
    
    return 0;
  }
  
! /* { dg-final-use { scan-tree-dump "Indirect call -> direct call.* AA transformation on insn" "tree_profile"} } */
! /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */                                                                                
! /* { dg-final-use { cleanup-tree-dump "optimized" } } */                                                                                              
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */                                                                                           
! 
--- 24,39 ----
    
    A* p;
  
!   p = (A *)wrap ((void *)&a);
    p->AA ();
  
!   p = (B *)wrap ((void *)&b);
    p->AA ();
    
    return 0;
  }
  
! /* { dg-final-use { scan-ipa-dump "Indirect call -> direct call.* AA transformation on insn" "tree_profile_ipa" } } */
! /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized" } } */
! /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
===================================================================
*** gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C	2010-10-04 13:20:24.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-einline2" } */
  class DocId {
   public:
   DocId() { }
--- 1,4 ----
! /* { dg-options "-O2 -fdump-tree-einline" } */
  class DocId {
   public:
   DocId() { }
*************** int main(void)
*** 31,36 ****
   baz.Bar(&baz, gid);
   return 0;
  }
! /* { dg-final-use { scan-tree-dump "Inlining .*Super::Foo" "einline2"} } */                                                                                
! /* { dg-final-use { scan-tree-dump-not "mismatched arguments" "einline2"} } */                                                                 
  /* { dg-final-use { cleanup-tree-dump "einline2" } } */
--- 31,36 ----
   baz.Bar(&baz, gid);
   return 0;
  }
! /* { dg-final-use { scan-tree-dump "Inlining .*Super::Foo" "einline" } } */
! /* { dg-final-use { scan-tree-dump-not "mismatched arguments" "einline" } } */
  /* { dg-final-use { cleanup-tree-dump "einline2" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/tracer-1.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/tracer-1.c.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-prof/tracer-1.c	2010-10-04 13:20:24.000000000 +0200
***************
*** 1,8 ****
  /* { dg-options "-O2 -ftracer -fdump-tree-tracer" } */
! main ()
  {
    int i;
-   int a, b, c;
    for (i = 0; i < 1000; i++)
      {
        if (i % 17)
--- 1,8 ----
  /* { dg-options "-O2 -ftracer -fdump-tree-tracer" } */
! volatile int a, b, c;
! int main ()
  {
    int i;
    for (i = 0; i < 1000; i++)
      {
        if (i % 17)
*************** main ()
*** 14,18 ****
    return 0;
  }
  /* Superblock formation should produce two copies of the increment of c */
! /* { dg-final-generate { scan-tree-dump-times "goto <bb 6>;" 2 "tracer" } } */
  /* { dg-final-use { cleanup-tree-dump "tracer" } } */
--- 14,18 ----
    return 0;
  }
  /* Superblock formation should produce two copies of the increment of c */
! /* { dg-final-generate { scan-tree-dump-times "c =" 2 "tracer" } } */
  /* { dg-final-use { cleanup-tree-dump "tracer" } } */
Index: gcc/tree-pass.h
===================================================================
*** gcc/tree-pass.h.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/tree-pass.h	2010-10-04 15:02:42.000000000 +0200
*************** extern struct gimple_opt_pass pass_lower
*** 353,359 ****
  extern struct gimple_opt_pass pass_lower_eh_dispatch;
  extern struct gimple_opt_pass pass_lower_resx;
  extern struct gimple_opt_pass pass_build_cfg;
- extern struct gimple_opt_pass pass_tree_profile;
  extern struct gimple_opt_pass pass_early_tree_profile;
  extern struct gimple_opt_pass pass_referenced_vars;
  extern struct gimple_opt_pass pass_cleanup_eh;
--- 353,358 ----
*************** extern struct gimple_opt_pass pass_split
*** 447,453 ****
  /* IPA Passes */
  extern struct simple_ipa_opt_pass pass_ipa_lower_emutls;
  extern struct simple_ipa_opt_pass pass_ipa_function_and_variable_visibility;
! extern struct simple_ipa_opt_pass pass_ipa_early_inline;
  
  extern struct simple_ipa_opt_pass pass_early_local_passes;
  
--- 446,452 ----
  /* IPA Passes */
  extern struct simple_ipa_opt_pass pass_ipa_lower_emutls;
  extern struct simple_ipa_opt_pass pass_ipa_function_and_variable_visibility;
! extern struct simple_ipa_opt_pass pass_ipa_tree_profile;
  
  extern struct simple_ipa_opt_pass pass_early_local_passes;
  
Index: gcc/testsuite/g++.dg/tree-ssa/inline-1.C
===================================================================
*** gcc/testsuite/g++.dg/tree-ssa/inline-1.C.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/testsuite/g++.dg/tree-ssa/inline-1.C	2010-10-04 13:20:24.000000000 +0200
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-einline2" } */
  /* { dg-add-options bind_pic_locally } */
  
  namespace std {
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-einline" } */
  /* { dg-add-options bind_pic_locally } */
  
  namespace std {
*************** int main(int argc, char **argv)
*** 31,36 ****
    foreach (argv, argv + argc, inline_me_too);
  }
  
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline2"} } */
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline2"} } */
! /* { dg-final { cleanup-tree-dump "einline2" } } */
--- 31,36 ----
    foreach (argv, argv + argc, inline_me_too);
  }
  
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */
! /* { dg-final { cleanup-tree-dump "einline" } } */
Index: gcc/testsuite/g++.dg/tree-ssa/inline-2.C
===================================================================
*** gcc/testsuite/g++.dg/tree-ssa/inline-2.C.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/testsuite/g++.dg/tree-ssa/inline-2.C	2010-10-04 13:20:24.000000000 +0200
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-einline2" } */
  /* { dg-add-options bind_pic_locally } */
  
  namespace std {
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-einline" } */
  /* { dg-add-options bind_pic_locally } */
  
  namespace std {
*************** int main(int argc, char **argv)
*** 31,36 ****
    foreach (argv, argv + argc, inline_me_too);
  }
  
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline2"} } */
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline2"} } */
! /* { dg-final { cleanup-tree-dump "einline2" } } */
--- 31,36 ----
    foreach (argv, argv + argc, inline_me_too);
  }
  
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */
! /* { dg-final { cleanup-tree-dump "einline" } } */
Index: gcc/testsuite/g++.dg/tree-ssa/inline-3.C
===================================================================
*** gcc/testsuite/g++.dg/tree-ssa/inline-3.C.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/testsuite/g++.dg/tree-ssa/inline-3.C	2010-10-04 13:20:24.000000000 +0200
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-einline2" } */
  /* { dg-add-options bind_pic_locally } */
  
  #include <algorithm>
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-einline" } */
  /* { dg-add-options bind_pic_locally } */
  
  #include <algorithm>
*************** int main(int argc, char **argv)
*** 26,31 ****
    std::for_each (argv, argv + argc, inline_me_too);
  }
  
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline2"} } */
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline2"} } */
! /* { dg-final { cleanup-tree-dump "einline2" } } */
--- 26,31 ----
    std::for_each (argv, argv + argc, inline_me_too);
  }
  
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */
! /* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */
! /* { dg-final { cleanup-tree-dump "einline" } } */
Index: gcc/testsuite/gcc.dg/tree-ssa/20080530.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-ssa/20080530.c.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-ssa/20080530.c	2010-10-04 13:20:24.000000000 +0200
*************** baz (void)
*** 18,22 ****
    return 6;
  }
  
! /* { dg-final { scan-tree-dump-times "Inlining foo into baz" 0 "einline2"} } */
! /* { dg-final { cleanup-tree-dump "einline2" } } */
--- 18,22 ----
    return 6;
  }
  
! /* { dg-final { scan-tree-dump-times "Inlining foo into baz" 0 "einline"} } */
! /* { dg-final { cleanup-tree-dump "einline" } } */
Index: gcc/testsuite/gcc.dg/tree-ssa/inline-3.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-ssa/inline-3.c.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-ssa/inline-3.c	2010-10-04 13:20:24.000000000 +0200
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-einline2" } */
  /* { dg-add-options bind_pic_locally } */
  
  extern void inlined ();
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-einline" } */
  /* { dg-add-options bind_pic_locally } */
  
  extern void inlined ();
*************** inline_me_too (void)
*** 27,32 ****
  {
    inlined();
  }
! /* { dg-final { scan-tree-dump-times "Inlining inline_me " 1 "einline2"} } */
! /* { dg-final { scan-tree-dump-times "Inlining inline_me_too " 1 "einline2"} } */
! /* { dg-final { cleanup-tree-dump "einline2" } } */
--- 27,32 ----
  {
    inlined();
  }
! /* { dg-final { scan-tree-dump-times "Inlining inline_me " 1 "einline"} } */
! /* { dg-final { scan-tree-dump-times "Inlining inline_me_too " 1 "einline"} } */
! /* { dg-final { cleanup-tree-dump "einline" } } */
Index: gcc/testsuite/gcc.dg/tree-ssa/inline-4.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-ssa/inline-4.c.orig	2010-09-29 17:45:28.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-ssa/inline-4.c	2010-10-04 13:20:24.000000000 +0200
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-einline2" } */
  /* { dg-add-options bind_pic_locally } */
  
  extern int rand(void);
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-einline" } */
  /* { dg-add-options bind_pic_locally } */
  
  extern int rand(void);
*************** int main()
*** 23,27 ****
      }
  }
  
! /* { dg-final { scan-tree-dump "Inlining get_data_for into main" "einline2" } } */
! /* { dg-final { cleanup-tree-dump "einline2" } } */
--- 23,27 ----
      }
  }
  
! /* { dg-final { scan-tree-dump "Inlining get_data_for into main" "einline" } } */
! /* { dg-final { cleanup-tree-dump "einline" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1.c.orig	2008-05-29 10:58:29.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1.c	2010-10-04 16:00:30.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-tree_profile" } */
  /* { dg-additional-sources "ic-misattribution-1a.c" } */
  
  extern void other_caller (void);
--- 1,4 ----
! /* { dg-options "-O2 -fdump-ipa-tree_profile_ipa" } */
  /* { dg-additional-sources "ic-misattribution-1a.c" } */
  
  extern void other_caller (void);
*************** caller(void (*func) (void))
*** 15,19 ****
    func ();
  }
  
! /* { dg-final-use { scan-tree-dump "hist->count 1 hist->all 1" "tree_profile" } } */
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
--- 15,19 ----
    func ();
  }
  
! /* { dg-final-use { scan-ipa-dump "hist->count 1 hist->all 1" "tree_profile_ipa" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/indir-call-prof.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/indir-call-prof.c.orig	2007-01-22 11:02:02.000000000 +0100
--- gcc/testsuite/gcc.dg/tree-prof/indir-call-prof.c	2010-10-04 15:54:22.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
  
  static int a1 (void)
  {
--- 1,4 ----
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
  
  static int a1 (void)
  {
*************** main (void)
*** 37,45 ****
    return 0;
  }
  
! /* { dg-final-use { scan-tree-dump "Indirect call -> direct call.* a1 transformation on insn" "tree_profile"} } */
! /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */                                                                                
! /* { dg-final-use { cleanup-tree-dump "optimized" } } */                                                                                              
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
!                                                                                            
! 
--- 37,43 ----
    return 0;
  }
  
! /* { dg-final-use { scan-ipa-dump "Indirect call -> direct call.* a1 transformation on insn" "tree_profile_ipa"} } */
! /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
! /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/stringop-1.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/stringop-1.c.orig	2010-07-01 10:55:04.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-prof/stringop-1.c	2010-10-04 15:54:55.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
  int a[1000];
  int b[1000];
  int size=1;
--- 1,4 ----
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
  int a[1000];
  int b[1000];
  int size=1;
*************** main()
*** 13,22 ****
      }
     return 0;
  }
! /* { dg-final-use { scan-tree-dump "Single value 4 stringop" "tree_profile"} } */
  /* Really this ought to simplify into assignment, but we are not there yet.  */
  /* a[0] = b[0] is what we fold the resulting memcpy into.  */
  /* { dg-final-use { scan-tree-dump " = MEM.*&b" "optimized"} } */
  /* { dg-final-use { scan-tree-dump "MEM.*&a\\\] = " "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
--- 13,22 ----
      }
     return 0;
  }
! /* { dg-final-use { scan-ipa-dump "Single value 4 stringop" "tree_profile_ipa"} } */
  /* Really this ought to simplify into assignment, but we are not there yet.  */
  /* a[0] = b[0] is what we fold the resulting memcpy into.  */
  /* { dg-final-use { scan-tree-dump " = MEM.*&b" "optimized"} } */
  /* { dg-final-use { scan-tree-dump "MEM.*&a\\\] = " "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/stringop-2.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/stringop-2.c.orig	2009-04-09 10:05:51.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-prof/stringop-2.c	2010-10-04 15:57:00.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
  int a[1000];
  int b[1000];
  int size=1;
--- 1,4 ----
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
  int a[1000];
  int b[1000];
  int size=1;
*************** main()
*** 13,20 ****
      }
     return 0;
  }
! /* { dg-final-use { scan-tree-dump "Single value 4 stringop" "tree_profile"} } */
  /* The versioned memset of size 4 should be optimized to an assignment.  */
  /* { dg-final-use { scan-tree-dump "a\\\[0\\\] = 168430090" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
--- 13,20 ----
      }
     return 0;
  }
! /* { dg-final-use { scan-ipa-dump "Single value 4 stringop" "tree_profile_ipa"} } */
  /* The versioned memset of size 4 should be optimized to an assignment.  */
  /* { dg-final-use { scan-tree-dump "a\\\[0\\\] = 168430090" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/update-loopch.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/update-loopch.c.orig	2006-02-07 11:14:07.000000000 +0100
--- gcc/testsuite/gcc.dg/tree-prof/update-loopch.c	2010-10-04 15:57:31.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-tree_profile-blocks -fdump-tree-optimized-blocks" } */
  int max = 33333;
  int a[8];
  int
--- 1,4 ----
! /* { dg-options "-O2 -fdump-ipa-tree_profile_ipa-blocks -fdump-tree-optimized-blocks" } */
  int max = 33333;
  int a[8];
  int
*************** main ()
*** 14,21 ****
  /* Loop header copying will peel away the initial conditional, so the loop body
     is once reached directly from entry point of function, rest via loopback
     edge.  */
! /* { dg-final-use { scan-tree-dump "count:33333" "tree_profile"} } */
  /* { dg-final-use { scan-tree-dump "count:33332" "optimized"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
--- 14,21 ----
  /* Loop header copying will peel away the initial conditional, so the loop body
     is once reached directly from entry point of function, rest via loopback
     edge.  */
! /* { dg-final-use { scan-ipa-dump "count:33333" "tree_profile_ipa"} } */
  /* { dg-final-use { scan-tree-dump "count:33332" "optimized"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/val-prof-2.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/val-prof-2.c.orig	2009-04-27 10:20:40.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-prof/val-prof-2.c	2010-10-04 15:58:31.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
  unsigned int a[1000];
  unsigned int b = 256;
  unsigned int c = 1024;
--- 1,4 ----
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
  unsigned int a[1000];
  unsigned int b = 256;
  unsigned int c = 1024;
*************** main ()
*** 23,32 ****
      }
    return 0;
  }
! /* { dg-final-use { scan-tree-dump "Mod power of 2 transformation on insn" "tree_profile"} } */
  /* This is part of code checking that n is power of 2, so we are sure that the transformation
     didn't get optimized out.  */
  /* { dg-final-use { scan-tree-dump "n_\[0-9\]* \\+ 0xffff" "optimized"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
--- 23,32 ----
      }
    return 0;
  }
! /* { dg-final-use { scan-ipa-dump "Mod power of 2 transformation on insn" "tree_profile_ipa" } } */
  /* This is part of code checking that n is power of 2, so we are sure that the transformation
     didn't get optimized out.  */
  /* { dg-final-use { scan-tree-dump "n_\[0-9\]* \\+ 0xffff" "optimized"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/val-prof-3.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/val-prof-3.c.orig	2009-04-27 10:20:40.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-prof/val-prof-3.c	2010-10-04 15:58:55.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
  unsigned int a[1000];
  unsigned int b = 257;
  unsigned int c = 1023;
--- 1,4 ----
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
  unsigned int a[1000];
  unsigned int b = 257;
  unsigned int c = 1023;
*************** main ()
*** 23,32 ****
      }
    return 0;
  }
! /* { dg-final-use { scan-tree-dump "Mod subtract transformation on insn" "tree_profile"} } */
  /* This is part of code checking that n is greater than the divisor so we are sure that it
     didn't get optimized out.  */
  /* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* \\>" "optimized"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
--- 23,32 ----
      }
    return 0;
  }
! /* { dg-final-use { scan-ipa-dump "Mod subtract transformation on insn" "tree_profile_ipa" } } */
  /* This is part of code checking that n is greater than the divisor so we are sure that it
     didn't get optimized out.  */
  /* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* \\>" "optimized"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/val-prof-4.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/val-prof-4.c.orig	2009-04-27 10:20:40.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-prof/val-prof-4.c	2010-10-04 15:59:19.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
  unsigned int a[1000];
  unsigned int b = 999;
  unsigned int c = 1002;
--- 1,4 ----
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
  unsigned int a[1000];
  unsigned int b = 999;
  unsigned int c = 1002;
*************** main ()
*** 23,32 ****
      }
    return 0;
  }
! /* { dg-final-use { scan-tree-dump "Mod subtract transformation on insn" "tree_profile"} } */
  /* This is part of code checking that n is greater than the divisor so we are sure that it
     didn't get optimized out.  */
  /* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* \\>" "optimized"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
--- 23,32 ----
      }
    return 0;
  }
! /* { dg-final-use { scan-ipa-dump "Mod subtract transformation on insn" "tree_profile_ipa" } } */
  /* This is part of code checking that n is greater than the divisor so we are sure that it
     didn't get optimized out.  */
  /* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* \\>" "optimized"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c.orig	2006-02-07 11:14:07.000000000 +0100
--- gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c	2010-10-04 15:59:39.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
  int a[1000];
  int b=997;
  main()
--- 1,4 ----
! /* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */
  int a[1000];
  int b=997;
  main()
*************** main()
*** 11,17 ****
  			a[i]/=b;
  	return 0;
  }
! /* { dg-final-use { scan-tree-dump "Div.mod by constant b.*=997 transformation on insn" "tree_profile"} } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
--- 11,17 ----
  			a[i]/=b;
  	return 0;
  }
! /* { dg-final-use { scan-ipa-dump "Div.mod by constant b.*=997 transformation on insn" "tree_profile_ipa" } } */
  /* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
  /* { dg-final-use { cleanup-tree-dump "optimized" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/tree-prof/val-prof-7.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-prof/val-prof-7.c.orig	2009-09-21 11:25:17.000000000 +0200
--- gcc/testsuite/gcc.dg/tree-prof/val-prof-7.c	2010-10-04 16:00:03.000000000 +0200
***************
*** 1,4 ****
! /* { dg-options "-O2 -fdump-tree-tree_profile -mtune=core2" } */
  /* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } { "*" } { "" } } */
  
  #include <strings.h>
--- 1,4 ----
! /* { dg-options "-O2 -fdump-ipa-tree_profile_ipa -mtune=core2" } */
  /* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } { "*" } { "" } } */
  
  #include <strings.h>
*************** int main() {
*** 22,26 ****
    return 0;
  }
  
! /* { dg-final-use { scan-tree-dump "Single value 8 stringop transformation on bzero" "tree_profile"} } */
! /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
--- 22,26 ----
    return 0;
  }
  
! /* { dg-final-use { scan-ipa-dump "Single value 8 stringop transformation on bzero" "tree_profile_ipa" } } */
! /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/profile-dir-1.c
===================================================================
*** gcc/testsuite/gcc.dg/profile-dir-1.c.orig	2010-08-09 11:15:40.000000000 +0200
--- gcc/testsuite/gcc.dg/profile-dir-1.c	2010-10-04 16:21:45.000000000 +0200
***************
*** 1,6 ****
  /* { dg-do compile } */
! /* { dg-options "-O -fprofile-generate=. -fdump-tree-tree_profile" } */
! /* { dg-final { scan-tree-dump " ./profile-dir-1.gcda" "tree_profile" } } */
  
  int
  main(void)
--- 1,6 ----
  /* { dg-do compile } */
! /* { dg-options "-O -fprofile-generate=. -fdump-ipa-tree_profile_ipa" } */
! /* { dg-final { scan-ipa-dump " ./profile-dir-1.gcda" "tree_profile_ipa" } } */
  
  int
  main(void)
*************** main(void)
*** 8,11 ****
    return 0;
  }
  
! /* { dg-final { cleanup-tree-dump "tree_profile" } } */
--- 8,11 ----
    return 0;
  }
  
! /* { dg-final { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/profile-dir-2.c
===================================================================
*** gcc/testsuite/gcc.dg/profile-dir-2.c.orig	2010-08-09 11:15:40.000000000 +0200
--- gcc/testsuite/gcc.dg/profile-dir-2.c	2010-10-04 16:21:16.000000000 +0200
***************
*** 1,6 ****
  /* { dg-do compile } */
! /* { dg-options "-O -fprofile-generate -fdump-tree-tree_profile" } */
! /* { dg-final { scan-tree-dump "/profile-dir-2.gcda" "tree_profile" } } */
  
  int
  main(void)
--- 1,6 ----
  /* { dg-do compile } */
! /* { dg-options "-O -fprofile-generate -fdump-ipa-tree_profile_ipa" } */
! /* { dg-final { scan-ipa-dump "/profile-dir-2.gcda" "tree_profile_ipa" } } */
  
  int
  main(void)
*************** main(void)
*** 8,11 ****
    return 0;
  }
  
! /* { dg-final { cleanup-tree-dump "tree_profile" } } */
--- 8,11 ----
    return 0;
  }
  
! /* { dg-final { cleanup-ipa-dump "tree_profile_ipa" } } */
Index: gcc/testsuite/gcc.dg/profile-dir-3.c
===================================================================
*** gcc/testsuite/gcc.dg/profile-dir-3.c.orig	2010-08-09 11:15:40.000000000 +0200
--- gcc/testsuite/gcc.dg/profile-dir-3.c	2010-10-04 16:21:35.000000000 +0200
***************
*** 1,6 ****
  /* { dg-do compile } */
! /* { dg-options "-O -fprofile-generate -fprofile-dir=. -fdump-tree-tree_profile" } */
! /* { dg-final { scan-tree-dump " ./profile-dir-3.gcda" "tree_profile" } } */
  
  int
  main(void)
--- 1,6 ----
  /* { dg-do compile } */
! /* { dg-options "-O -fprofile-generate -fprofile-dir=. -fdump-ipa-tree_profile_ipa" } */
! /* { dg-final { scan-ipa-dump " ./profile-dir-3.gcda" "tree_profile_ipa" } } */
  
  int
  main(void)
*************** main(void)
*** 8,11 ****
    return 0;
  }
  
! /* { dg-final { cleanup-tree-dump "tree_profile" } } */
--- 8,11 ----
    return 0;
  }
  
! /* { dg-final { cleanup-ipa-dump "tree_profile_ipa" } } */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]