re PR tree-optimization/81090 ([graphite] ICE in loop_preheader_edge)

2017-06-16  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/81090
	* passes.def (pass_record_bounds): Remove.
	* tree-pass.h (make_pass_record_bounds): Likewise.
	* tree-ssa-loop.c (pass_data_record_bounds, pass_record_bounds,
	make_pass_record_bounds): Likewise.
	* tree-ssa-loop-ivcanon.c (canonicalize_induction_variables): Do
	not free niter estimates at the beginning but at the end.
	* tree-scalar-evolution.c (scev_finalize): Free niter estimates.

	* gcc.dg/graphite/pr81090.c: New testcase.

From-SVN: r249249
This commit is contained in:
Richard Biener 2017-06-16 12:19:24 +00:00 committed by Richard Biener
parent 4317778a9b
commit 01f1c24e42
8 changed files with 45 additions and 51 deletions

View File

@ -1,3 +1,14 @@
2017-06-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/81090
* passes.def (pass_record_bounds): Remove.
* tree-pass.h (make_pass_record_bounds): Likewise.
* tree-ssa-loop.c (pass_data_record_bounds, pass_record_bounds,
make_pass_record_bounds): Likewise.
* tree-ssa-loop-ivcanon.c (canonicalize_induction_variables): Do
not free niter estimates at the beginning but at the end.
* tree-scalar-evolution.c (scev_finalize): Free niter estimates.
2017-06-16 Richard Biener <rguenther@suse.de>
* tree-switch-conversion.c (emit_case_bit_tests): Adjust

View File

@ -276,7 +276,6 @@ along with GCC; see the file COPYING3. If not see
/* All unswitching, final value replacement and splitting can expose
empty loops. Remove them now. */
NEXT_PASS (pass_cd_dce);
NEXT_PASS (pass_record_bounds);
NEXT_PASS (pass_iv_canon);
NEXT_PASS (pass_loop_distribution);
NEXT_PASS (pass_copy_prop);

View File

@ -1,3 +1,8 @@
2017-06-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/81090
* gcc.dg/graphite/pr81090.c: New testcase.
2017-06-16 Janus Weil <janus@gcc.gnu.org>
PR fortran/80983

View File

@ -0,0 +1,27 @@
/* { dg-do compile } */
/* { dg-options "-O2 -floop-nest-optimize" } */
int x3, za;
int hg[1];
void
yw (int dq)
{
const int r7 = 2;
while (dq < 1)
{
for (x3 = 0; x3 < r7; ++x3)
for (za = 0; za < r7; ++za)
hg[1] = 0;
++dq;
}
x3 = 0;
while (x3 < r7)
{
++x3;
if (x3 == 0)
break;
}
}

View File

@ -373,7 +373,6 @@ extern gimple_opt_pass *make_pass_predcom (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_iv_canon (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_scev_cprop (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_record_bounds (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt);

View File

@ -3636,6 +3636,7 @@ scev_finalize (void)
return;
scalar_evolution_info->empty ();
scalar_evolution_info = NULL;
free_numbers_of_iterations_estimates (cfun);
}
/* Returns true if the expression EXPR is considered to be too expensive

View File

@ -1212,7 +1212,6 @@ canonicalize_induction_variables (void)
bool irred_invalidated = false;
bitmap loop_closed_ssa_invalidated = BITMAP_ALLOC (NULL);
free_numbers_of_iterations_estimates (cfun);
estimate_numbers_of_iterations ();
FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
@ -1230,6 +1229,7 @@ canonicalize_induction_variables (void)
/* Clean up the information about numbers of iterations, since brute force
evaluation could reveal new information. */
free_numbers_of_iterations_estimates (cfun);
scev_reset ();
if (!bitmap_empty_p (loop_closed_ssa_invalidated))

View File

@ -459,54 +459,6 @@ make_pass_scev_cprop (gcc::context *ctxt)
return new pass_scev_cprop (ctxt);
}
/* Record bounds on numbers of iterations of loops. */
namespace {
const pass_data pass_data_record_bounds =
{
GIMPLE_PASS, /* type */
"*record_bounds", /* name */
OPTGROUP_NONE, /* optinfo_flags */
TV_TREE_LOOP_BOUNDS, /* tv_id */
( PROP_cfg | PROP_ssa ), /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
0, /* todo_flags_finish */
};
class pass_record_bounds : public gimple_opt_pass
{
public:
pass_record_bounds (gcc::context *ctxt)
: gimple_opt_pass (pass_data_record_bounds, ctxt)
{}
/* opt_pass methods: */
virtual unsigned int execute (function *);
}; // class pass_record_bounds
unsigned int
pass_record_bounds::execute (function *fun)
{
if (number_of_loops (fun) <= 1)
return 0;
estimate_numbers_of_iterations ();
scev_reset ();
return 0;
}
} // anon namespace
gimple_opt_pass *
make_pass_record_bounds (gcc::context *ctxt)
{
return new pass_record_bounds (ctxt);
}
/* Induction variable optimizations. */
namespace {