Commit c2a96ec2 by Jeff Law Committed by Jeff Law

re PR middle-end/66314 (ice in verify_loop_structure)

	PR middle-end/66314
	PR gcov-profile/66899
	* tree-ssa-threadupdate.c (mark_threaded_blocks): Correctly
	iterate over the jump threading paths when an element in the
	jump threading paths array is eliminated.

	PR middle-end/66314
	PR gcov-profile/66899
	* gcc.dg/pr66899.c: New test.
	* gcc.dg/pr66314.c: New test.

From-SVN: r226516
parent 93411db8
2015-08-03 Jeff Law <law@redhat.com>
PR middle-end/66314
PR gcov-profile/66899
* tree-ssa-threadupdate.c (mark_threaded_blocks): Correctly
iterate over the jump threading paths when an element in the
jump threading paths array is eliminated.
2015-08-03 Segher Boessenkool <segher@kernel.crashing.org> 2015-08-03 Segher Boessenkool <segher@kernel.crashing.org>
* Makefile.in (OBJS): Put gimple-match.o and generic-match.o first. * Makefile.in (OBJS): Put gimple-match.o and generic-match.o first.
......
2015-08-03 Jeff Law <law@redhat.com>
PR middle-end/66314
PR gcov-profile/66899
* gcc.dg/pr66899.c: New test.
* gcc.dg/pr66314.c: New test.
2015-08-03 Marek Polacek <polacek@redhat.com> 2015-08-03 Marek Polacek <polacek@redhat.com>
PR c/67088 PR c/67088
......
/* { dg-do compile } */
/* { dg-options "-std=gnu89 -Os -fprofile-arcs -fsanitize=kernel-address" } */
char *a;
int d;
static int
fn1 (int b, int c)
{
while (a)
if (*a)
return -126;
if (b)
return -12;
if (c == -12)
return c;
}
void
fn2 (int b, int c)
{
for (;;)
{
d = fn1 (b, c);
switch (d)
{
case -126:
continue;
default:
return;
}
}
}
/* { dg-do compile } */
/* { dg-options "-Os -fprofile-arcs" } */
struct
{
int authority;
} * a, *b, c, d;
int e, f;
static int
fn1 ()
{
if (a)
goto verified;
if (b)
goto matched;
return -126;
matched:
e = 0;
verified:
if (b)
for (; &c != b; c = d)
;
return 0;
}
int
fn2 ()
{
for (;;)
{
f = fn1 ();
switch (f)
{
case -126:
continue;
default:
return 0;
}
}
}
...@@ -2130,7 +2130,7 @@ mark_threaded_blocks (bitmap threaded_blocks) ...@@ -2130,7 +2130,7 @@ mark_threaded_blocks (bitmap threaded_blocks)
cases where the second path starts at a downstream edge on the same cases where the second path starts at a downstream edge on the same
path). First record all joiner paths, deleting any in the unexpected path). First record all joiner paths, deleting any in the unexpected
case where there is already a path for that incoming edge. */ case where there is already a path for that incoming edge. */
for (i = 0; i < paths.length (); i++) for (i = 0; i < paths.length ();)
{ {
vec<jump_thread_edge *> *path = paths[i]; vec<jump_thread_edge *> *path = paths[i];
...@@ -2140,6 +2140,7 @@ mark_threaded_blocks (bitmap threaded_blocks) ...@@ -2140,6 +2140,7 @@ mark_threaded_blocks (bitmap threaded_blocks)
if ((*path)[0]->e->aux == NULL) if ((*path)[0]->e->aux == NULL)
{ {
(*path)[0]->e->aux = path; (*path)[0]->e->aux = path;
i++;
} }
else else
{ {
...@@ -2149,10 +2150,15 @@ mark_threaded_blocks (bitmap threaded_blocks) ...@@ -2149,10 +2150,15 @@ mark_threaded_blocks (bitmap threaded_blocks)
delete_jump_thread_path (path); delete_jump_thread_path (path);
} }
} }
else
{
i++;
}
} }
/* Second, look for paths that have any other jump thread attached to /* Second, look for paths that have any other jump thread attached to
them, and either finish converting them or cancel them. */ them, and either finish converting them or cancel them. */
for (i = 0; i < paths.length (); i++) for (i = 0; i < paths.length ();)
{ {
vec<jump_thread_edge *> *path = paths[i]; vec<jump_thread_edge *> *path = paths[i];
edge e = (*path)[0]->e; edge e = (*path)[0]->e;
...@@ -2167,7 +2173,10 @@ mark_threaded_blocks (bitmap threaded_blocks) ...@@ -2167,7 +2173,10 @@ mark_threaded_blocks (bitmap threaded_blocks)
/* If we iterated through the entire path without exiting the loop, /* If we iterated through the entire path without exiting the loop,
then we are good to go, record it. */ then we are good to go, record it. */
if (j == path->length ()) if (j == path->length ())
bitmap_set_bit (tmp, e->dest->index); {
bitmap_set_bit (tmp, e->dest->index);
i++;
}
else else
{ {
e->aux = NULL; e->aux = NULL;
...@@ -2177,6 +2186,10 @@ mark_threaded_blocks (bitmap threaded_blocks) ...@@ -2177,6 +2186,10 @@ mark_threaded_blocks (bitmap threaded_blocks)
delete_jump_thread_path (path); delete_jump_thread_path (path);
} }
} }
else
{
i++;
}
} }
/* If optimizing for size, only thread through block if we don't have /* If optimizing for size, only thread through block if we don't have
......
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