Commit 2eb712b4 by Martin Jambor Committed by Martin Jambor

predict.c (maybe_hot_frequency_p): New parameter fun.

2012-08-24  Martin Jambor  <mjambor@suse.cz>

	* predict.c (maybe_hot_frequency_p): New parameter fun.  Use its decl
	instead of current_function_decl, use profile_status_for_function and
	ENTRY_BLOCK_PTR_FOR_FUNCTION with fun instead of their cfun variants.
	(maybe_hot_count_p): New parameter fun, use
	profile_status_for_function instead of its cfun_variant.
	(maybe_hot_bb_p): New parameter fun, checking-assert it, pass it to
	all callees.
	(maybe_hot_edge_p): Pass cfun to maybe_hot_count_p and
	maybe_hot_frequency_p.
	(probably_never_executed_bb_p): New parameter fun, use its decl
	instead of current_function_decl.
	(optimize_bb_for_size_p): Pass cfun to maybe_hot_bb_p.
	(rtl_profile_for_bb): Likewise.
	(compute_function_frequency): Pass cfun to maybe_hot_bb_p and
	probably_never_executed_bb_p.
	* tree-ssa-operands.c (ssa_operands_active): New operator fun.  Use it
	instead of cfun.
	(update_stmt_operands): Pass cfun as an argument of
	ssa_operands_active.
	(swap_tree_operands): Likewise.
	* gimple-iterator.c (update_modified_stmt): Likewise.
	(update_modified_stmts): Likewise.
	* tree-flow-inline.h (delink_stmt_imm_use): Likewise.
	* tree-ssa.c (delete_tree_ssa): Likewise.
	* bb-reorder.c (bb_to_key): Pass cfun to probably_never_executed_bb_p.
	(push_to_next_round_p): Likewise.
	(find_rarely_executed_basic_blocks_and_crossing_edges ): Likewise.
	* cfg.c: Inlude tree.h.
	(check_bb_profile): Use profile_status_for_function,
	EXIT_BLOCK_PTR_FOR_FUNCTION and ENTRY_BLOCK_PTR_FOR_FUNCTION with
	DECL_STRUCT_FUNCTION (current_function_decl) instead of their cfun
	variants.
	(dump_bb_info): Pass DECL_STRUCT_FUNCTION (current_function_decl) to
	maybe_hot_bb_p and probably_never_executed_bb_p.
	* gimple-pretty-print.c (gimple_dump_bb_buff): Checking-assert that
	DECL_STRUCT_FUNCTION (current_function_decl) is not NULL.  Pass it to
	dump_histograms_for_stmt.
	(dump_gimple_mem_ops): Pass DECL_STRUCT_FUNCTION (current_function_decl)
	as an argument to dump_gimple_mem_ops.
	* tree-cfg.c (dump_function_to_file): Rename parameter fn to fndecl.
	Do not change cfun.  Change and restore current_function_decl.
	* Makefile.in (cfg.o): Include TREE_H in dependencies.

From-SVN: r190645
parent e55e4056
2012-08-24 Martin Jambor <mjambor@suse.cz>
* predict.c (maybe_hot_frequency_p): New parameter fun. Use its decl
instead of current_function_decl, use profile_status_for_function and
ENTRY_BLOCK_PTR_FOR_FUNCTION with fun instead of their cfun variants.
(maybe_hot_count_p): New parameter fun, use
profile_status_for_function instead of its cfun_variant.
(maybe_hot_bb_p): New parameter fun, checking-assert it, pass it to
all callees.
(maybe_hot_edge_p): Pass cfun to maybe_hot_count_p and
maybe_hot_frequency_p.
(probably_never_executed_bb_p): New parameter fun, use its decl
instead of current_function_decl.
(optimize_bb_for_size_p): Pass cfun to maybe_hot_bb_p.
(rtl_profile_for_bb): Likewise.
(compute_function_frequency): Pass cfun to maybe_hot_bb_p and
probably_never_executed_bb_p.
* tree-ssa-operands.c (ssa_operands_active): New operator fun. Use it
instead of cfun.
(update_stmt_operands): Pass cfun as an argument of
ssa_operands_active.
(swap_tree_operands): Likewise.
* gimple-iterator.c (update_modified_stmt): Likewise.
(update_modified_stmts): Likewise.
* tree-flow-inline.h (delink_stmt_imm_use): Likewise.
* tree-ssa.c (delete_tree_ssa): Likewise.
* bb-reorder.c (bb_to_key): Pass cfun to probably_never_executed_bb_p.
(push_to_next_round_p): Likewise.
(find_rarely_executed_basic_blocks_and_crossing_edges ): Likewise.
* cfg.c: Inlude tree.h.
(check_bb_profile): Use profile_status_for_function,
EXIT_BLOCK_PTR_FOR_FUNCTION and ENTRY_BLOCK_PTR_FOR_FUNCTION with
DECL_STRUCT_FUNCTION (current_function_decl) instead of their cfun
variants.
(dump_bb_info): Pass DECL_STRUCT_FUNCTION (current_function_decl) to
maybe_hot_bb_p and probably_never_executed_bb_p.
* gimple-pretty-print.c (gimple_dump_bb_buff): Checking-assert that
DECL_STRUCT_FUNCTION (current_function_decl) is not NULL. Pass it to
dump_histograms_for_stmt.
(dump_gimple_mem_ops): Pass DECL_STRUCT_FUNCTION (current_function_decl)
as an argument to dump_gimple_mem_ops.
* tree-cfg.c (dump_function_to_file): Rename parameter fn to fndecl.
Do not change cfun. Change and restore current_function_decl.
* Makefile.in (cfg.o): Include TREE_H in dependencies.
2012-08-24 Georg-Johann Lay <avr@gjlay.de> 2012-08-24 Georg-Johann Lay <avr@gjlay.de>
PR target/54222 PR target/54222
......
...@@ -3047,7 +3047,8 @@ auto-inc-dec.o : auto-inc-dec.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ ...@@ -3047,7 +3047,8 @@ auto-inc-dec.o : auto-inc-dec.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(REGS_H) $(FLAGS_H) $(FUNCTION_H) $(EXCEPT_H) $(DIAGNOSTIC_CORE_H) $(RECOG_H) \ $(REGS_H) $(FLAGS_H) $(FUNCTION_H) $(EXCEPT_H) $(DIAGNOSTIC_CORE_H) $(RECOG_H) \
$(EXPR_H) $(TREE_PASS_H) $(DF_H) $(DBGCNT_H) $(TARGET_H) $(EXPR_H) $(TREE_PASS_H) $(DF_H) $(DBGCNT_H) $(TARGET_H)
cfg.o : cfg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h dumpfile.h $(DIAGNOSTIC_CORE_H) \ cfg.o : cfg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h dumpfile.h $(DIAGNOSTIC_CORE_H) \
$(GGC_H) $(OBSTACK_H) alloc-pool.h $(HASHTAB_H) $(CFGLOOP_H) $(BASIC_BLOCK_H) $(GGC_H) $(OBSTACK_H) alloc-pool.h $(HASHTAB_H) $(CFGLOOP_H) $(TREE_H) \
$(BASIC_BLOCK_H)
cfghooks.o: cfghooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ cfghooks.o: cfghooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(TREE_H) $(BASIC_BLOCK_H) $(TREE_FLOW_H) $(TIMEVAR_H) toplev.h $(DIAGNOSTIC_CORE_H) $(CFGLOOP_H) $(TREE_H) $(BASIC_BLOCK_H) $(TREE_FLOW_H) $(TIMEVAR_H) toplev.h $(DIAGNOSTIC_CORE_H) $(CFGLOOP_H)
cfgexpand.o : cfgexpand.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \ cfgexpand.o : cfgexpand.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
......
...@@ -693,9 +693,9 @@ extern struct edge_list *pre_edge_rev_lcm (int, sbitmap *, ...@@ -693,9 +693,9 @@ extern struct edge_list *pre_edge_rev_lcm (int, sbitmap *,
extern void compute_available (sbitmap *, sbitmap *, sbitmap *, sbitmap *); extern void compute_available (sbitmap *, sbitmap *, sbitmap *, sbitmap *);
/* In predict.c */ /* In predict.c */
extern bool maybe_hot_bb_p (const_basic_block); extern bool maybe_hot_bb_p (struct function *, const_basic_block);
extern bool maybe_hot_edge_p (edge); extern bool maybe_hot_edge_p (edge);
extern bool probably_never_executed_bb_p (const_basic_block); extern bool probably_never_executed_bb_p (struct function *, const_basic_block);
extern bool optimize_bb_for_size_p (const_basic_block); extern bool optimize_bb_for_size_p (const_basic_block);
extern bool optimize_bb_for_speed_p (const_basic_block); extern bool optimize_bb_for_speed_p (const_basic_block);
extern bool optimize_edge_for_size_p (edge); extern bool optimize_edge_for_size_p (edge);
......
...@@ -226,7 +226,7 @@ push_to_next_round_p (const_basic_block bb, int round, int number_of_rounds, ...@@ -226,7 +226,7 @@ push_to_next_round_p (const_basic_block bb, int round, int number_of_rounds,
block_not_hot_enough = (bb->frequency < exec_th block_not_hot_enough = (bb->frequency < exec_th
|| bb->count < count_th || bb->count < count_th
|| probably_never_executed_bb_p (bb)); || probably_never_executed_bb_p (cfun, bb));
if (there_exists_another_round if (there_exists_another_round
&& block_not_hot_enough) && block_not_hot_enough)
...@@ -823,7 +823,7 @@ bb_to_key (basic_block bb) ...@@ -823,7 +823,7 @@ bb_to_key (basic_block bb)
/* Do not start in probably never executed blocks. */ /* Do not start in probably never executed blocks. */
if (BB_PARTITION (bb) == BB_COLD_PARTITION if (BB_PARTITION (bb) == BB_COLD_PARTITION
|| probably_never_executed_bb_p (bb)) || probably_never_executed_bb_p (cfun, bb))
return BB_FREQ_MAX; return BB_FREQ_MAX;
/* Prefer blocks whose predecessor is an end of some trace /* Prefer blocks whose predecessor is an end of some trace
...@@ -1308,7 +1308,7 @@ find_rarely_executed_basic_blocks_and_crossing_edges (void) ...@@ -1308,7 +1308,7 @@ find_rarely_executed_basic_blocks_and_crossing_edges (void)
/* Mark which partition (hot/cold) each basic block belongs in. */ /* Mark which partition (hot/cold) each basic block belongs in. */
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
{ {
if (probably_never_executed_bb_p (bb)) if (probably_never_executed_bb_p (cfun, bb))
BB_SET_PARTITION (bb, BB_COLD_PARTITION); BB_SET_PARTITION (bb, BB_COLD_PARTITION);
else else
BB_SET_PARTITION (bb, BB_HOT_PARTITION); BB_SET_PARTITION (bb, BB_HOT_PARTITION);
......
...@@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. If not see
#include "ggc.h" #include "ggc.h"
#include "hashtab.h" #include "hashtab.h"
#include "alloc-pool.h" #include "alloc-pool.h"
#include "tree.h"
#include "basic-block.h" #include "basic-block.h"
#include "df.h" #include "df.h"
#include "cfgloop.h" /* FIXME: For struct loop. */ #include "cfgloop.h" /* FIXME: For struct loop. */
...@@ -404,14 +405,15 @@ check_bb_profile (basic_block bb, FILE * file, int indent, int flags) ...@@ -404,14 +405,15 @@ check_bb_profile (basic_block bb, FILE * file, int indent, int flags)
int sum = 0; int sum = 0;
gcov_type lsum; gcov_type lsum;
edge_iterator ei; edge_iterator ei;
struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
char *s_indent = (char *) alloca ((size_t) indent + 1); char *s_indent = (char *) alloca ((size_t) indent + 1);
memset ((void *) s_indent, ' ', (size_t) indent); memset ((void *) s_indent, ' ', (size_t) indent);
s_indent[indent] = '\0'; s_indent[indent] = '\0';
if (profile_status == PROFILE_ABSENT) if (profile_status_for_function (fun) == PROFILE_ABSENT)
return; return;
if (bb != EXIT_BLOCK_PTR) if (bb != EXIT_BLOCK_PTR_FOR_FUNCTION (fun))
{ {
FOR_EACH_EDGE (e, ei, bb->succs) FOR_EACH_EDGE (e, ei, bb->succs)
sum += e->probability; sum += e->probability;
...@@ -428,7 +430,7 @@ check_bb_profile (basic_block bb, FILE * file, int indent, int flags) ...@@ -428,7 +430,7 @@ check_bb_profile (basic_block bb, FILE * file, int indent, int flags)
(flags & TDF_COMMENT) ? ";; " : "", s_indent, (flags & TDF_COMMENT) ? ";; " : "", s_indent,
(int) lsum, (int) bb->count); (int) lsum, (int) bb->count);
} }
if (bb != ENTRY_BLOCK_PTR) if (bb != ENTRY_BLOCK_PTR_FOR_FUNCTION (fun))
{ {
sum = 0; sum = 0;
FOR_EACH_EDGE (e, ei, bb->preds) FOR_EACH_EDGE (e, ei, bb->preds)
...@@ -701,12 +703,13 @@ dump_bb_info (FILE *outf, basic_block bb, int indent, int flags, ...@@ -701,12 +703,13 @@ dump_bb_info (FILE *outf, basic_block bb, int indent, int flags,
s_indent, bb->index, bb_loop_depth (bb)); s_indent, bb->index, bb_loop_depth (bb));
if (flags & TDF_DETAILS) if (flags & TDF_DETAILS)
{ {
struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
fprintf (outf, ", count " HOST_WIDEST_INT_PRINT_DEC, fprintf (outf, ", count " HOST_WIDEST_INT_PRINT_DEC,
(HOST_WIDEST_INT) bb->count); (HOST_WIDEST_INT) bb->count);
fprintf (outf, ", freq %i", bb->frequency); fprintf (outf, ", freq %i", bb->frequency);
if (maybe_hot_bb_p (bb)) if (maybe_hot_bb_p (fun, bb))
fputs (", maybe hot", outf); fputs (", maybe hot", outf);
if (probably_never_executed_bb_p (bb)) if (probably_never_executed_bb_p (fun, bb))
fputs (", probably never executed", outf); fputs (", probably never executed", outf);
} }
fputc ('\n', outf); fputc ('\n', outf);
......
...@@ -33,7 +33,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -33,7 +33,7 @@ along with GCC; see the file COPYING3. If not see
static inline void static inline void
update_modified_stmt (gimple stmt) update_modified_stmt (gimple stmt)
{ {
if (!ssa_operands_active ()) if (!ssa_operands_active (cfun))
return; return;
update_stmt_if_modified (stmt); update_stmt_if_modified (stmt);
} }
...@@ -46,7 +46,7 @@ update_modified_stmts (gimple_seq seq) ...@@ -46,7 +46,7 @@ update_modified_stmts (gimple_seq seq)
{ {
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
if (!ssa_operands_active ()) if (!ssa_operands_active (cfun))
return; return;
for (gsi = gsi_start (seq); !gsi_end_p (gsi); gsi_next (&gsi)) for (gsi = gsi_start (seq); !gsi_end_p (gsi); gsi_next (&gsi))
update_stmt_if_modified (gsi_stmt (gsi)); update_stmt_if_modified (gsi_stmt (gsi));
......
...@@ -1817,7 +1817,8 @@ dump_gimple_mem_ops (pretty_printer *buffer, gimple gs, int spc, int flags) ...@@ -1817,7 +1817,8 @@ dump_gimple_mem_ops (pretty_printer *buffer, gimple gs, int spc, int flags)
tree vdef = gimple_vdef (gs); tree vdef = gimple_vdef (gs);
tree vuse = gimple_vuse (gs); tree vuse = gimple_vuse (gs);
if (!ssa_operands_active () || !gimple_references_memory_p (gs)) if (!ssa_operands_active (DECL_STRUCT_FUNCTION (current_function_decl))
|| !gimple_references_memory_p (gs))
return; return;
if (vdef != NULL_TREE) if (vdef != NULL_TREE)
...@@ -2256,7 +2257,9 @@ gimple_dump_bb_buff (pretty_printer *buffer, basic_block bb, int indent, ...@@ -2256,7 +2257,9 @@ gimple_dump_bb_buff (pretty_printer *buffer, basic_block bb, int indent,
INDENT (curr_indent); INDENT (curr_indent);
dump_gimple_stmt (buffer, stmt, curr_indent, flags); dump_gimple_stmt (buffer, stmt, curr_indent, flags);
pp_newline_and_flush (buffer); pp_newline_and_flush (buffer);
dump_histograms_for_stmt (cfun, buffer->buffer->stream, stmt); gcc_checking_assert (DECL_STRUCT_FUNCTION (current_function_decl));
dump_histograms_for_stmt (DECL_STRUCT_FUNCTION (current_function_decl),
buffer->buffer->stream, stmt);
} }
dump_implicit_edges (buffer, bb, indent, flags); dump_implicit_edges (buffer, bb, indent, flags);
......
...@@ -108,9 +108,9 @@ static const struct predictor_info predictor_info[]= { ...@@ -108,9 +108,9 @@ static const struct predictor_info predictor_info[]= {
/* Return TRUE if frequency FREQ is considered to be hot. */ /* Return TRUE if frequency FREQ is considered to be hot. */
static inline bool static inline bool
maybe_hot_frequency_p (int freq) maybe_hot_frequency_p (struct function *fun, int freq)
{ {
struct cgraph_node *node = cgraph_get_node (current_function_decl); struct cgraph_node *node = cgraph_get_node (fun->decl);
if (!profile_info || !flag_branch_probabilities) if (!profile_info || !flag_branch_probabilities)
{ {
if (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED) if (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
...@@ -118,12 +118,13 @@ maybe_hot_frequency_p (int freq) ...@@ -118,12 +118,13 @@ maybe_hot_frequency_p (int freq)
if (node->frequency == NODE_FREQUENCY_HOT) if (node->frequency == NODE_FREQUENCY_HOT)
return true; return true;
} }
if (profile_status == PROFILE_ABSENT) if (profile_status_for_function (fun) == PROFILE_ABSENT)
return true; return true;
if (node->frequency == NODE_FREQUENCY_EXECUTED_ONCE if (node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
&& freq < (ENTRY_BLOCK_PTR->frequency * 2 / 3)) && freq < (ENTRY_BLOCK_PTR_FOR_FUNCTION (fun)->frequency * 2 / 3))
return false; return false;
if (freq < ENTRY_BLOCK_PTR->frequency / PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION)) if (freq < (ENTRY_BLOCK_PTR_FOR_FUNCTION (fun)->frequency
/ PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION)))
return false; return false;
return true; return true;
} }
...@@ -131,9 +132,9 @@ maybe_hot_frequency_p (int freq) ...@@ -131,9 +132,9 @@ maybe_hot_frequency_p (int freq)
/* Return TRUE if frequency FREQ is considered to be hot. */ /* Return TRUE if frequency FREQ is considered to be hot. */
static inline bool static inline bool
maybe_hot_count_p (gcov_type count) maybe_hot_count_p (struct function *fun, gcov_type count)
{ {
if (profile_status != PROFILE_READ) if (profile_status_for_function (fun) != PROFILE_READ)
return true; return true;
/* Code executed at most once is not hot. */ /* Code executed at most once is not hot. */
if (profile_info->runs >= count) if (profile_info->runs >= count)
...@@ -146,13 +147,12 @@ maybe_hot_count_p (gcov_type count) ...@@ -146,13 +147,12 @@ maybe_hot_count_p (gcov_type count)
for maximal performance. */ for maximal performance. */
bool bool
maybe_hot_bb_p (const_basic_block bb) maybe_hot_bb_p (struct function *fun, const_basic_block bb)
{ {
/* Make sure CFUN exists, for dump_bb_info. */ gcc_checking_assert (fun);
gcc_assert (cfun); if (profile_status_for_function (fun) == PROFILE_READ)
if (profile_status == PROFILE_READ) return maybe_hot_count_p (fun, bb->count);
return maybe_hot_count_p (bb->count); return maybe_hot_frequency_p (fun, bb->frequency);
return maybe_hot_frequency_p (bb->frequency);
} }
/* Return true if the call can be hot. */ /* Return true if the call can be hot. */
...@@ -193,22 +193,21 @@ bool ...@@ -193,22 +193,21 @@ bool
maybe_hot_edge_p (edge e) maybe_hot_edge_p (edge e)
{ {
if (profile_status == PROFILE_READ) if (profile_status == PROFILE_READ)
return maybe_hot_count_p (e->count); return maybe_hot_count_p (cfun, e->count);
return maybe_hot_frequency_p (EDGE_FREQUENCY (e)); return maybe_hot_frequency_p (cfun, EDGE_FREQUENCY (e));
} }
/* Return true in case BB is probably never executed. */ /* Return true in case BB is probably never executed. */
bool bool
probably_never_executed_bb_p (const_basic_block bb) probably_never_executed_bb_p (struct function *fun, const_basic_block bb)
{ {
/* Make sure CFUN exists, for dump_bb_info. */ gcc_checking_assert (fun);
gcc_assert (cfun);
if (profile_info && flag_branch_probabilities) if (profile_info && flag_branch_probabilities)
return ((bb->count + profile_info->runs / 2) / profile_info->runs) == 0; return ((bb->count + profile_info->runs / 2) / profile_info->runs) == 0;
if ((!profile_info || !flag_branch_probabilities) if ((!profile_info || !flag_branch_probabilities)
&& (cgraph_get_node (current_function_decl)->frequency && (cgraph_get_node (fun->decl)->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED)) == NODE_FREQUENCY_UNLIKELY_EXECUTED))
return true; return true;
return false; return false;
...@@ -252,7 +251,7 @@ optimize_function_for_speed_p (struct function *fun) ...@@ -252,7 +251,7 @@ optimize_function_for_speed_p (struct function *fun)
bool bool
optimize_bb_for_size_p (const_basic_block bb) optimize_bb_for_size_p (const_basic_block bb)
{ {
return optimize_function_for_size_p (cfun) || !maybe_hot_bb_p (bb); return optimize_function_for_size_p (cfun) || !maybe_hot_bb_p (cfun, bb);
} }
/* Return TRUE when BB should be optimized for speed. */ /* Return TRUE when BB should be optimized for speed. */
...@@ -369,7 +368,7 @@ predictable_edge_p (edge e) ...@@ -369,7 +368,7 @@ predictable_edge_p (edge e)
void void
rtl_profile_for_bb (basic_block bb) rtl_profile_for_bb (basic_block bb)
{ {
crtl->maybe_hot_insn_p = maybe_hot_bb_p (bb); crtl->maybe_hot_insn_p = maybe_hot_bb_p (cfun, bb);
} }
/* Set RTL expansion for edge profile. */ /* Set RTL expansion for edge profile. */
...@@ -2705,12 +2704,12 @@ compute_function_frequency (void) ...@@ -2705,12 +2704,12 @@ compute_function_frequency (void)
node->frequency = NODE_FREQUENCY_UNLIKELY_EXECUTED; node->frequency = NODE_FREQUENCY_UNLIKELY_EXECUTED;
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
{ {
if (maybe_hot_bb_p (bb)) if (maybe_hot_bb_p (cfun, bb))
{ {
node->frequency = NODE_FREQUENCY_HOT; node->frequency = NODE_FREQUENCY_HOT;
return; return;
} }
if (!probably_never_executed_bb_p (bb)) if (!probably_never_executed_bb_p (cfun, bb))
node->frequency = NODE_FREQUENCY_NORMAL; node->frequency = NODE_FREQUENCY_NORMAL;
} }
} }
......
...@@ -6632,19 +6632,21 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, ...@@ -6632,19 +6632,21 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
*/ */
void void
dump_function_to_file (tree fn, FILE *file, int flags) dump_function_to_file (tree fndecl, FILE *file, int flags)
{ {
tree arg, var; tree arg, var, old_current_fndecl = current_function_decl;
struct function *dsf; struct function *dsf;
bool ignore_topmost_bind = false, any_var = false; bool ignore_topmost_bind = false, any_var = false;
basic_block bb; basic_block bb;
tree chain; tree chain;
bool tmclone = TREE_CODE (fn) == FUNCTION_DECL && decl_is_tm_clone (fn); bool tmclone = (TREE_CODE (fndecl) == FUNCTION_DECL
&& decl_is_tm_clone (fndecl));
struct function *fun = DECL_STRUCT_FUNCTION (fndecl);
fprintf (file, "%s %s(", current_function_name (), current_function_decl = fndecl;
tmclone ? "[tm-clone] " : ""); fprintf (file, "%s %s(", function_name (fun), tmclone ? "[tm-clone] " : "");
arg = DECL_ARGUMENTS (fn); arg = DECL_ARGUMENTS (fndecl);
while (arg) while (arg)
{ {
print_generic_expr (file, TREE_TYPE (arg), dump_flags); print_generic_expr (file, TREE_TYPE (arg), dump_flags);
...@@ -6659,31 +6661,29 @@ dump_function_to_file (tree fn, FILE *file, int flags) ...@@ -6659,31 +6661,29 @@ dump_function_to_file (tree fn, FILE *file, int flags)
fprintf (file, ")\n"); fprintf (file, ")\n");
if (flags & TDF_VERBOSE) if (flags & TDF_VERBOSE)
print_node (file, "", fn, 2); print_node (file, "", fndecl, 2);
dsf = DECL_STRUCT_FUNCTION (fn); dsf = DECL_STRUCT_FUNCTION (fndecl);
if (dsf && (flags & TDF_EH)) if (dsf && (flags & TDF_EH))
dump_eh_tree (file, dsf); dump_eh_tree (file, dsf);
if (flags & TDF_RAW && !gimple_has_body_p (fn)) if (flags & TDF_RAW && !gimple_has_body_p (fndecl))
{ {
dump_node (fn, TDF_SLIM | flags, file); dump_node (fndecl, TDF_SLIM | flags, file);
current_function_decl = old_current_fndecl;
return; return;
} }
/* Switch CFUN to point to FN. */
push_cfun (DECL_STRUCT_FUNCTION (fn));
/* When GIMPLE is lowered, the variables are no longer available in /* When GIMPLE is lowered, the variables are no longer available in
BIND_EXPRs, so display them separately. */ BIND_EXPRs, so display them separately. */
if (cfun && cfun->decl == fn && (cfun->curr_properties & PROP_gimple_lcf)) if (fun && fun->decl == fndecl && (fun->curr_properties & PROP_gimple_lcf))
{ {
unsigned ix; unsigned ix;
ignore_topmost_bind = true; ignore_topmost_bind = true;
fprintf (file, "{\n"); fprintf (file, "{\n");
if (!VEC_empty (tree, cfun->local_decls)) if (!VEC_empty (tree, fun->local_decls))
FOR_EACH_LOCAL_DECL (cfun, ix, var) FOR_EACH_LOCAL_DECL (fun, ix, var)
{ {
print_generic_decl (file, var, flags); print_generic_decl (file, var, flags);
if (flags & TDF_VERBOSE) if (flags & TDF_VERBOSE)
...@@ -6709,26 +6709,27 @@ dump_function_to_file (tree fn, FILE *file, int flags) ...@@ -6709,26 +6709,27 @@ dump_function_to_file (tree fn, FILE *file, int flags)
} }
} }
if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info) if (fun && fun->decl == fndecl && fun->cfg
&& basic_block_info_for_function (fun))
{ {
/* If the CFG has been built, emit a CFG-based dump. */ /* If the CFG has been built, emit a CFG-based dump. */
if (!ignore_topmost_bind) if (!ignore_topmost_bind)
fprintf (file, "{\n"); fprintf (file, "{\n");
if (any_var && n_basic_blocks) if (any_var && n_basic_blocks_for_function (fun))
fprintf (file, "\n"); fprintf (file, "\n");
FOR_EACH_BB (bb) FOR_EACH_BB_FN (bb, fun)
dump_bb (file, bb, 2, flags | TDF_COMMENT); dump_bb (file, bb, 2, flags | TDF_COMMENT);
fprintf (file, "}\n"); fprintf (file, "}\n");
} }
else if (DECL_SAVED_TREE (fn) == NULL) else if (DECL_SAVED_TREE (fndecl) == NULL)
{ {
/* The function is now in GIMPLE form but the CFG has not been /* The function is now in GIMPLE form but the CFG has not been
built yet. Emit the single sequence of GIMPLE statements built yet. Emit the single sequence of GIMPLE statements
that make up its body. */ that make up its body. */
gimple_seq body = gimple_body (fn); gimple_seq body = gimple_body (fndecl);
if (gimple_seq_first_stmt (body) if (gimple_seq_first_stmt (body)
&& gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body) && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
...@@ -6751,8 +6752,7 @@ dump_function_to_file (tree fn, FILE *file, int flags) ...@@ -6751,8 +6752,7 @@ dump_function_to_file (tree fn, FILE *file, int flags)
int indent; int indent;
/* Make a tree based dump. */ /* Make a tree based dump. */
chain = DECL_SAVED_TREE (fn); chain = DECL_SAVED_TREE (fndecl);
if (chain && TREE_CODE (chain) == BIND_EXPR) if (chain && TREE_CODE (chain) == BIND_EXPR)
{ {
if (ignore_topmost_bind) if (ignore_topmost_bind)
...@@ -6782,11 +6782,9 @@ dump_function_to_file (tree fn, FILE *file, int flags) ...@@ -6782,11 +6782,9 @@ dump_function_to_file (tree fn, FILE *file, int flags)
dump_enumerated_decls (file, flags); dump_enumerated_decls (file, flags);
fprintf (file, "\n\n"); fprintf (file, "\n\n");
/* Restore CFUN. */ current_function_decl = old_current_fndecl;
pop_cfun ();
} }
/* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h) */ /* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h) */
DEBUG_FUNCTION void DEBUG_FUNCTION void
......
...@@ -798,7 +798,7 @@ delink_stmt_imm_use (gimple stmt) ...@@ -798,7 +798,7 @@ delink_stmt_imm_use (gimple stmt)
ssa_op_iter iter; ssa_op_iter iter;
use_operand_p use_p; use_operand_p use_p;
if (ssa_operands_active ()) if (ssa_operands_active (cfun))
FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_ALL_USES) FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_ALL_USES)
delink_imm_use (use_p); delink_imm_use (use_p);
} }
......
...@@ -130,16 +130,12 @@ static int n_initialized = 0; ...@@ -130,16 +130,12 @@ static int n_initialized = 0;
/* Return true if the SSA operands cache is active. */ /* Return true if the SSA operands cache is active. */
bool bool
ssa_operands_active (void) ssa_operands_active (struct function *fun)
{ {
/* This function may be invoked from contexts where CFUN is NULL if (fun == NULL)
(IPA passes), return false for now. FIXME: operands may be
active in each individual function, maybe this function should
take CFUN as a parameter. */
if (cfun == NULL)
return false; return false;
return cfun->gimple_df && gimple_ssa_operands (cfun)->ops_active; return fun->gimple_df && gimple_ssa_operands (fun)->ops_active;
} }
...@@ -1211,7 +1207,7 @@ update_stmt_operands (gimple stmt) ...@@ -1211,7 +1207,7 @@ update_stmt_operands (gimple stmt)
{ {
/* If update_stmt_operands is called before SSA is initialized, do /* If update_stmt_operands is called before SSA is initialized, do
nothing. */ nothing. */
if (!ssa_operands_active ()) if (!ssa_operands_active (cfun))
return; return;
timevar_push (TV_TREE_OPS); timevar_push (TV_TREE_OPS);
...@@ -1244,7 +1240,7 @@ swap_tree_operands (gimple stmt, tree *exp0, tree *exp1) ...@@ -1244,7 +1240,7 @@ swap_tree_operands (gimple stmt, tree *exp0, tree *exp1)
positions of these two operands in their respective immediate use positions of these two operands in their respective immediate use
lists by adjusting their use pointer to point to the new lists by adjusting their use pointer to point to the new
operand position. */ operand position. */
if (ssa_operands_active () && op0 != op1) if (ssa_operands_active (cfun) && op0 != op1)
{ {
use_optype_p use0, use1, ptr; use_optype_p use0, use1, ptr;
use0 = use1 = NULL; use0 = use1 = NULL;
......
...@@ -114,7 +114,7 @@ extern void debug_immediate_uses_for (tree var); ...@@ -114,7 +114,7 @@ extern void debug_immediate_uses_for (tree var);
extern void dump_decl_set (FILE *, bitmap); extern void dump_decl_set (FILE *, bitmap);
extern void debug_decl_set (bitmap); extern void debug_decl_set (bitmap);
extern bool ssa_operands_active (void); extern bool ssa_operands_active (struct function *);
extern bool virtual_operand_p (tree); extern bool virtual_operand_p (tree);
extern void unlink_stmt_vdef (gimple); extern void unlink_stmt_vdef (gimple);
......
...@@ -1157,7 +1157,7 @@ delete_tree_ssa (void) ...@@ -1157,7 +1157,7 @@ delete_tree_ssa (void)
fini_ssanames (); fini_ssanames ();
/* We no longer maintain the SSA operand cache at this point. */ /* We no longer maintain the SSA operand cache at this point. */
if (ssa_operands_active ()) if (ssa_operands_active (cfun))
fini_ssa_operands (); fini_ssa_operands ();
htab_delete (cfun->gimple_df->default_defs); htab_delete (cfun->gimple_df->default_defs);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment