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>
* 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>
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)
cases where the second path starts at a downstream edge on the same
path). First record all joiner paths, deleting any in the unexpected
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];
......@@ -2140,6 +2140,7 @@ mark_threaded_blocks (bitmap threaded_blocks)
if ((*path)[0]->e->aux == NULL)
{
(*path)[0]->e->aux = path;
i++;
}
else
{
......@@ -2149,10 +2150,15 @@ mark_threaded_blocks (bitmap threaded_blocks)
delete_jump_thread_path (path);
}
}
else
{
i++;
}
}
/* Second, look for paths that have any other jump thread attached to
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];
edge e = (*path)[0]->e;
......@@ -2167,7 +2173,10 @@ mark_threaded_blocks (bitmap threaded_blocks)
/* If we iterated through the entire path without exiting the loop,
then we are good to go, record it. */
if (j == path->length ())
bitmap_set_bit (tmp, e->dest->index);
{
bitmap_set_bit (tmp, e->dest->index);
i++;
}
else
{
e->aux = NULL;
......@@ -2177,6 +2186,10 @@ mark_threaded_blocks (bitmap threaded_blocks)
delete_jump_thread_path (path);
}
}
else
{
i++;
}
}
/* 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