Commit 8df06bd0 by Richard Biener Committed by Richard Biener

passes.c (execute_todo): Do not push/pop TV_TODO.

2016-08-12  Richard Biener  <rguenther@suse.de>

	* passes.c (execute_todo): Do not push/pop TV_TODO.
	(execute_one_ipa_transform_pass): Move timevar push/pop TODO execution.
	(execute_one_pass): Likewise.
	* common.opt (ftime-report-details): New switch.
	* doc/invoke.texi (ftime-report-details): Document.
	* timevar.h (timer::print_row): Adjust signature.
	(timer::all_zero): New static helper.
	(timer::child_map_t): New typedef.
	(timer::time_var_def): Add children field.
	* timevar.c (timer::named_items::print): Adjust.
	(timer::~timer): Free timevar recorded children.
	(timer::pop_internal): When -ftime-report-details record
	time spent in sub-timevars.
	(timer::print_row): Adjust.
	(timer::print): Print sub-timevar stats, use all_zero.
	* timevar.def (TV_TODO): Remove.

From-SVN: r239406
parent 663eecfd
2016-08-12 Richard Biener <rguenther@suse.de> 2016-08-12 Richard Biener <rguenther@suse.de>
* passes.c (execute_todo): Do not push/pop TV_TODO.
(execute_one_ipa_transform_pass): Move timevar push/pop TODO execution.
(execute_one_pass): Likewise.
* common.opt (ftime-report-details): New switch.
* doc/invoke.texi (ftime-report-details): Document.
* timevar.h (timer::print_row): Adjust signature.
(timer::all_zero): New static helper.
(timer::child_map_t): New typedef.
(timer::time_var_def): Add children field.
* timevar.c (timer::named_items::print): Adjust.
(timer::~timer): Free timevar recorded children.
(timer::pop_internal): When -ftime-report-details record
time spent in sub-timevars.
(timer::print_row): Adjust.
(timer::print): Print sub-timevar stats, use all_zero.
* timevar.def (TV_TODO): Remove.
2016-08-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/72851 PR tree-optimization/72851
* tree-ssa-propagate.c: Include cfganal.h. Rewrite block and stmt * tree-ssa-propagate.c: Include cfganal.h. Rewrite block and stmt
worklists to use bitmaps indexed in execution order. worklists to use bitmaps indexed in execution order.
......
...@@ -2296,6 +2296,10 @@ ftime-report ...@@ -2296,6 +2296,10 @@ ftime-report
Common Report Var(time_report) Common Report Var(time_report)
Report the time taken by each compiler pass. Report the time taken by each compiler pass.
ftime-report-details
Common Report Var(time_report_details)
Record times taken by sub-phases separately.
ftls-model= ftls-model=
Common Joined RejectNegative Enum(tls_model) Var(flag_tls_default) Init(TLS_MODEL_GLOBAL_DYNAMIC) Common Joined RejectNegative Enum(tls_model) Var(flag_tls_default) Init(TLS_MODEL_GLOBAL_DYNAMIC)
-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec] Set the default thread-local storage code generation model. -ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec] Set the default thread-local storage code generation model.
......
...@@ -554,7 +554,7 @@ Objective-C and Objective-C++ Dialects}. ...@@ -554,7 +554,7 @@ Objective-C and Objective-C++ Dialects}.
-fprofile-report @gol -fprofile-report @gol
-frandom-seed=@var{string} -fsched-verbose=@var{n} @gol -frandom-seed=@var{string} -fsched-verbose=@var{n} @gol
-fsel-sched-verbose -fsel-sched-dump-cfg -fsel-sched-pipelining-verbose @gol -fsel-sched-verbose -fsel-sched-dump-cfg -fsel-sched-pipelining-verbose @gol
-fstats -fstack-usage -ftime-report @gol -fstats -fstack-usage -ftime-report -ftime-report-details @gol
-fvar-tracking-assignments-toggle -gtoggle @gol -fvar-tracking-assignments-toggle -gtoggle @gol
-print-file-name=@var{library} -print-libgcc-file-name @gol -print-file-name=@var{library} -print-libgcc-file-name @gol
-print-multi-directory -print-multi-lib -print-multi-os-directory @gol -print-multi-directory -print-multi-lib -print-multi-os-directory @gol
...@@ -12742,6 +12742,10 @@ print some statistics about each pass when it finishes. ...@@ -12742,6 +12742,10 @@ print some statistics about each pass when it finishes.
Makes the compiler print some statistics about the time consumed by each Makes the compiler print some statistics about the time consumed by each
pass when it finishes. pass when it finishes.
@item -ftime-report-details
@opindex ftime-report-details
Record the time consumed by infrastructure parts separately for each pass.
@item -fira-verbose=@var{n} @item -fira-verbose=@var{n}
@opindex fira-verbose @opindex fira-verbose
Control the verbosity of the dump file for the integrated register allocator. Control the verbosity of the dump file for the integrated register allocator.
......
...@@ -2008,8 +2008,6 @@ execute_todo (unsigned int flags) ...@@ -2008,8 +2008,6 @@ execute_todo (unsigned int flags)
&& need_ssa_update_p (cfun)) && need_ssa_update_p (cfun))
gcc_assert (flags & TODO_update_ssa_any); gcc_assert (flags & TODO_update_ssa_any);
timevar_push (TV_TODO);
statistics_fini_pass (); statistics_fini_pass ();
if (flags) if (flags)
...@@ -2043,8 +2041,6 @@ execute_todo (unsigned int flags) ...@@ -2043,8 +2041,6 @@ execute_todo (unsigned int flags)
df problems. */ df problems. */
if (flags & TODO_df_finish) if (flags & TODO_df_finish)
df_finish_pass ((flags & TODO_df_verify) != 0); df_finish_pass ((flags & TODO_df_verify) != 0);
timevar_pop (TV_TODO);
} }
/* Verify invariants that should hold between passes. This is a place /* Verify invariants that should hold between passes. This is a place
...@@ -2198,20 +2194,16 @@ execute_one_ipa_transform_pass (struct cgraph_node *node, ...@@ -2198,20 +2194,16 @@ execute_one_ipa_transform_pass (struct cgraph_node *node,
pass_init_dump_file (pass); pass_init_dump_file (pass);
/* Run pre-pass verification. */
execute_todo (ipa_pass->function_transform_todo_flags_start);
/* If a timevar is present, start it. */ /* If a timevar is present, start it. */
if (pass->tv_id != TV_NONE) if (pass->tv_id != TV_NONE)
timevar_push (pass->tv_id); timevar_push (pass->tv_id);
/* Run pre-pass verification. */
execute_todo (ipa_pass->function_transform_todo_flags_start);
/* Do it! */ /* Do it! */
todo_after = ipa_pass->function_transform (node); todo_after = ipa_pass->function_transform (node);
/* Stop timevar. */
if (pass->tv_id != TV_NONE)
timevar_pop (pass->tv_id);
if (profile_report && cfun && (cfun->curr_properties & PROP_cfg)) if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
check_profile_consistency (pass->static_pass_number, 0, true); check_profile_consistency (pass->static_pass_number, 0, true);
...@@ -2221,6 +2213,10 @@ execute_one_ipa_transform_pass (struct cgraph_node *node, ...@@ -2221,6 +2213,10 @@ execute_one_ipa_transform_pass (struct cgraph_node *node,
if (profile_report && cfun && (cfun->curr_properties & PROP_cfg)) if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
check_profile_consistency (pass->static_pass_number, 1, true); check_profile_consistency (pass->static_pass_number, 1, true);
/* Stop timevar. */
if (pass->tv_id != TV_NONE)
timevar_pop (pass->tv_id);
if (dump_file) if (dump_file)
do_per_function (execute_function_dump, pass); do_per_function (execute_function_dump, pass);
pass_fini_dump_file (pass); pass_fini_dump_file (pass);
...@@ -2329,6 +2325,10 @@ execute_one_pass (opt_pass *pass) ...@@ -2329,6 +2325,10 @@ execute_one_pass (opt_pass *pass)
pass_init_dump_file (pass); pass_init_dump_file (pass);
/* If a timevar is present, start it. */
if (pass->tv_id != TV_NONE)
timevar_push (pass->tv_id);
/* Run pre-pass verification. */ /* Run pre-pass verification. */
execute_todo (pass->todo_flags_start); execute_todo (pass->todo_flags_start);
...@@ -2336,15 +2336,15 @@ execute_one_pass (opt_pass *pass) ...@@ -2336,15 +2336,15 @@ execute_one_pass (opt_pass *pass)
do_per_function (verify_curr_properties, do_per_function (verify_curr_properties,
(void *)(size_t)pass->properties_required); (void *)(size_t)pass->properties_required);
/* If a timevar is present, start it. */
if (pass->tv_id != TV_NONE)
timevar_push (pass->tv_id);
/* Do it! */ /* Do it! */
todo_after = pass->execute (cfun); todo_after = pass->execute (cfun);
if (todo_after & TODO_discard_function) if (todo_after & TODO_discard_function)
{ {
/* Stop timevar. */
if (pass->tv_id != TV_NONE)
timevar_pop (pass->tv_id);
pass_fini_dump_file (pass); pass_fini_dump_file (pass);
gcc_assert (cfun); gcc_assert (cfun);
...@@ -2371,10 +2371,6 @@ execute_one_pass (opt_pass *pass) ...@@ -2371,10 +2371,6 @@ execute_one_pass (opt_pass *pass)
do_per_function (clear_last_verified, NULL); do_per_function (clear_last_verified, NULL);
/* Stop timevar. */
if (pass->tv_id != TV_NONE)
timevar_pop (pass->tv_id);
do_per_function (update_properties_after_pass, pass); do_per_function (update_properties_after_pass, pass);
if (profile_report && cfun && (cfun->curr_properties & PROP_cfg)) if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
...@@ -2386,6 +2382,11 @@ execute_one_pass (opt_pass *pass) ...@@ -2386,6 +2382,11 @@ execute_one_pass (opt_pass *pass)
check_profile_consistency (pass->static_pass_number, 1, true); check_profile_consistency (pass->static_pass_number, 1, true);
verify_interpass_invariants (); verify_interpass_invariants ();
/* Stop timevar. */
if (pass->tv_id != TV_NONE)
timevar_pop (pass->tv_id);
if (pass->type == IPA_PASS if (pass->type == IPA_PASS
&& ((ipa_opt_pass_d *)pass)->function_transform) && ((ipa_opt_pass_d *)pass)->function_transform)
{ {
......
...@@ -205,7 +205,7 @@ timer::named_items::print (FILE *fp, const timevar_time_def *total) ...@@ -205,7 +205,7 @@ timer::named_items::print (FILE *fp, const timevar_time_def *total)
{ {
timer::timevar_def *def = m_hash_map.get (item_name); timer::timevar_def *def = m_hash_map.get (item_name);
gcc_assert (def); gcc_assert (def);
m_timer->print_row (fp, total, def); m_timer->print_row (fp, total, def->name, def->elapsed);
} }
} }
...@@ -296,6 +296,8 @@ timer::~timer () ...@@ -296,6 +296,8 @@ timer::~timer ()
next = iter->next; next = iter->next;
free (iter); free (iter);
} }
for (unsigned i = 0; i < TIMEVAR_LAST; ++i)
delete m_timevars[i].children;
delete m_jit_client_items; delete m_jit_client_items;
} }
...@@ -399,13 +401,26 @@ timer::pop_internal () ...@@ -399,13 +401,26 @@ timer::pop_internal ()
/* Attribute the elapsed time to the element we're popping. */ /* Attribute the elapsed time to the element we're popping. */
timevar_accumulate (&popped->timevar->elapsed, &m_start_time, &now); timevar_accumulate (&popped->timevar->elapsed, &m_start_time, &now);
/* Take the item off the stack. */
m_stack = m_stack->next;
/* Record the elapsed sub-time to the parent as well. */
if (m_stack && time_report_details)
{
if (! m_stack->timevar->children)
m_stack->timevar->children = new child_map_t (5);
bool existed_p;
timevar_time_def &time
= m_stack->timevar->children->get_or_insert (popped->timevar, &existed_p);
if (! existed_p)
memset (&time, 0, sizeof (timevar_time_def));
timevar_accumulate (&time, &m_start_time, &now);
}
/* Reset the start time; from now on, time is attributed to the /* Reset the start time; from now on, time is attributed to the
element just exposed on the stack. */ element just exposed on the stack. */
m_start_time = now; m_start_time = now;
/* Take the item off the stack. */
m_stack = m_stack->next;
/* Don't delete the stack element; instead, add it to the list of /* Don't delete the stack element; instead, add it to the list of
unused elements for later use. */ unused elements for later use. */
popped->next = m_unused_stack_instances; popped->next = m_unused_stack_instances;
...@@ -619,42 +634,54 @@ timer::validate_phases (FILE *fp) const ...@@ -619,42 +634,54 @@ timer::validate_phases (FILE *fp) const
void void
timer::print_row (FILE *fp, timer::print_row (FILE *fp,
const timevar_time_def *total, const timevar_time_def *total,
const timevar_def *tv) const char *name, const timevar_time_def &elapsed)
{ {
/* The timing variable name. */ /* The timing variable name. */
fprintf (fp, " %-24s:", tv->name); fprintf (fp, " %-24s:", name);
#ifdef HAVE_USER_TIME #ifdef HAVE_USER_TIME
/* Print user-mode time for this process. */ /* Print user-mode time for this process. */
fprintf (fp, "%7.2f (%2.0f%%) usr", fprintf (fp, "%7.2f (%2.0f%%) usr",
tv->elapsed.user, elapsed.user,
(total->user == 0 ? 0 : tv->elapsed.user / total->user) * 100); (total->user == 0 ? 0 : elapsed.user / total->user) * 100);
#endif /* HAVE_USER_TIME */ #endif /* HAVE_USER_TIME */
#ifdef HAVE_SYS_TIME #ifdef HAVE_SYS_TIME
/* Print system-mode time for this process. */ /* Print system-mode time for this process. */
fprintf (fp, "%7.2f (%2.0f%%) sys", fprintf (fp, "%7.2f (%2.0f%%) sys",
tv->elapsed.sys, elapsed.sys,
(total->sys == 0 ? 0 : tv->elapsed.sys / total->sys) * 100); (total->sys == 0 ? 0 : elapsed.sys / total->sys) * 100);
#endif /* HAVE_SYS_TIME */ #endif /* HAVE_SYS_TIME */
#ifdef HAVE_WALL_TIME #ifdef HAVE_WALL_TIME
/* Print wall clock time elapsed. */ /* Print wall clock time elapsed. */
fprintf (fp, "%7.2f (%2.0f%%) wall", fprintf (fp, "%7.2f (%2.0f%%) wall",
tv->elapsed.wall, elapsed.wall,
(total->wall == 0 ? 0 : tv->elapsed.wall / total->wall) * 100); (total->wall == 0 ? 0 : elapsed.wall / total->wall) * 100);
#endif /* HAVE_WALL_TIME */ #endif /* HAVE_WALL_TIME */
/* Print the amount of ggc memory allocated. */ /* Print the amount of ggc memory allocated. */
fprintf (fp, "%8u kB (%2.0f%%) ggc", fprintf (fp, "%8u kB (%2.0f%%) ggc",
(unsigned) (tv->elapsed.ggc_mem >> 10), (unsigned) (elapsed.ggc_mem >> 10),
(total->ggc_mem == 0 (total->ggc_mem == 0
? 0 ? 0
: (float) tv->elapsed.ggc_mem / total->ggc_mem) * 100); : (float) elapsed.ggc_mem / total->ggc_mem) * 100);
putc ('\n', fp); putc ('\n', fp);
} }
/* Return whether ELAPSED is all zero. */
bool
timer::all_zero (const timevar_time_def &elapsed)
{
const double tiny = 5e-3;
return (elapsed.user < tiny
&& elapsed.sys < tiny
&& elapsed.wall < tiny
&& elapsed.ggc_mem < GGC_MEM_BOUND);
}
/* Summarize timing variables to FP. The timing variable TV_TOTAL has /* Summarize timing variables to FP. The timing variable TV_TOTAL has
a special meaning -- it's considered to be the total elapsed time, a special meaning -- it's considered to be the total elapsed time,
for normalizing the others, and is displayed last. */ for normalizing the others, and is displayed last. */
...@@ -691,7 +718,6 @@ timer::print (FILE *fp) ...@@ -691,7 +718,6 @@ timer::print (FILE *fp)
for (id = 0; id < (unsigned int) TIMEVAR_LAST; ++id) for (id = 0; id < (unsigned int) TIMEVAR_LAST; ++id)
{ {
const timevar_def *tv = &m_timevars[(timevar_id_t) id]; const timevar_def *tv = &m_timevars[(timevar_id_t) id];
const double tiny = 5e-3;
/* Don't print the total execution time here; that goes at the /* Don't print the total execution time here; that goes at the
end. */ end. */
...@@ -702,15 +728,38 @@ timer::print (FILE *fp) ...@@ -702,15 +728,38 @@ timer::print (FILE *fp)
if (!tv->used) if (!tv->used)
continue; continue;
bool any_children_with_time = false;
if (tv->children)
for (child_map_t::iterator i = tv->children->begin ();
i != tv->children->end (); ++i)
if (! all_zero ((*i).second))
{
any_children_with_time = true;
break;
}
/* Don't print timing variables if we're going to get a row of /* Don't print timing variables if we're going to get a row of
zeroes. */ zeroes. Unless there are children with non-zero time. */
if (tv->elapsed.user < tiny if (! any_children_with_time
&& tv->elapsed.sys < tiny && all_zero (tv->elapsed))
&& tv->elapsed.wall < tiny
&& tv->elapsed.ggc_mem < GGC_MEM_BOUND)
continue; continue;
print_row (fp, total, tv); print_row (fp, total, tv->name, tv->elapsed);
if (tv->children)
for (child_map_t::iterator i = tv->children->begin ();
i != tv->children->end (); ++i)
{
timevar_def *tv2 = (*i).first;
/* Don't print timing variables if we're going to get a row of
zeroes. */
if (! all_zero ((*i).second))
{
char lname[256];
snprintf (lname, 256, "`- %s", tv2->name);
print_row (fp, total, lname, (*i).second);
}
}
} }
if (m_jit_client_items) if (m_jit_client_items)
m_jit_client_items->print (fp, total); m_jit_client_items->print (fp, total);
......
...@@ -131,9 +131,11 @@ class timer ...@@ -131,9 +131,11 @@ class timer
void pop_internal (); void pop_internal ();
static void print_row (FILE *fp, static void print_row (FILE *fp,
const timevar_time_def *total, const timevar_time_def *total,
const timevar_def *tv); const char *name, const timevar_time_def &elapsed);
static bool all_zero (const timevar_time_def &elapsed);
private: private:
typedef hash_map<timevar_def *, timevar_time_def> child_map_t;
/* Private type: a timing variable. */ /* Private type: a timing variable. */
struct timevar_def struct timevar_def
...@@ -155,6 +157,8 @@ class timer ...@@ -155,6 +157,8 @@ class timer
/* Nonzero if this timing variable was ever started or pushed onto /* Nonzero if this timing variable was ever started or pushed onto
the timing stack. */ the timing stack. */
unsigned used : 1; unsigned used : 1;
child_map_t *children;
}; };
/* Private type: an element on the timing stack /* Private type: an element on the timing stack
......
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