2010-01-14 16:45:40 +00:00
|
|
|
|
2010-01-05 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-01-21 17:25:47 +00:00
|
|
|
|
--- gcc/doc/invoke.texi.jj 2010-01-09 20:39:58.000000000 +0100
|
|
|
|
|
+++ gcc/doc/invoke.texi 2010-01-21 10:00:15.979730377 +0100
|
2010-01-14 16:45:40 +00:00
|
|
|
|
@@ -7937,6 +7937,15 @@ with more basic blocks than this paramet
|
|
|
|
|
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
|
2010-01-21 17:25:47 +00:00
|
|
|
|
--- gcc/params.def.jj 2010-01-09 20:39:58.000000000 +0100
|
|
|
|
|
+++ gcc/params.def 2010-01-21 10:00:15.980730943 +0100
|
2010-01-14 16:45:40 +00:00
|
|
|
|
@@ -771,6 +771,13 @@ DEFPARAM (PARAM_LOOP_INVARIANT_MAX_BBS_I
|
|
|
|
|
"max basic blocks number in loop for loop invariant motion",
|
|
|
|
|
10000, 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,
|
2010-01-21 17:25:47 +00:00
|
|
|
|
--- gcc/var-tracking.c.jj 2010-01-21 09:10:37.000000000 +0100
|
|
|
|
|
+++ gcc/var-tracking.c 2010-01-21 10:00:15.983740989 +0100
|
|
|
|
|
@@ -109,6 +109,8 @@
|
|
|
|
|
#include "tree-flow.h"
|
2010-01-14 16:45:40 +00:00
|
|
|
|
#include "cselib.h"
|
|
|
|
|
#include "target.h"
|
|
|
|
|
+#include "toplev.h"
|
|
|
|
|
+#include "params.h"
|
|
|
|
|
|
2010-01-21 17:25:47 +00:00
|
|
|
|
/* 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.
|
|
|
|
|
@@ -451,7 +453,7 @@ static int add_uses (rtx *, void *);
|
2010-01-14 16:45:40 +00:00
|
|
|
|
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);
|
2010-01-21 17:25:47 +00:00
|
|
|
|
static int dump_var_slot (void **, void *);
|
|
|
|
|
@@ -5511,7 +5513,7 @@ compute_bb_dataflow (basic_block bb)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
|
|
|
|
|
/* Find the locations of variables in the whole function. */
|
|
|
|
|
|
|
|
|
|
-static void
|
|
|
|
|
+static bool
|
|
|
|
|
vt_find_locations (void)
|
|
|
|
|
{
|
|
|
|
|
fibheap_t worklist, pending, fibheap_swap;
|
2010-01-21 17:25:47 +00:00
|
|
|
|
@@ -5522,6 +5524,8 @@ vt_find_locations (void)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
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. */
|
2010-01-21 17:25:47 +00:00
|
|
|
|
@@ -5543,7 +5547,7 @@ vt_find_locations (void)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
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;
|
2010-01-21 17:25:47 +00:00
|
|
|
|
@@ -5566,11 +5570,11 @@ vt_find_locations (void)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
|
|
|
|
|
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
|
2010-01-21 17:25:47 +00:00
|
|
|
|
@@ -5634,9 +5638,20 @@ vt_find_locations (void)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 debug insns, retrying without");
|
|
|
|
|
+ else
|
|
|
|
|
+ inform (DECL_SOURCE_LOCATION (cfun->decl),
|
|
|
|
|
+ "variable tracking size limit exceeded");
|
|
|
|
|
+ success = false;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
if (changed)
|
|
|
|
|
{
|
2010-01-21 17:25:47 +00:00
|
|
|
|
@@ -5687,7 +5702,7 @@ vt_find_locations (void)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- if (MAY_HAVE_DEBUG_INSNS)
|
|
|
|
|
+ if (success && MAY_HAVE_DEBUG_INSNS)
|
|
|
|
|
FOR_EACH_BB (bb)
|
|
|
|
|
gcc_assert (VTI (bb)->flooded);
|
|
|
|
|
|
2010-01-21 17:25:47 +00:00
|
|
|
|
@@ -5698,6 +5713,8 @@ vt_find_locations (void)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
sbitmap_free (visited);
|
|
|
|
|
sbitmap_free (in_worklist);
|
|
|
|
|
sbitmap_free (in_pending);
|
|
|
|
|
+
|
|
|
|
|
+ return success;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print the content of the LIST to dump file. */
|
2010-01-21 17:25:47 +00:00
|
|
|
|
@@ -7600,9 +7617,11 @@ vt_finalize (void)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
|
|
|
|
|
/* 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 ();
|
2010-01-21 17:25:47 +00:00
|
|
|
|
@@ -7627,7 +7646,31 @@ variable_tracking_main (void)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- 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))
|
|
|
|
|
{
|
2010-01-21 17:25:47 +00:00
|
|
|
|
@@ -7641,6 +7684,19 @@ variable_tracking_main (void)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
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)
|
2010-01-21 17:25:47 +00:00
|
|
|
|
--- gcc/Makefile.in.jj 2010-01-21 08:58:12.000000000 +0100
|
|
|
|
|
+++ gcc/Makefile.in 2010-01-21 10:00:45.555730868 +0100
|
|
|
|
|
@@ -2751,7 +2751,7 @@ var-tracking.o : var-tracking.c $(CONFIG
|
2010-01-14 16:45:40 +00:00
|
|
|
|
$(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) \
|
2010-01-21 17:25:47 +00:00
|
|
|
|
$(REGS_H) $(EXPR_H) $(TIMEVAR_H) tree-pass.h cselib.h $(TARGET_H) \
|
|
|
|
|
- $(TREE_FLOW_H)
|
|
|
|
|
+ $(TREE_FLOW_H) $(TOPLEV_H) $(PARAMS_H)
|
2010-01-14 16:45:40 +00:00
|
|
|
|
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 \
|