re PR tree-optimization/62081 (ICE: in fix_loop_structure, at loop-init.c:208 with -fno-tree-ch -fno-tree-cselim -fno-tree-dominator-opts -fno-tree-reassoc -fno-tree-sink)

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
This commit is contained in:
Richard Biener 2014-08-14 13:14:24 +00:00 committed by Richard Biener
parent 833f94c011
commit 7d39012c24
4 changed files with 63 additions and 4 deletions

View File

@ -1,3 +1,11 @@
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 ...

View 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);

View 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);

View 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;
}