From 7dfb44a02c99c300d7ae193feeda825148b28993 Mon Sep 17 00:00:00 2001 From: hubicka Date: Tue, 29 Jul 2008 10:52:16 +0000 Subject: [PATCH] * predict.c (always_optimize_for_size_p): New function. (optimize_bb_for_size_p, optimize_bb_for_speed_p, optimize_edge_for_size_p, optimize_edge_for_speed_p, optimize_insn_for_size_p, optimize_insn_for_speed_p): New global functions. (rtl_profile_for_bb, rtl_profile_for_edge, rtl_default_profile): New. * function.c (prepare_function_start): Set default profile. * function.h (rtl_data): Add maybe_hot_insn_p. * cfgexpand.c (expand_gimple_basic_block): Set RTL profile. (construct_exit_block): Likewise. (tree_expand_cfg): Likewise. * basic-block.h (optimize_bb_for_size_p, optimize_bb_for_speed_p, optimize_edge_for_size_p, optimize_edge_for_speed_p, optimize_insn_for_size_p, optimize_insn_for_speed_p): Declare. (rtl_profile_for_bb, rtl_profile_for_edge, default_rtl_profile): Declare. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@138237 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 20 +++++++++++++ gcc/basic-block.h | 13 +++++++- gcc/cfgexpand.c | 9 ++++++ gcc/config/i386/i386.c | 9 ++++-- gcc/function.c | 1 + gcc/function.h | 3 ++ gcc/predict.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 131 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6533ff34a7a..296b56289b5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,23 @@ +2008-07-29 Jan HUbicka + + * predict.c (always_optimize_for_size_p): New function. + (optimize_bb_for_size_p, optimize_bb_for_speed_p, + optimize_edge_for_size_p, optimize_edge_for_speed_p, + optimize_insn_for_size_p, optimize_insn_for_speed_p): New global + functions. + (rtl_profile_for_bb, rtl_profile_for_edge, rtl_default_profile): New. + * function.c (prepare_function_start): Set default profile. + * function.h (rtl_data): Add maybe_hot_insn_p. + * cfgexpand.c (expand_gimple_basic_block): Set RTL profile. + (construct_exit_block): Likewise. + (tree_expand_cfg): Likewise. + * basic-block.h + (optimize_bb_for_size_p, optimize_bb_for_speed_p, + optimize_edge_for_size_p, optimize_edge_for_speed_p, + optimize_insn_for_size_p, optimize_insn_for_speed_p): Declare. + (rtl_profile_for_bb, rtl_profile_for_edge, default_rtl_profile): + Declare. + 2008-07-29 Manuel Lopez-Ibanez PR 34985 diff --git a/gcc/basic-block.h b/gcc/basic-block.h index ff6d0258191..caaf22ef742 100644 --- a/gcc/basic-block.h +++ b/gcc/basic-block.h @@ -831,6 +831,12 @@ extern bool maybe_hot_bb_p (const_basic_block); extern bool maybe_hot_edge_p (edge); extern bool probably_cold_bb_p (const_basic_block); extern bool probably_never_executed_bb_p (const_basic_block); +extern bool optimize_bb_for_size_p (basic_block); +extern bool optimize_bb_for_speed_p (basic_block); +extern bool optimize_edge_for_size_p (edge); +extern bool optimize_edge_for_speed_p (edge); +extern bool optimize_insn_for_size_p (void); +extern bool optimize_insn_for_speed_p (void); extern bool gimple_predicted_by_p (const_basic_block, enum br_predictor); extern bool rtl_predicted_by_p (const_basic_block, enum br_predictor); extern void gimple_predict_edge (edge, enum br_predictor, int); @@ -988,6 +994,11 @@ bb_has_abnormal_pred (basic_block bb) /* In cfgloopmanip.c. */ extern edge mfb_kj_edge; -bool mfb_keep_just (edge); +extern bool mfb_keep_just (edge); + +/* In cfgexpand.c. */ +extern void rtl_profile_for_bb (basic_block); +extern void rtl_profile_for_edge (edge); +extern void default_rtl_profile (void); #endif /* GCC_BASIC_BLOCK_H */ diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index b4c33ab8193..6040b4460c2 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1798,6 +1798,7 @@ expand_gimple_basic_block (basic_block bb) access the BB sequence directly. */ stmts = bb_seq (bb); bb->il.gimple = NULL; + rtl_profile_for_bb (bb); init_rtl_bb_info (bb); bb->flags |= BB_RTL; @@ -2020,6 +2021,8 @@ construct_exit_block (void) edge_iterator ei; rtx orig_end = BB_END (EXIT_BLOCK_PTR->prev_bb); + rtl_profile_for_bb (EXIT_BLOCK_PTR); + /* Make sure the locus is set to the end of the function, so that epilogue line numbers and warnings are set properly. */ if (cfun->function_end_locus != UNKNOWN_LOCATION) @@ -2153,6 +2156,8 @@ gimple_expand_cfg (void) /* Some backends want to know that we are expanding to RTL. */ currently_expanding_to_rtl = 1; + rtl_profile_for_bb (ENTRY_BLOCK_PTR); + insn_locators_alloc (); if (!DECL_BUILT_IN (current_function_decl)) set_curr_insn_source_location (DECL_SOURCE_LOCATION (current_function_decl)); @@ -2216,6 +2221,9 @@ gimple_expand_cfg (void) lab_rtx_for_bb = pointer_map_create (); FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR, next_bb) bb = expand_gimple_basic_block (bb); + + /* Expansion is used by optimization passes too, set maybe_hot_insn_p + conservatively to true until they are all profile aware. */ pointer_map_destroy (lab_rtx_for_bb); free_histograms (); @@ -2284,6 +2292,7 @@ gimple_expand_cfg (void) /* Tag the blocks with a depth number so that change_scope can find the common parent easily. */ set_block_levels (DECL_INITIAL (cfun->decl), 0); + default_rtl_profile (); return 0; } diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 62d1b8d9bce..dc3854ba53f 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -6680,7 +6680,7 @@ standard_80387_constant_p (rtx x) /* For XFmode constants, try to find a special 80387 instruction when optimizing for size or on those CPUs that benefit from them. */ if (mode == XFmode - && (optimize_size || TARGET_EXT_80387_CONSTANTS)) + && (optimize_insn_for_size_p () || TARGET_EXT_80387_CONSTANTS)) { int i; @@ -16410,12 +16410,15 @@ decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset, || (alg != rep_prefix_1_byte \ && alg != rep_prefix_4_byte \ && alg != rep_prefix_8_byte)) + const struct processor_costs *cost; + + cost = optimize_insn_for_size_p () ? &size_cost : ix86_cost; *dynamic_check = -1; if (memset) - algs = &ix86_cost->memset[TARGET_64BIT != 0]; + algs = &cost->memset[TARGET_64BIT != 0]; else - algs = &ix86_cost->memcpy[TARGET_64BIT != 0]; + algs = &cost->memcpy[TARGET_64BIT != 0]; if (stringop_alg != no_stringop && ALG_USABLE_P (stringop_alg)) return stringop_alg; /* rep; movq or rep; movl is the smallest variant. */ diff --git a/gcc/function.c b/gcc/function.c index 532a94f34c4..ea3ddf45604 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -3885,6 +3885,7 @@ prepare_function_start (void) init_emit (); init_varasm_status (); init_expr (); + default_rtl_profile (); cse_not_expected = ! optimize; diff --git a/gcc/function.h b/gcc/function.h index 9de018100d9..94f4642dc32 100644 --- a/gcc/function.h +++ b/gcc/function.h @@ -397,6 +397,9 @@ struct rtl_data GTY(()) Set in stmt.c if anything is allocated on the stack there. Set in reload1.c if anything is allocated on the stack there. */ bool frame_pointer_needed; + + /* When set, expand should optimize for speed. */ + bool maybe_hot_insn_p; }; #define return_label (crtl->x_return_label) diff --git a/gcc/predict.c b/gcc/predict.c index 6a887be8e56..853c0c6f70d 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -178,6 +178,86 @@ probably_never_executed_bb_p (const_basic_block bb) return false; } +/* Return true when current function should always be optimized for size. */ + +static bool +always_optimize_for_size_p (void) +{ + return (optimize_size + || cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED); +} + +/* Return TRUE when BB should be optimized for size. */ + +bool +optimize_bb_for_size_p (basic_block bb) +{ + return always_optimize_for_size_p () || !maybe_hot_bb_p (bb); +} + +/* Return TRUE when BB should be optimized for speed. */ + +bool +optimize_bb_for_speed_p (basic_block bb) +{ + return !optimize_bb_for_size_p (bb); +} + +/* Return TRUE when BB should be optimized for size. */ + +bool +optimize_edge_for_size_p (edge e) +{ + return always_optimize_for_size_p () || !maybe_hot_edge_p (e); +} + +/* Return TRUE when BB should be optimized for speed. */ + +bool +optimize_edge_for_speed_p (edge e) +{ + return !optimize_edge_for_size_p (e); +} + +/* Return TRUE when BB should be optimized for size. */ + +bool +optimize_insn_for_size_p (void) +{ + return always_optimize_for_size_p () || !crtl->maybe_hot_insn_p; +} + +/* Return TRUE when BB should be optimized for speed. */ + +bool +optimize_insn_for_speed_p (void) +{ + return !optimize_insn_for_size_p (); +} + +/* Set RTL expansion for BB profile. */ + +void +rtl_profile_for_bb (basic_block bb) +{ + crtl->maybe_hot_insn_p = maybe_hot_bb_p (bb); +} + +/* Set RTL expansion for edge profile. */ + +void +rtl_profile_for_edge (edge e) +{ + crtl->maybe_hot_insn_p = maybe_hot_edge_p (e); +} + +/* Set RTL expansion to default mode (i.e. when profile info is not known). */ +void +default_rtl_profile (void) +{ + crtl->maybe_hot_insn_p = true; +} + /* Return true if the one of outgoing edges is already predicted by PREDICTOR. */ -- 2.11.0