From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10180 invoked by alias); 13 Aug 2012 13:02:19 -0000 Received: (qmail 10112 invoked by uid 22791); 13 Aug 2012 13:02:14 -0000 X-SWARE-Spam-Status: No, hits=-4.0 required=5.0 tests=AWL,BAYES_50,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,TW_CF,TW_TM,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 13 Aug 2012 13:01:58 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id CC256A476F for ; Mon, 13 Aug 2012 15:01:56 +0200 (CEST) Date: Mon, 13 Aug 2012 13:02:00 -0000 From: Richard Guenther To: gcc-patches@gcc.gnu.org Subject: [PATCH] Remove basic_block->loop_depth Message-ID: User-Agent: Alpine 2.00 (LNX 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2012-08/txt/msg00770.txt.bz2 Accessing loop_depth (bb->loop_father) isn't very expensive. The following removes the duplicate info in basic-blocks which is not properly kept up-to-date at the moment. Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. 2012-08-13 Richard Guenther * basic-block.h (struct basic_block): Remove loop_depth member, move flags and index members next to each other. * cfgloop.h (bb_loop_depth): New inline function. * cfghooks.c (split_block): Do not set loop_depth. (duplicate_block): Likewise. * cfgloop.c (flow_loop_nodes_find): Likewise. (flow_loops_find): Likewise. (add_bb_to_loop): Likewise. (remove_bb_from_loops): Likewise. * cfgrtl.c (force_nonfallthru_and_redirect): Likewise. * gimple-streamer-in.c (input_bb): Do not stream loop_depth. * gimple-streamer-out.c (output_bb): Likewise. * bt-load.c: Include cfgloop.h. (migrate_btr_defs): Use bb_loop_depth. * cfg.c (dump_bb_info): Likewise. * final.c (compute_alignments): Likewise. * ira.c (update_equiv_regs): Likewise. * tree-ssa-copy.c (init_copy_prop): Likewise. * tree-ssa-dom.c (loop_depth_of_name): Likewise. * tree-ssa-forwprop.c: Include cfgloop.h. (forward_propagate_addr_expr): Use bb_loop_depth. * tree-ssa-pre.c (insert_into_preds_of_block): Likewise. * tree-ssa-sink.c (select_best_block): Likewise. * ipa-inline-analysis.c: Include cfgloop.h. (estimate_function_body_sizes): Use bb_loop_depth. * Makefile.in (tree-ssa-forwprop.o): Depend on $(CFGLOOP_H). (ipa-inline-analysis.o): Likewise. (bt-load.o): Likewise. Index: trunk/gcc/basic-block.h =================================================================== *** trunk.orig/gcc/basic-block.h 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/basic-block.h 2012-08-13 14:03:09.438889233 +0200 *************** struct GTY((chain_next ("%h.next_bb"), c *** 160,173 **** } GTY ((tag ("1"))) x; } GTY ((desc ("((%1.flags & BB_RTL) != 0)"))) il; ! /* Expected number of executions: calculated in profile.c. */ ! gcov_type count; /* The index of this block. */ int index; ! /* The loop depth of this block. */ ! int loop_depth; /* Expected frequency. Normalized to be in range 0 to BB_FREQ_MAX. */ int frequency; --- 160,173 ---- } GTY ((tag ("1"))) x; } GTY ((desc ("((%1.flags & BB_RTL) != 0)"))) il; ! /* Various flags. See cfg-flags.def. */ ! int flags; /* The index of this block. */ int index; ! /* Expected number of executions: calculated in profile.c. */ ! gcov_type count; /* Expected frequency. Normalized to be in range 0 to BB_FREQ_MAX. */ int frequency; *************** struct GTY((chain_next ("%h.next_bb"), c *** 176,184 **** among several basic blocks that share a common locus, allowing for more accurate sample-based profiling. */ int discriminator; - - /* Various flags. See cfg-flags.def. */ - int flags; }; /* This ensures that struct gimple_bb_info is smaller than --- 176,181 ---- Index: trunk/gcc/cfghooks.c =================================================================== *** trunk.orig/gcc/cfghooks.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/cfghooks.c 2012-08-13 14:03:09.438889233 +0200 *************** split_block (basic_block bb, void *i) *** 462,468 **** new_bb->count = bb->count; new_bb->frequency = bb->frequency; - new_bb->loop_depth = bb->loop_depth; new_bb->discriminator = bb->discriminator; if (dom_info_available_p (CDI_DOMINATORS)) --- 462,467 ---- *************** duplicate_block (basic_block bb, edge e, *** 985,991 **** if (after) move_block_after (new_bb, after); - new_bb->loop_depth = bb->loop_depth; new_bb->flags = bb->flags; FOR_EACH_EDGE (s, ei, bb->succs) { --- 984,989 ---- Index: trunk/gcc/cfgloop.c =================================================================== *** trunk.orig/gcc/cfgloop.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/cfgloop.c 2012-08-13 14:11:57.325870997 +0200 *************** flow_loop_nodes_find (basic_block header *** 229,238 **** int num_nodes = 1; edge latch; edge_iterator latch_ei; - unsigned depth = loop_depth (loop); header->loop_father = loop; - header->loop_depth = depth; FOR_EACH_EDGE (latch, latch_ei, loop->header->preds) { --- 229,236 ---- *************** flow_loop_nodes_find (basic_block header *** 243,249 **** num_nodes++; VEC_safe_push (basic_block, heap, stack, latch->src); latch->src->loop_father = loop; - latch->src->loop_depth = depth; while (!VEC_empty (basic_block, stack)) { --- 241,246 ---- *************** flow_loop_nodes_find (basic_block header *** 260,266 **** if (ancestor->loop_father != loop) { ancestor->loop_father = loop; - ancestor->loop_depth = depth; num_nodes++; VEC_safe_push (basic_block, heap, stack, ancestor); } --- 257,262 ---- *************** path_without_edge_flags (basic_block fro *** 419,425 **** } /* Find all the natural loops in the function and save in LOOPS structure and ! recalculate loop_depth information in basic block structures. Return the number of natural loops found. */ int --- 415,421 ---- } /* Find all the natural loops in the function and save in LOOPS structure and ! recalculate loop_father information in basic block structures. Return the number of natural loops found. */ int *************** flow_loops_find (struct loops *loops) *** 458,465 **** { edge_iterator ei; - header->loop_depth = 0; - /* If we have an abnormal predecessor, do not consider the loop (not worth the problems). */ if (bb_has_abnormal_pred (header)) --- 454,459 ---- *************** add_bb_to_loop (basic_block bb, struct l *** 1243,1249 **** gcc_assert (bb->loop_father == NULL); bb->loop_father = loop; - bb->loop_depth = loop_depth (loop); loop->num_nodes++; FOR_EACH_VEC_ELT (loop_p, loop->superloops, i, ploop) ploop->num_nodes++; --- 1237,1242 ---- *************** remove_bb_from_loops (basic_block bb) *** 1273,1279 **** FOR_EACH_VEC_ELT (loop_p, loop->superloops, i, ploop) ploop->num_nodes--; bb->loop_father = NULL; - bb->loop_depth = 0; FOR_EACH_EDGE (e, ei, bb->succs) { --- 1266,1271 ---- Index: trunk/gcc/cfgrtl.c =================================================================== *** trunk.orig/gcc/cfgrtl.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/cfgrtl.c 2012-08-13 14:03:09.440889233 +0200 *************** force_nonfallthru_and_redirect (edge e, *** 1438,1444 **** jump_block = create_basic_block (note, NULL, e->src); jump_block->count = count; jump_block->frequency = EDGE_FREQUENCY (e); - jump_block->loop_depth = target->loop_depth; /* Make sure new block ends up in correct hot/cold section. */ --- 1438,1443 ---- Index: trunk/gcc/gimple-streamer-in.c =================================================================== *** trunk.orig/gcc/gimple-streamer-in.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/gimple-streamer-in.c 2012-08-13 14:03:09.441889233 +0200 *************** input_bb (struct lto_input_block *ib, en *** 296,302 **** bb->count = (streamer_read_hwi (ib) * count_materialization_scale + REG_BR_PROB_BASE / 2) / REG_BR_PROB_BASE; - bb->loop_depth = streamer_read_hwi (ib); bb->frequency = streamer_read_hwi (ib); bb->flags = streamer_read_hwi (ib); --- 296,301 ---- Index: trunk/gcc/bt-load.c =================================================================== *** trunk.orig/gcc/bt-load.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/bt-load.c 2012-08-13 14:03:09.442889232 +0200 *************** along with GCC; see the file COPYING3. *** 37,42 **** --- 37,43 ---- #include "tree-pass.h" #include "recog.h" #include "df.h" + #include "cfgloop.h" /* Target register optimizations - these are performed after reload. */ *************** migrate_btr_defs (enum reg_class btr_cla *** 1408,1414 **** fprintf(dump_file, "Basic block %d: count = " HOST_WIDEST_INT_PRINT_DEC " loop-depth = %d idom = %d\n", ! i, (HOST_WIDEST_INT) bb->count, bb->loop_depth, get_immediate_dominator (CDI_DOMINATORS, bb)->index); } } --- 1409,1415 ---- fprintf(dump_file, "Basic block %d: count = " HOST_WIDEST_INT_PRINT_DEC " loop-depth = %d idom = %d\n", ! i, (HOST_WIDEST_INT) bb->count, bb_loop_depth (bb), get_immediate_dominator (CDI_DOMINATORS, bb)->index); } } Index: trunk/gcc/cfg.c =================================================================== *** trunk.orig/gcc/cfg.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/cfg.c 2012-08-13 14:03:09.442889232 +0200 *************** dump_bb_info (FILE *outf, basic_block bb *** 698,704 **** if (flags & TDF_COMMENT) fputs (";; ", outf); fprintf (outf, "%sbasic block %d, loop depth %d", ! s_indent, bb->index, bb->loop_depth); if (flags & TDF_DETAILS) { fprintf (outf, ", count " HOST_WIDEST_INT_PRINT_DEC, --- 698,704 ---- if (flags & TDF_COMMENT) fputs (";; ", outf); fprintf (outf, "%sbasic block %d, loop depth %d", ! s_indent, bb->index, bb_loop_depth (bb)); if (flags & TDF_DETAILS) { fprintf (outf, ", count " HOST_WIDEST_INT_PRINT_DEC, Index: trunk/gcc/final.c =================================================================== *** trunk.orig/gcc/final.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/final.c 2012-08-13 14:03:09.442889232 +0200 *************** compute_alignments (void) *** 739,745 **** { if (dump_file) fprintf(dump_file, "BB %4i freq %4i loop %2i loop_depth %2i skipped.\n", ! bb->index, bb->frequency, bb->loop_father->num, bb->loop_depth); continue; } max_log = LABEL_ALIGN (label); --- 739,746 ---- { if (dump_file) fprintf(dump_file, "BB %4i freq %4i loop %2i loop_depth %2i skipped.\n", ! bb->index, bb->frequency, bb->loop_father->num, ! bb_loop_depth (bb)); continue; } max_log = LABEL_ALIGN (label); *************** compute_alignments (void) *** 756,762 **** { fprintf(dump_file, "BB %4i freq %4i loop %2i loop_depth %2i fall %4i branch %4i", bb->index, bb->frequency, bb->loop_father->num, ! bb->loop_depth, fallthru_frequency, branch_frequency); if (!bb->loop_father->inner && bb->loop_father->num) fprintf (dump_file, " inner_loop"); --- 757,763 ---- { fprintf(dump_file, "BB %4i freq %4i loop %2i loop_depth %2i fall %4i branch %4i", bb->index, bb->frequency, bb->loop_father->num, ! bb_loop_depth (bb), fallthru_frequency, branch_frequency); if (!bb->loop_father->inner && bb->loop_father->num) fprintf (dump_file, " inner_loop"); Index: trunk/gcc/gimple-streamer-out.c =================================================================== *** trunk.orig/gcc/gimple-streamer-out.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/gimple-streamer-out.c 2012-08-13 14:03:09.443889232 +0200 *************** output_bb (struct output_block *ob, basi *** 176,182 **** streamer_write_uhwi (ob, bb->index); streamer_write_hwi (ob, bb->count); - streamer_write_hwi (ob, bb->loop_depth); streamer_write_hwi (ob, bb->frequency); streamer_write_hwi (ob, bb->flags); --- 176,181 ---- Index: trunk/gcc/ira.c =================================================================== *** trunk.orig/gcc/ira.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/ira.c 2012-08-13 14:03:09.443889232 +0200 *************** update_equiv_regs (void) *** 2777,2783 **** a register can be set below its use. */ FOR_EACH_BB (bb) { ! loop_depth = bb->loop_depth; for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); --- 2777,2783 ---- a register can be set below its use. */ FOR_EACH_BB (bb) { ! loop_depth = bb_loop_depth (bb); for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); *************** update_equiv_regs (void) *** 3053,3059 **** basic block. */ FOR_EACH_BB_REVERSE (bb) { ! loop_depth = bb->loop_depth; for (insn = BB_END (bb); insn != PREV_INSN (BB_HEAD (bb)); insn = PREV_INSN (insn)) --- 3053,3059 ---- basic block. */ FOR_EACH_BB_REVERSE (bb) { ! loop_depth = bb_loop_depth (bb); for (insn = BB_END (bb); insn != PREV_INSN (BB_HEAD (bb)); insn = PREV_INSN (insn)) Index: trunk/gcc/tree-ssa-copy.c =================================================================== *** trunk.orig/gcc/tree-ssa-copy.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/tree-ssa-copy.c 2012-08-13 14:03:09.443889232 +0200 *************** init_copy_prop (void) *** 670,676 **** FOR_EACH_BB (bb) { gimple_stmt_iterator si; ! int depth = bb->loop_depth; for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) { --- 670,676 ---- FOR_EACH_BB (bb) { gimple_stmt_iterator si; ! int depth = bb_loop_depth (bb); for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) { Index: trunk/gcc/tree-ssa-dom.c =================================================================== *** trunk.orig/gcc/tree-ssa-dom.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/tree-ssa-dom.c 2012-08-13 14:03:09.444889232 +0200 *************** loop_depth_of_name (tree x) *** 1391,1397 **** if (!defbb) return 0; ! return defbb->loop_depth; } /* Record that X is equal to Y in const_and_copies. Record undo --- 1391,1397 ---- if (!defbb) return 0; ! return bb_loop_depth (defbb); } /* Record that X is equal to Y in const_and_copies. Record undo Index: trunk/gcc/tree-ssa-forwprop.c =================================================================== *** trunk.orig/gcc/tree-ssa-forwprop.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/tree-ssa-forwprop.c 2012-08-13 14:03:09.444889232 +0200 *************** along with GCC; see the file COPYING3. *** 32,37 **** --- 32,38 ---- #include "flags.h" #include "gimple.h" #include "expr.h" + #include "cfgloop.h" /* This pass propagates the RHS of assignment statements into use sites of the LHS of the assignment. It's basically a specialized *************** forward_propagate_addr_expr_1 (tree name *** 1002,1008 **** static bool forward_propagate_addr_expr (tree name, tree rhs) { ! int stmt_loop_depth = gimple_bb (SSA_NAME_DEF_STMT (name))->loop_depth; imm_use_iterator iter; gimple use_stmt; bool all = true; --- 1003,1009 ---- static bool forward_propagate_addr_expr (tree name, tree rhs) { ! int stmt_loop_depth = bb_loop_depth (gimple_bb (SSA_NAME_DEF_STMT (name))); imm_use_iterator iter; gimple use_stmt; bool all = true; *************** forward_propagate_addr_expr (tree name, *** 1025,1031 **** /* If the use is in a deeper loop nest, then we do not want to propagate non-invariant ADDR_EXPRs into the loop as that is likely adding expression evaluations into the loop. */ ! if (gimple_bb (use_stmt)->loop_depth > stmt_loop_depth && !is_gimple_min_invariant (rhs)) { all = false; --- 1026,1032 ---- /* If the use is in a deeper loop nest, then we do not want to propagate non-invariant ADDR_EXPRs into the loop as that is likely adding expression evaluations into the loop. */ ! if (bb_loop_depth (gimple_bb (use_stmt)) > stmt_loop_depth && !is_gimple_min_invariant (rhs)) { all = false; Index: trunk/gcc/tree-ssa-pre.c =================================================================== *** trunk.orig/gcc/tree-ssa-pre.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/tree-ssa-pre.c 2012-08-13 14:03:09.445889232 +0200 *************** insert_into_preds_of_block (basic_block *** 3204,3210 **** gimple phi; /* Make sure we aren't creating an induction variable. */ ! if (block->loop_depth > 0 && EDGE_COUNT (block->preds) == 2) { bool firstinsideloop = false; bool secondinsideloop = false; --- 3204,3210 ---- gimple phi; /* Make sure we aren't creating an induction variable. */ ! if (bb_loop_depth (block) > 0 && EDGE_COUNT (block->preds) == 2) { bool firstinsideloop = false; bool secondinsideloop = false; Index: trunk/gcc/tree-ssa-sink.c =================================================================== *** trunk.orig/gcc/tree-ssa-sink.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/tree-ssa-sink.c 2012-08-13 14:03:09.445889232 +0200 *************** select_best_block (basic_block early_bb, *** 212,218 **** { /* If we've moved into a lower loop nest, then that becomes our best block. */ ! if (temp_bb->loop_depth < best_bb->loop_depth) best_bb = temp_bb; /* Walk up the dominator tree, hopefully we'll find a shallower --- 212,218 ---- { /* If we've moved into a lower loop nest, then that becomes our best block. */ ! if (bb_loop_depth (temp_bb) < bb_loop_depth (best_bb)) best_bb = temp_bb; /* Walk up the dominator tree, hopefully we'll find a shallower *************** select_best_block (basic_block early_bb, *** 223,229 **** /* If we found a shallower loop nest, then we always consider that a win. This will always give us the most control dependent block within that loop nest. */ ! if (best_bb->loop_depth < early_bb->loop_depth) return best_bb; /* Get the sinking threshold. If the statement to be moved has memory --- 223,229 ---- /* If we found a shallower loop nest, then we always consider that a win. This will always give us the most control dependent block within that loop nest. */ ! if (bb_loop_depth (best_bb) < bb_loop_depth (early_bb)) return best_bb; /* Get the sinking threshold. If the statement to be moved has memory *************** select_best_block (basic_block early_bb, *** 239,245 **** /* If BEST_BB is at the same nesting level, then require it to have significantly lower execution frequency to avoid gratutious movement. */ ! if (best_bb->loop_depth == early_bb->loop_depth && best_bb->frequency < (early_bb->frequency * threshold / 100.0)) return best_bb; --- 239,245 ---- /* If BEST_BB is at the same nesting level, then require it to have significantly lower execution frequency to avoid gratutious movement. */ ! if (bb_loop_depth (best_bb) == bb_loop_depth (early_bb) && best_bb->frequency < (early_bb->frequency * threshold / 100.0)) return best_bb; Index: trunk/gcc/Makefile.in =================================================================== *** trunk.orig/gcc/Makefile.in 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/Makefile.in 2012-08-13 14:03:09.446889232 +0200 *************** tree-ssa-dse.o : tree-ssa-dse.c $(CONFIG *** 2271,2277 **** $(TREE_FLOW_H) $(TREE_PASS_H) domwalk.h $(FLAGS_H) \ $(GIMPLE_PRETTY_PRINT_H) langhooks.h tree-ssa-forwprop.o : tree-ssa-forwprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ ! $(TM_H) $(TREE_H) $(TM_P_H) $(BASIC_BLOCK_H) \ $(TREE_FLOW_H) $(TREE_PASS_H) $(DIAGNOSTIC_H) \ langhooks.h $(FLAGS_H) $(GIMPLE_H) $(GIMPLE_PRETTY_PRINT_H) $(EXPR_H) tree-ssa-phiprop.o : tree-ssa-phiprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ --- 2271,2277 ---- $(TREE_FLOW_H) $(TREE_PASS_H) domwalk.h $(FLAGS_H) \ $(GIMPLE_PRETTY_PRINT_H) langhooks.h tree-ssa-forwprop.o : tree-ssa-forwprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ ! $(TM_H) $(TREE_H) $(TM_P_H) $(BASIC_BLOCK_H) $(CFGLOOP_H) \ $(TREE_FLOW_H) $(TREE_PASS_H) $(DIAGNOSTIC_H) \ langhooks.h $(FLAGS_H) $(GIMPLE_H) $(GIMPLE_PRETTY_PRINT_H) $(EXPR_H) tree-ssa-phiprop.o : tree-ssa-phiprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ *************** ipa-inline.o : ipa-inline.c $(CONFIG_H) *** 2899,2905 **** $(EXCEPT_H) $(GIMPLE_PRETTY_PRINT_H) ipa-inline.h $(TARGET_H) $(IPA_UTILS_H) ipa-inline-analysis.o : ipa-inline-analysis.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ $(TREE_H) langhooks.h $(TREE_INLINE_H) $(FLAGS_H) $(CGRAPH_H) intl.h \ ! $(DIAGNOSTIC_H) $(PARAMS_H) $(TREE_PASS_H) \ $(HASHTAB_H) $(COVERAGE_H) $(GGC_H) $(TREE_FLOW_H) $(IPA_PROP_H) \ $(GIMPLE_PRETTY_PRINT_H) ipa-inline.h $(LTO_STREAMER_H) $(DATA_STREAMER_H) \ $(TREE_STREAMER_H) --- 2899,2905 ---- $(EXCEPT_H) $(GIMPLE_PRETTY_PRINT_H) ipa-inline.h $(TARGET_H) $(IPA_UTILS_H) ipa-inline-analysis.o : ipa-inline-analysis.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ $(TREE_H) langhooks.h $(TREE_INLINE_H) $(FLAGS_H) $(CGRAPH_H) intl.h \ ! $(DIAGNOSTIC_H) $(PARAMS_H) $(TREE_PASS_H) $(CFGLOOP_H) \ $(HASHTAB_H) $(COVERAGE_H) $(GGC_H) $(TREE_FLOW_H) $(IPA_PROP_H) \ $(GIMPLE_PRETTY_PRINT_H) ipa-inline.h $(LTO_STREAMER_H) $(DATA_STREAMER_H) \ $(TREE_STREAMER_H) *************** caller-save.o : caller-save.c $(CONFIG_H *** 3183,3189 **** bt-load.o : bt-load.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(EXCEPT_H) \ $(RTL_H) hard-reg-set.h $(REGS_H) $(TM_P_H) $(FIBHEAP_H) $(EXPR_H) \ $(TARGET_H) $(FLAGS_H) $(INSN_ATTR_H) $(FUNCTION_H) $(TREE_PASS_H) \ ! $(DIAGNOSTIC_CORE_H) $(DF_H) vecprim.h $(RECOG_H) reorg.o : reorg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ conditions.h hard-reg-set.h $(BASIC_BLOCK_H) $(REGS_H) insn-config.h \ $(INSN_ATTR_H) $(EXCEPT_H) $(RECOG_H) $(FUNCTION_H) $(FLAGS_H) output.h \ --- 3183,3189 ---- bt-load.o : bt-load.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(EXCEPT_H) \ $(RTL_H) hard-reg-set.h $(REGS_H) $(TM_P_H) $(FIBHEAP_H) $(EXPR_H) \ $(TARGET_H) $(FLAGS_H) $(INSN_ATTR_H) $(FUNCTION_H) $(TREE_PASS_H) \ ! $(DIAGNOSTIC_CORE_H) $(DF_H) vecprim.h $(RECOG_H) $(CFGLOOP_H) reorg.o : reorg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ conditions.h hard-reg-set.h $(BASIC_BLOCK_H) $(REGS_H) insn-config.h \ $(INSN_ATTR_H) $(EXCEPT_H) $(RECOG_H) $(FUNCTION_H) $(FLAGS_H) output.h \ Index: trunk/gcc/cfgloop.h =================================================================== *** trunk.orig/gcc/cfgloop.h 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/cfgloop.h 2012-08-13 14:03:23.524888740 +0200 *************** loop_depth (const struct loop *loop) *** 445,450 **** --- 445,458 ---- return VEC_length (loop_p, loop->superloops); } + /* Returns the loop depth of the loop BB belongs to. */ + + static inline int + bb_loop_depth (const_basic_block bb) + { + return bb->loop_father ? loop_depth (bb->loop_father) : 0; + } + /* Returns the immediate superloop of LOOP, or NULL if LOOP is the outermost loop. */ Index: trunk/gcc/ipa-inline-analysis.c =================================================================== *** trunk.orig/gcc/ipa-inline-analysis.c 2012-08-13 13:58:13.000000000 +0200 --- trunk/gcc/ipa-inline-analysis.c 2012-08-13 14:03:09.446889232 +0200 *************** along with GCC; see the file COPYING3. *** 87,92 **** --- 87,93 ---- #include "tree-streamer.h" #include "ipa-inline.h" #include "alloc-pool.h" + #include "cfgloop.h" /* Estimate runtime of function can easilly run into huge numbers with many nested loops. Be sure we can compute time * INLINE_SIZE_SCALE * 2 in an *************** estimate_function_body_sizes (struct cgr *** 2088,2094 **** es->call_stmt_size = this_size; es->call_stmt_time = this_time; ! es->loop_depth = bb->loop_depth; edge_set_predicate (edge, &bb_predicate); } --- 2089,2095 ---- es->call_stmt_size = this_size; es->call_stmt_time = this_time; ! es->loop_depth = bb_loop_depth (bb); edge_set_predicate (edge, &bb_predicate); }