Commit 92562f88 by Richard Biener Committed by Richard Biener

re PR tree-optimization/60891 (ICE: SIGSEGV (Invalid write/read) in…

re PR tree-optimization/60891 (ICE: SIGSEGV (Invalid write/read) in pre_and_rev_post_order_compute_fn with -O -fno-tree-ch -fno-tree-cselim -fno-tree-dominator-opts)

2014-04-23  Richard Biener  <rguenther@suse.de>

	PR middle-end/60891
	* loop-init.c (loop_optimizer_init): Make sure to apply
	LOOPS_MAY_HAVE_MULTIPLE_LATCHES before fixing up loops.

	* gcc.dg/torture/pr60891.c: New testcase.

From-SVN: r209673
parent 1c33c9b7
2014-04-23 Richard Biener <rguenther@suse.de>
PR middle-end/60891
* loop-init.c (loop_optimizer_init): Make sure to apply
LOOPS_MAY_HAVE_MULTIPLE_LATCHES before fixing up loops.
2014-04-22 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/60275
......
......@@ -94,20 +94,15 @@ loop_optimizer_init (unsigned flags)
else
{
bool recorded_exits = loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS);
bool needs_fixup = loops_state_satisfies_p (LOOPS_NEED_FIXUP);
gcc_assert (cfun->curr_properties & PROP_loops);
/* Ensure that the dominators are computed, like flow_loops_find does. */
calculate_dominance_info (CDI_DOMINATORS);
if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
{
loops_state_clear (~0U);
fix_loop_structure (NULL);
}
#ifdef ENABLE_CHECKING
else
if (!needs_fixup)
verify_loop_structure ();
#endif
......@@ -115,6 +110,14 @@ loop_optimizer_init (unsigned flags)
if (recorded_exits)
release_recorded_exits ();
loops_state_clear (~0U);
if (needs_fixup)
{
/* Apply LOOPS_MAY_HAVE_MULTIPLE_LATCHES early as fix_loop_structure
re-applies flags. */
loops_state_set (flags & LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
fix_loop_structure (NULL);
}
}
/* Apply flags to loops. */
......
2014-04-23 Richard Biener <rguenther@suse.de>
PR middle-end/60891
* gcc.dg/torture/pr60891.c: New testcase.
2014-04-22 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/60275
......
/* { dg-do compile } */
/* { dg-additional-options "-fno-tree-ch -fno-tree-cselim -fno-tree-dominator-opts" } */
int a, b, c, d, e, f;
void foo (int x)
{
for (;;)
{
int g = c;
if (x)
{
if (e)
while (a)
--f;
}
for (b = 5; b; b--)
{
}
if (!g)
x = 0;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment