+2006-12-23 Jan Hubicka <jh@suse.cz>
+
+ * toplev.c (dump_memory_report): Break out from...
+ (finalize): Here.
+ * toplev.h (dump_memory_report): Declare.
+ (cmp_statistic): Rename to ...
+ (final_cmp_statistic): ... this one
+ (cmp_statistic): New.
+ (dump_ggc_loc_staitsitcs): New FINAL parpameter.
+ * common.opt (-fpre-ipa-mem-report, -fpost-ipa-mem-report): Declare.
+ * varray.c (dump_varray_staitiscs): Do not segfault when no varray was
+ allocated so far.
+ * cgraphunit.c (cgraph_optimize): Dump the memory reports.
+
2006-12-22 Mike Stump <mrs@apple.com>
* config/rs6000/t-darwin (DARWIN_EXTRA_CRT_BUILD_CFLAGS): Add
varpool_analyze_pending_decls ();
timevar_push (TV_CGRAPHOPT);
+ if (pre_ipa_mem_report)
+ {
+ fprintf (stderr, "Memory consumption before IPA\n");
+ dump_memory_report (false);
+ }
if (!quiet_flag)
fprintf (stderr, "Performing interprocedural optimizations\n");
dump_cgraph (cgraph_dump_file);
dump_varpool (cgraph_dump_file);
}
+ if (post_ipa_mem_report)
+ {
+ fprintf (stderr, "Memory consumption before IPA\n");
+ dump_memory_report (false);
+ }
timevar_pop (TV_CGRAPHOPT);
/* Output everything. */
Common Report Var(flag_optimize_sibling_calls)
Optimize sibling and tail recursive calls
+fpre-ipa-mem-report
+Common Report Var(pre_ipa_mem_report)
+Report on memory allocation before interprocedural optimization
+
+fpost-ipa-mem-report
+Common Report Var(post_ipa_mem_report)
+Report on memory allocation before interprocedural optimization
+
fpack-struct
Common Report Var(flag_pack_struct)
Pack structure members together without holes
-fdump-tree-storeccp@r{[}-@var{n}@r{]} @gol
-feliminate-dwarf2-dups -feliminate-unused-debug-types @gol
-feliminate-unused-debug-symbols -femit-class-debug-always @gol
--fmem-report -fprofile-arcs @gol
+-fmem-report -fpre-ipa-mem-report -fpost-ipa-mem-report -fprofile-arcs @gol
-frandom-seed=@var{string} -fsched-verbose=@var{n} @gol
-ftest-coverage -ftime-report -fvar-tracking @gol
-g -g@var{level} -gcoff -gdwarf-2 @gol
Makes the compiler print some statistics about permanent memory
allocation when it finishes.
+@item -fpre-ipa-mem-report
+@opindex fpre-ipa-mem-report
+@item -fpost-ipa-mem-report
+@opindex fpost-ipa-mem-report
+Makes the compiler print some statistics about permanent memory
+allocation before or after interprocedural optimization.
+
@item -fprofile-arcs
@opindex fprofile-arcs
Add code so that program flow @dfn{arcs} are instrumented. During
/* Helper for qsort; sort descriptors by amount of memory consumed. */
static int
-cmp_statistic (const void *loc1, const void *loc2)
+final_cmp_statistic (const void *loc1, const void *loc2)
{
struct loc_descriptor *l1 = *(struct loc_descriptor **) loc1;
struct loc_descriptor *l2 = *(struct loc_descriptor **) loc2;
- return ((l1->allocated + l1->overhead - l1->freed) -
+ long diff;
+ diff = ((long)(l1->allocated + l1->overhead - l1->freed) -
(l2->allocated + l2->overhead - l2->freed));
+ return diff > 0 ? 1 : diff < 0 ? -1 : 0;
+}
+
+/* Helper for qsort; sort descriptors by amount of memory consumed. */
+static int
+cmp_statistic (const void *loc1, const void *loc2)
+{
+ struct loc_descriptor *l1 = *(struct loc_descriptor **) loc1;
+ struct loc_descriptor *l2 = *(struct loc_descriptor **) loc2;
+ long diff;
+
+ diff = ((long)(l1->allocated + l1->overhead - l1->freed - l1->collected) -
+ (l2->allocated + l2->overhead - l2->freed - l2->collected));
+ if (diff)
+ return diff > 0 ? 1 : diff < 0 ? -1 : 0;
+ diff = ((long)(l1->allocated + l1->overhead - l1->freed) -
+ (l2->allocated + l2->overhead - l2->freed));
+ return diff > 0 ? 1 : diff < 0 ? -1 : 0;
}
/* Collect array of the descriptors from hashtable. */
/* Dump per-site memory statistics. */
#endif
void
-dump_ggc_loc_statistics (void)
+dump_ggc_loc_statistics (bool final ATTRIBUTE_UNUSED)
{
#ifdef GATHER_STATISTICS
int nentries = 0;
"source location", "Garbage", "Freed", "Leak", "Overhead", "Times");
fprintf (stderr, "-------------------------------------------------------\n");
htab_traverse (loc_hash, add_statistics, &nentries);
- qsort (loc_array, nentries, sizeof (*loc_array), cmp_statistic);
+ qsort (loc_array, nentries, sizeof (*loc_array),
+ final ? final_cmp_statistic : cmp_statistic);
for (i = 0; i < nentries; i++)
{
struct loc_descriptor *d = loc_array[i];
extern void ggc_free_overhead (void *);
extern void ggc_prune_overhead_list (void);
-extern void dump_ggc_loc_statistics (void);
+extern void dump_ggc_loc_statistics (bool);
/* Type-safe, C++-friendly versions of ggc_alloc() and gcc_calloc(). */
#define GGC_NEW(T) ((T *) ggc_alloc (sizeof (T)))
return 1;
}
+void
+dump_memory_report (bool final)
+{
+ ggc_print_statistics ();
+ stringpool_statistics ();
+ dump_tree_statistics ();
+ dump_rtx_statistics ();
+ dump_varray_statistics ();
+ dump_alloc_pool_statistics ();
+ dump_bitmap_statistics ();
+ dump_ggc_loc_statistics (final);
+}
+
/* Clean up: close opened files, etc. */
static void
finish_optimization_passes ();
if (mem_report)
- {
- ggc_print_statistics ();
- stringpool_statistics ();
- dump_tree_statistics ();
- dump_rtx_statistics ();
- dump_varray_statistics ();
- dump_alloc_pool_statistics ();
- dump_bitmap_statistics ();
- dump_ggc_loc_statistics ();
- }
+ dump_memory_report (true);
/* Free up memory for the benefit of leak detectors. */
free_reg_info ();
extern void emit_debug_global_declarations (tree *, int);
extern void write_global_declarations (void);
+extern void dump_memory_report (bool);
+
/* A unique local time stamp, might be zero if none is available. */
extern unsigned local_tick;
#ifdef GATHER_STATISTICS
struct output_info info;
- fprintf (stderr, "\nVARRAY Kind Count Bytes Resized copied\n");
- fprintf (stderr, "-------------------------------------------------------\n");
- info.count = 0;
- info.size = 0;
- htab_traverse (varray_hash, print_statistics, &info);
- fprintf (stderr, "-------------------------------------------------------\n");
- fprintf (stderr, "%-20s %7d %10d\n",
- "Total", info.count, info.size);
- fprintf (stderr, "-------------------------------------------------------\n");
+ if (varray_hash)
+ {
+ fprintf (stderr, "\nVARRAY Kind Count Bytes Resized copied\n");
+ fprintf (stderr, "-------------------------------------------------------\n");
+ info.count = 0;
+ info.size = 0;
+ htab_traverse (varray_hash, print_statistics, &info);
+ fprintf (stderr, "-------------------------------------------------------\n");
+ fprintf (stderr, "%-20s %7d %10d\n",
+ "Total", info.count, info.size);
+ fprintf (stderr, "-------------------------------------------------------\n");
+ }
#endif
}