OSDN Git Service

* params.def (PARAM_MAX_VARTRACK_SIZE): New.
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Feb 2010 08:02:37 +0000 (08:02 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Feb 2010 08:02:37 +0000 (08:02 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156794 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/Makefile.in
gcc/doc/invoke.texi
gcc/params.def
gcc/testsuite/ChangeLog
gcc/testsuite/lib/prune.exp
gcc/var-tracking.c

index 9f65cdd..5fad55c 100644 (file)
@@ -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>
 
index 64ae92a..6c656ea 100644 (file)
@@ -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 \
index 9684f17..a81cc99 100644 (file)
@@ -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
index 5dcf745..21dcb44 100644 (file)
@@ -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,
index 891acb1..1c51234 100644 (file)
@@ -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
index c61ec21..ef647d5 100644 (file)
@@ -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
index 7fa7574..049dca4 100644 (file)
 #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;
+}
 \f
 static bool
 gate_handle_var_tracking (void)