Commit 96a956b6 by Richard Biener Committed by Richard Biener

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

2015-06-01  Richard Biener  <rguenther@suse.de>

	Revert
	2015-05-29  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/66314
	* tree-ssa-threadupdate.c (create_block_for_threading): Add
	parameter that says which loop the new block belongs to.
	(ssa_create_duplicates): Blocks duplicated for the threaded
	path belong to the loop of the thread destination.

	* gcc.dg/asan/pr66314.c: New testcase.

From-SVN: r223979
parent d88e64a6
2015-06-01 Richard Biener <rguenther@suse.de>
Revert
2015-05-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/66314
* tree-ssa-threadupdate.c (create_block_for_threading): Add
parameter that says which loop the new block belongs to.
(ssa_create_duplicates): Blocks duplicated for the threaded
path belong to the loop of the thread destination.
2015-06-01 Martin Liska <mliska@suse.cz> 2015-06-01 Martin Liska <mliska@suse.cz>
* sched-deps.c: Include pool-alloc.h before * sched-deps.c: Include pool-alloc.h before
......
2015-06-01 Richard Biener <rguenther@suse.de> 2015-06-01 Richard Biener <rguenther@suse.de>
Revert
2015-05-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/66314
* gcc.dg/asan/pr66314.c: New testcase.
2015-06-01 Richard Biener <rguenther@suse.de>
* gcc.dg/ipa/ipa-pta-1.c: Adjust. * gcc.dg/ipa/ipa-pta-1.c: Adjust.
2015-06-01 Jakub Jelinek <jakub@redhat.com> 2015-06-01 Jakub Jelinek <jakub@redhat.com>
......
/* { dg-do compile } */
/* { dg-options "-fprofile-arcs -fno-sanitize=address -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;
}
}
}
...@@ -312,15 +312,13 @@ remove_ctrl_stmt_and_useless_edges (basic_block bb, basic_block dest_bb) ...@@ -312,15 +312,13 @@ remove_ctrl_stmt_and_useless_edges (basic_block bb, basic_block dest_bb)
} }
/* Create a duplicate of BB. Record the duplicate block in an array /* Create a duplicate of BB. Record the duplicate block in an array
indexed by COUNT stored in RD. LOOP is the loop the block should indexed by COUNT stored in RD. */
belong to, if not NULL, in which case it will belong to the same
loop as BB. */
static void static void
create_block_for_threading (basic_block bb, create_block_for_threading (basic_block bb,
struct redirection_data *rd, struct redirection_data *rd,
unsigned int count, unsigned int count,
bitmap *duplicate_blocks, loop_p loop) bitmap *duplicate_blocks)
{ {
edge_iterator ei; edge_iterator ei;
edge e; edge e;
...@@ -328,11 +326,6 @@ create_block_for_threading (basic_block bb, ...@@ -328,11 +326,6 @@ create_block_for_threading (basic_block bb,
/* We can use the generic block duplication code and simply remove /* We can use the generic block duplication code and simply remove
the stuff we do not need. */ the stuff we do not need. */
rd->dup_blocks[count] = duplicate_block (bb, NULL, NULL); rd->dup_blocks[count] = duplicate_block (bb, NULL, NULL);
if (loop && rd->dup_blocks[count]->loop_father != loop)
{
remove_bb_from_loops (rd->dup_blocks[count]);
add_bb_to_loop (rd->dup_blocks[count], loop);
}
FOR_EACH_EDGE (e, ei, rd->dup_blocks[count]->succs) FOR_EACH_EDGE (e, ei, rd->dup_blocks[count]->succs)
e->aux = NULL; e->aux = NULL;
...@@ -1310,10 +1303,6 @@ ssa_create_duplicates (struct redirection_data **slot, ...@@ -1310,10 +1303,6 @@ ssa_create_duplicates (struct redirection_data **slot,
ssa_local_info_t *local_info) ssa_local_info_t *local_info)
{ {
struct redirection_data *rd = *slot; struct redirection_data *rd = *slot;
vec<jump_thread_edge *> *path = rd->path;
/* Check to which loop the threading destination belongs to. */
loop_p dest_loop = (*path).last ()->e->dest->loop_father;
/* The second duplicated block in a jump threading path is specific /* The second duplicated block in a jump threading path is specific
to the path. So it gets stored in RD rather than in LOCAL_DATA. to the path. So it gets stored in RD rather than in LOCAL_DATA.
...@@ -1324,13 +1313,14 @@ ssa_create_duplicates (struct redirection_data **slot, ...@@ -1324,13 +1313,14 @@ ssa_create_duplicates (struct redirection_data **slot,
Note the search starts with the third edge on the path. The first Note the search starts with the third edge on the path. The first
edge is the incoming edge, the second edge always has its source edge is the incoming edge, the second edge always has its source
duplicated. Thus we start our search with the third edge. */ duplicated. Thus we start our search with the third edge. */
vec<jump_thread_edge *> *path = rd->path;
for (unsigned int i = 2; i < path->length (); i++) for (unsigned int i = 2; i < path->length (); i++)
{ {
if ((*path)[i]->type == EDGE_COPY_SRC_BLOCK if ((*path)[i]->type == EDGE_COPY_SRC_BLOCK
|| (*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK) || (*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
{ {
create_block_for_threading ((*path)[i]->e->src, rd, 1, create_block_for_threading ((*path)[i]->e->src, rd, 1,
&local_info->duplicate_blocks, dest_loop); &local_info->duplicate_blocks);
break; break;
} }
} }
...@@ -1340,7 +1330,7 @@ ssa_create_duplicates (struct redirection_data **slot, ...@@ -1340,7 +1330,7 @@ ssa_create_duplicates (struct redirection_data **slot,
if (local_info->template_block == NULL) if (local_info->template_block == NULL)
{ {
create_block_for_threading ((*path)[1]->e->src, rd, 0, create_block_for_threading ((*path)[1]->e->src, rd, 0,
&local_info->duplicate_blocks, dest_loop); &local_info->duplicate_blocks);
local_info->template_block = rd->dup_blocks[0]; local_info->template_block = rd->dup_blocks[0];
/* We do not create any outgoing edges for the template. We will /* We do not create any outgoing edges for the template. We will
...@@ -1350,7 +1340,7 @@ ssa_create_duplicates (struct redirection_data **slot, ...@@ -1350,7 +1340,7 @@ ssa_create_duplicates (struct redirection_data **slot,
else else
{ {
create_block_for_threading (local_info->template_block, rd, 0, create_block_for_threading (local_info->template_block, rd, 0,
&local_info->duplicate_blocks, dest_loop); &local_info->duplicate_blocks);
/* Go ahead and wire up outgoing edges and update PHIs for the duplicate /* Go ahead and wire up outgoing edges and update PHIs for the duplicate
block. */ block. */
...@@ -1687,7 +1677,7 @@ thread_single_edge (edge e) ...@@ -1687,7 +1677,7 @@ thread_single_edge (edge e)
npath->safe_push (x); npath->safe_push (x);
rd.path = npath; rd.path = npath;
create_block_for_threading (bb, &rd, 0, NULL, NULL); create_block_for_threading (bb, &rd, 0, NULL);
remove_ctrl_stmt_and_useless_edges (rd.dup_blocks[0], NULL); remove_ctrl_stmt_and_useless_edges (rd.dup_blocks[0], NULL);
create_edge_and_update_destination_phis (&rd, rd.dup_blocks[0], 0); create_edge_and_update_destination_phis (&rd, rd.dup_blocks[0], 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