params.def (PARAM_MAX_VARTRACK_SIZE): New.
* params.def (PARAM_MAX_VARTRACK_SIZE): New. * doc/invoke.texi: Document it. * var-tracking.c: Include toplev.h and params.h. (vt_find_locations): Return bool indicating success. Compute hash sizes unconditionally. Check new parameter, report. (variable_tracking_main_1): Check vt_find_locations results and retry. Renamed from... (variable_tracking_main): ... this. New wrapper to preserve flag_var_tracking_assignments. * Makefile.in (var-tracking.o): Adjust dependencies. * lib/prune.exp: Prune variable tracking size limit exceeded notes. From-SVN: r156794
This commit is contained in:
parent
1e2ddf80b6
commit
ec8c39789d
|
@ -1,3 +1,16 @@
|
|||
2010-02-16 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* params.def (PARAM_MAX_VARTRACK_SIZE): New.
|
||||
* doc/invoke.texi: Document it.
|
||||
* var-tracking.c: Include toplev.h and params.h.
|
||||
(vt_find_locations): Return bool indicating success. Compute
|
||||
hash sizes unconditionally. Check new parameter, report.
|
||||
(variable_tracking_main_1): Check vt_find_locations results and
|
||||
retry. Renamed from...
|
||||
(variable_tracking_main): ... this. New wrapper to preserve
|
||||
flag_var_tracking_assignments.
|
||||
* Makefile.in (var-tracking.o): Adjust dependencies.
|
||||
|
||||
2010-02-16 Jack Howarth <howarth@bromo.med.uc.edu>
|
||||
Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
|
|
|
@ -3025,7 +3025,7 @@ var-tracking.o : var-tracking.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
|
|||
$(RTL_H) $(TREE_H) hard-reg-set.h insn-config.h reload.h $(FLAGS_H) \
|
||||
$(BASIC_BLOCK_H) output.h sbitmap.h alloc-pool.h $(FIBHEAP_H) $(HASHTAB_H) \
|
||||
$(REGS_H) $(EXPR_H) $(TIMEVAR_H) $(TREE_PASS_H) $(TREE_FLOW_H) \
|
||||
cselib.h $(TARGET_H)
|
||||
cselib.h $(TARGET_H) $(TOPLEV_H) $(PARAMS_H)
|
||||
profile.o : profile.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
|
||||
$(TREE_H) $(FLAGS_H) output.h $(REGS_H) $(EXPR_H) $(FUNCTION_H) \
|
||||
$(TOPLEV_H) $(COVERAGE_H) $(TREE_FLOW_H) value-prof.h cfghooks.h \
|
||||
|
|
|
@ -8428,6 +8428,15 @@ with more basic blocks than this parameter won't have loop invariant
|
|||
motion optimization performed on them. The default value of the
|
||||
parameter is 1000 for -O1 and 10000 for -O2 and above.
|
||||
|
||||
@item max-vartrack-size
|
||||
Sets a maximum number of hash table slots to use during variable
|
||||
tracking dataflow analysis of any function. If this limit is exceeded
|
||||
with variable tracking at assignments enabled, analysis for that
|
||||
function is retried without it, after removing all debug insns from
|
||||
the function. If the limit is exceeded even without debug insns, var
|
||||
tracking analysis is completely disabled for the function. Setting
|
||||
the parameter to zero makes it unlimited.
|
||||
|
||||
@item min-nondebug-insn-uid
|
||||
Use uids starting at this parameter for nondebug insns. The range below
|
||||
the parameter is reserved exclusively for debug insns created by
|
||||
|
|
|
@ -764,6 +764,13 @@ DEFPARAM (PARAM_PREFETCH_MIN_INSN_TO_MEM_RATIO,
|
|||
"Min. ratio of insns to mem ops to enable prefetching in a loop",
|
||||
3, 0, 0)
|
||||
|
||||
/* Set maximum hash table size for var tracking. */
|
||||
|
||||
DEFPARAM (PARAM_MAX_VARTRACK_SIZE,
|
||||
"max-vartrack-size",
|
||||
"Max. size of var tracking hash tables",
|
||||
50000000, 0, 0)
|
||||
|
||||
/* Set minimum insn uid for non-debug insns. */
|
||||
|
||||
DEFPARAM (PARAM_MIN_NONDEBUG_INSN_UID,
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-02-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* lib/prune.exp: Prune variable tracking size limit exceeded
|
||||
notes.
|
||||
|
||||
2010-02-16 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/43031
|
||||
|
|
|
@ -37,6 +37,9 @@ proc prune_gcc_output { text } {
|
|||
regsub -all "(^|\n)\[^\n\]*: Additional NOP may be necessary to workaround Itanium processor A/B step errata" $text "" text
|
||||
regsub -all "(^|\n)\[^\n*\]*: Assembler messages:\[^\n\]*" $text "" text
|
||||
|
||||
# Ignore harmless VTA note.
|
||||
regsub -all "(^|\n)\[^\n\]*: note: variable tracking size limit exceeded with -fvar-tracking-assignments, retrying without\[^\n\]*" $text "" text
|
||||
|
||||
# It would be nice to avoid passing anything to gcc that would cause it to
|
||||
# issue these messages (since ignoring them seems like a hack on our part),
|
||||
# but that's too difficult in the general case. For example, sometimes
|
||||
|
|
|
@ -109,6 +109,8 @@
|
|||
#include "tree-flow.h"
|
||||
#include "cselib.h"
|
||||
#include "target.h"
|
||||
#include "toplev.h"
|
||||
#include "params.h"
|
||||
|
||||
/* var-tracking.c assumes that tree code with the same value as VALUE rtx code
|
||||
has no chance to appear in REG_EXPR/MEM_EXPRs and isn't a decl.
|
||||
|
@ -448,7 +450,7 @@ static int add_uses (rtx *, void *);
|
|||
static void add_uses_1 (rtx *, void *);
|
||||
static void add_stores (rtx, const_rtx, void *);
|
||||
static bool compute_bb_dataflow (basic_block);
|
||||
static void vt_find_locations (void);
|
||||
static bool vt_find_locations (void);
|
||||
|
||||
static void dump_attrs_list (attrs);
|
||||
static int dump_var_slot (void **, void *);
|
||||
|
@ -5510,7 +5512,7 @@ compute_bb_dataflow (basic_block bb)
|
|||
|
||||
/* Find the locations of variables in the whole function. */
|
||||
|
||||
static void
|
||||
static bool
|
||||
vt_find_locations (void)
|
||||
{
|
||||
fibheap_t worklist, pending, fibheap_swap;
|
||||
|
@ -5521,6 +5523,8 @@ vt_find_locations (void)
|
|||
int *rc_order;
|
||||
int i;
|
||||
int htabsz = 0;
|
||||
int htabmax = PARAM_VALUE (PARAM_MAX_VARTRACK_SIZE);
|
||||
bool success = true;
|
||||
|
||||
/* Compute reverse completion order of depth first search of the CFG
|
||||
so that the data-flow runs faster. */
|
||||
|
@ -5542,7 +5546,7 @@ vt_find_locations (void)
|
|||
fibheap_insert (pending, bb_order[bb->index], bb);
|
||||
sbitmap_ones (in_pending);
|
||||
|
||||
while (!fibheap_empty (pending))
|
||||
while (success && !fibheap_empty (pending))
|
||||
{
|
||||
fibheap_swap = pending;
|
||||
pending = worklist;
|
||||
|
@ -5565,11 +5569,11 @@ vt_find_locations (void)
|
|||
|
||||
SET_BIT (visited, bb->index);
|
||||
|
||||
if (dump_file && VTI (bb)->in.vars)
|
||||
if (VTI (bb)->in.vars)
|
||||
{
|
||||
htabsz
|
||||
-= htab_size (shared_hash_htab (VTI (bb)->in.vars))
|
||||
+ htab_size (shared_hash_htab (VTI (bb)->out.vars));
|
||||
-= (htab_size (shared_hash_htab (VTI (bb)->in.vars))
|
||||
+ htab_size (shared_hash_htab (VTI (bb)->out.vars)));
|
||||
oldinsz
|
||||
= htab_elements (shared_hash_htab (VTI (bb)->in.vars));
|
||||
oldoutsz
|
||||
|
@ -5633,9 +5637,21 @@ vt_find_locations (void)
|
|||
}
|
||||
|
||||
changed = compute_bb_dataflow (bb);
|
||||
if (dump_file)
|
||||
htabsz += htab_size (shared_hash_htab (VTI (bb)->in.vars))
|
||||
+ htab_size (shared_hash_htab (VTI (bb)->out.vars));
|
||||
htabsz += (htab_size (shared_hash_htab (VTI (bb)->in.vars))
|
||||
+ htab_size (shared_hash_htab (VTI (bb)->out.vars)));
|
||||
|
||||
if (htabmax && htabsz > htabmax)
|
||||
{
|
||||
if (MAY_HAVE_DEBUG_INSNS)
|
||||
inform (DECL_SOURCE_LOCATION (cfun->decl),
|
||||
"variable tracking size limit exceeded with "
|
||||
"-fvar-tracking-assignments, retrying without");
|
||||
else
|
||||
inform (DECL_SOURCE_LOCATION (cfun->decl),
|
||||
"variable tracking size limit exceeded");
|
||||
success = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (changed)
|
||||
{
|
||||
|
@ -5686,7 +5702,7 @@ vt_find_locations (void)
|
|||
}
|
||||
}
|
||||
|
||||
if (MAY_HAVE_DEBUG_INSNS)
|
||||
if (success && MAY_HAVE_DEBUG_INSNS)
|
||||
FOR_EACH_BB (bb)
|
||||
gcc_assert (VTI (bb)->flooded);
|
||||
|
||||
|
@ -5697,6 +5713,8 @@ vt_find_locations (void)
|
|||
sbitmap_free (visited);
|
||||
sbitmap_free (in_worklist);
|
||||
sbitmap_free (in_pending);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
/* Print the content of the LIST to dump file. */
|
||||
|
@ -7599,9 +7617,11 @@ vt_finalize (void)
|
|||
|
||||
/* The entry point to variable tracking pass. */
|
||||
|
||||
unsigned int
|
||||
variable_tracking_main (void)
|
||||
static inline unsigned int
|
||||
variable_tracking_main_1 (void)
|
||||
{
|
||||
bool success;
|
||||
|
||||
if (flag_var_tracking_assignments < 0)
|
||||
{
|
||||
delete_debug_insns ();
|
||||
|
@ -7626,7 +7646,31 @@ variable_tracking_main (void)
|
|||
}
|
||||
}
|
||||
|
||||
vt_find_locations ();
|
||||
success = vt_find_locations ();
|
||||
|
||||
if (!success && flag_var_tracking_assignments > 0)
|
||||
{
|
||||
vt_finalize ();
|
||||
|
||||
delete_debug_insns ();
|
||||
|
||||
/* This is later restored by our caller. */
|
||||
flag_var_tracking_assignments = 0;
|
||||
|
||||
vt_initialize ();
|
||||
|
||||
if (!frame_pointer_needed && !vt_stack_adjustments ())
|
||||
gcc_unreachable ();
|
||||
|
||||
success = vt_find_locations ();
|
||||
}
|
||||
|
||||
if (!success)
|
||||
{
|
||||
vt_finalize ();
|
||||
vt_debug_insns_local (false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
{
|
||||
|
@ -7640,6 +7684,19 @@ variable_tracking_main (void)
|
|||
vt_debug_insns_local (false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
variable_tracking_main (void)
|
||||
{
|
||||
unsigned int ret;
|
||||
int save = flag_var_tracking_assignments;
|
||||
|
||||
ret = variable_tracking_main_1 ();
|
||||
|
||||
flag_var_tracking_assignments = save;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool
|
||||
gate_handle_var_tracking (void)
|
||||
|
|
Loading…
Reference in New Issue