public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fix PR66314
@ 2015-05-29 11:05 Richard Biener
  2015-05-30  4:41 ` H.J. Lu
  0 siblings, 1 reply; 3+ messages in thread
From: Richard Biener @ 2015-05-29 11:05 UTC (permalink / raw)
  To: gcc-patches


This fixes jump threading which fails to update the loop ownership
of duplicated blocks (and was probably just lucky that loops were
fixed up usually).  The blocks of the jump thread path always belong to
the loop of the final threading destination.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

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.

Index: gcc/tree-ssa-threadupdate.c
===================================================================
*** gcc/tree-ssa-threadupdate.c	(revision 223818)
--- gcc/tree-ssa-threadupdate.c	(working copy)
*************** remove_ctrl_stmt_and_useless_edges (basi
*** 312,324 ****
  }
  
  /* Create a duplicate of BB.  Record the duplicate block in an array
!    indexed by COUNT stored in RD.  */
  
  static void
  create_block_for_threading (basic_block bb,
  			    struct redirection_data *rd,
  			    unsigned int count,
! 			    bitmap *duplicate_blocks)
  {
    edge_iterator ei;
    edge e;
--- 312,326 ----
  }
  
  /* 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
!    belong to, if not NULL, in which case it will belong to the same
!    loop as BB.  */
  
  static void
  create_block_for_threading (basic_block bb,
  			    struct redirection_data *rd,
  			    unsigned int count,
! 			    bitmap *duplicate_blocks, loop_p loop)
  {
    edge_iterator ei;
    edge e;
*************** create_block_for_threading (basic_block
*** 326,331 ****
--- 328,338 ----
    /* We can use the generic block duplication code and simply remove
       the stuff we do not need.  */
    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)
      e->aux = NULL;
*************** ssa_create_duplicates (struct redirectio
*** 1303,1308 ****
--- 1310,1319 ----
  		       ssa_local_info_t *local_info)
  {
    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
       to the path.  So it gets stored in RD rather than in LOCAL_DATA.
*************** ssa_create_duplicates (struct redirectio
*** 1313,1326 ****
       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
       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++)
      {
        if ((*path)[i]->type == EDGE_COPY_SRC_BLOCK
  	  || (*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
  	{
  	  create_block_for_threading ((*path)[i]->e->src, rd, 1,
! 				      &local_info->duplicate_blocks);
  	  break;
  	}
      }
--- 1324,1336 ----
       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
       duplicated.  Thus we start our search with the third edge.  */
    for (unsigned int i = 2; i < path->length (); i++)
      {
        if ((*path)[i]->type == EDGE_COPY_SRC_BLOCK
  	  || (*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
  	{
  	  create_block_for_threading ((*path)[i]->e->src, rd, 1,
! 				      &local_info->duplicate_blocks, dest_loop);
  	  break;
  	}
      }
*************** ssa_create_duplicates (struct redirectio
*** 1330,1336 ****
    if (local_info->template_block == NULL)
      {
        create_block_for_threading ((*path)[1]->e->src, rd, 0,
! 				  &local_info->duplicate_blocks);
        local_info->template_block = rd->dup_blocks[0];
  
        /* We do not create any outgoing edges for the template.  We will
--- 1340,1346 ----
    if (local_info->template_block == NULL)
      {
        create_block_for_threading ((*path)[1]->e->src, rd, 0,
! 				  &local_info->duplicate_blocks, dest_loop);
        local_info->template_block = rd->dup_blocks[0];
  
        /* We do not create any outgoing edges for the template.  We will
*************** ssa_create_duplicates (struct redirectio
*** 1340,1346 ****
    else
      {
        create_block_for_threading (local_info->template_block, rd, 0,
! 				  &local_info->duplicate_blocks);
  
        /* Go ahead and wire up outgoing edges and update PHIs for the duplicate
  	 block.   */
--- 1350,1356 ----
    else
      {
        create_block_for_threading (local_info->template_block, rd, 0,
! 				  &local_info->duplicate_blocks, dest_loop);
  
        /* Go ahead and wire up outgoing edges and update PHIs for the duplicate
  	 block.   */
*************** thread_single_edge (edge e)
*** 1677,1683 ****
    npath->safe_push (x);
    rd.path = npath;
  
!   create_block_for_threading (bb, &rd, 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);
  
--- 1687,1693 ----
    npath->safe_push (x);
    rd.path = npath;
  
!   create_block_for_threading (bb, &rd, 0, NULL, NULL);
    remove_ctrl_stmt_and_useless_edges (rd.dup_blocks[0], NULL);
    create_edge_and_update_destination_phis (&rd, rd.dup_blocks[0], 0);
  
Index: gcc/testsuite/gcc.dg/asan/pr66314.c
===================================================================
*** gcc/testsuite/gcc.dg/asan/pr66314.c	(revision 0)
--- gcc/testsuite/gcc.dg/asan/pr66314.c	(working copy)
***************
*** 0 ****
--- 1,33 ----
+ /* { 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;
+ 	}
+     }
+ }

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Fix PR66314
  2015-05-29 11:05 [PATCH] Fix PR66314 Richard Biener
@ 2015-05-30  4:41 ` H.J. Lu
  2015-06-01 13:55   ` Richard Biener
  0 siblings, 1 reply; 3+ messages in thread
From: H.J. Lu @ 2015-05-30  4:41 UTC (permalink / raw)
  To: Richard Biener; +Cc: GCC Patches

On Fri, May 29, 2015 at 3:39 AM, Richard Biener <rguenther@suse.de> wrote:
>
> This fixes jump threading which fails to update the loop ownership
> of duplicated blocks (and was probably just lucky that loops were
> fixed up usually).  The blocks of the jump thread path always belong to
> the loop of the final threading destination.
>
> Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
>
> Richard.
>
> 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.
>

This caused:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66340

-- 
H.J.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Fix PR66314
  2015-05-30  4:41 ` H.J. Lu
@ 2015-06-01 13:55   ` Richard Biener
  0 siblings, 0 replies; 3+ messages in thread
From: Richard Biener @ 2015-06-01 13:55 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GCC Patches

On Fri, 29 May 2015, H.J. Lu wrote:

> On Fri, May 29, 2015 at 3:39 AM, Richard Biener <rguenther@suse.de> wrote:
> >
> > This fixes jump threading which fails to update the loop ownership
> > of duplicated blocks (and was probably just lucky that loops were
> > fixed up usually).  The blocks of the jump thread path always belong to
> > the loop of the final threading destination.
> >
> > Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
> >
> > Richard.
> >
> > 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.
> >
> 
> This caused:
> 
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66340

Reverted for now.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-06-01 13:55 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-29 11:05 [PATCH] Fix PR66314 Richard Biener
2015-05-30  4:41 ` H.J. Lu
2015-06-01 13:55   ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).