re PR tree-optimization/62081 (ICE: in fix_loop_structure, at loop-init.c:208 with...
authorRichard Biener <rguenther@suse.de>
Thu, 14 Aug 2014 13:14:24 +0000 (13:14 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 14 Aug 2014 13:14:24 +0000 (13:14 +0000)
2014-08-14  Richard Biener  <rguenther@suse.de>

PR tree-optimization/62081
* tree-ssa-loop.c (pass_fix_loops): New pass.
(pass_tree_loop::gate):  Do not fixup loops here.
* tree-pass.h (make_pass_fix_loops): Declare.
* passes.def: Schedule pass_fix_loops before GIMPLE loop passes.

From-SVN: r213961

gcc/ChangeLog
gcc/passes.def
gcc/tree-pass.h
gcc/tree-ssa-loop.c

index fe14129..db09e06 100644 (file)
@@ -1,5 +1,13 @@
 2014-08-14  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/62081
+       * tree-ssa-loop.c (pass_fix_loops): New pass.
+       (pass_tree_loop::gate):  Do not fixup loops here.
+       * tree-pass.h (make_pass_fix_loops): Declare.
+       * passes.def: Schedule pass_fix_loops before GIMPLE loop passes.
+
+2014-08-14  Richard Biener  <rguenther@suse.de>
+
        * tree.c (type_hash_lookup, type_hash_add): Merge into ...
        (type_hash_canon): ... this and avoid 2nd lookup for the add.
 
index f13df6c..334c670 100644 (file)
@@ -200,7 +200,10 @@ along with GCC; see the file COPYING3.  If not see
       NEXT_PASS (pass_asan);
       NEXT_PASS (pass_tsan);
       /* Pass group that runs when 1) enabled, 2) there are loops
-        in the function.  */
+        in the function.  Make sure to run pass_fix_loops before
+        to discover/remove loops before running the gate function
+        of pass_tree_loop.  */
+      NEXT_PASS (pass_fix_loops);
       NEXT_PASS (pass_tree_loop);
       PUSH_INSERT_PASSES_WITHIN (pass_tree_loop)
          NEXT_PASS (pass_tree_loop_init);
index 1477d1f..ed109c3 100644 (file)
@@ -349,6 +349,7 @@ extern gimple_opt_pass *make_pass_sra_early (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_early_ipa_sra (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_tail_recursion (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_tail_calls (gcc::context *ctxt);
+extern gimple_opt_pass *make_pass_fix_loops (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_tree_loop (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_tree_no_loop (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_tree_loop_init (gcc::context *ctxt);
index d0c9980..7d1f68e 100644 (file)
@@ -43,6 +43,56 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-vectorizer.h"
 
 
+/* A pass making sure loops are fixed up.  */
+
+namespace {
+
+const pass_data pass_data_fix_loops =
+{
+  GIMPLE_PASS, /* type */
+  "fix_loops", /* name */
+  OPTGROUP_LOOP, /* optinfo_flags */
+  TV_TREE_LOOP, /* tv_id */
+  PROP_cfg, /* properties_required */
+  0, /* properties_provided */
+  0, /* properties_destroyed */
+  0, /* todo_flags_start */
+  0, /* todo_flags_finish */
+};
+
+class pass_fix_loops : public gimple_opt_pass
+{
+public:
+  pass_fix_loops (gcc::context *ctxt)
+    : gimple_opt_pass (pass_data_fix_loops, ctxt)
+  {}
+
+  /* opt_pass methods: */
+  virtual bool gate (function *) { return flag_tree_loop_optimize; }
+
+  virtual unsigned int execute (function *fn);
+}; // class pass_fix_loops
+
+unsigned int
+pass_fix_loops::execute (function *)
+{
+  if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
+    {
+      calculate_dominance_info (CDI_DOMINATORS);
+      fix_loop_structure (NULL);
+    }
+  return 0;
+}
+
+} // anon namespace
+
+gimple_opt_pass *
+make_pass_fix_loops (gcc::context *ctxt)
+{
+  return new pass_fix_loops (ctxt);
+}
+
+
 /* Gate for loop pass group.  The group is controlled by -ftree-loop-optimize
    but we also avoid running it when the IL doesn't contain any loop.  */
 
@@ -57,9 +107,6 @@ gate_loop (function *fn)
   if (!loops_for_fn (fn))
     return true;
 
-  /* Make sure to drop / re-discover loops when necessary.  */
-  if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
-    fix_loop_structure (NULL);
   return number_of_loops (fn) > 1;
 }