Patchwork Fix PR45570

login
register
mail settings
Submitter Andrey Belevantsev
Date Oct. 5, 2010, 12:35 p.m.
Message ID <4CAB1B9D.3060803@ispras.ru>
Download mbox | patch
Permalink /patch/66824/
State New
Headers show

Comments

Andrey Belevantsev - Oct. 5, 2010, 12:35 p.m.
Hello,

As explained in the PR trail, this is the variant of PR40101 when we cannot 
devise a positive seqno for a bookkeeping copy by examining insn's 
neighbors.  Fixed by removing the assert and allowing the code of PR40101 
patch to provide an arbitrary positive value.

Bootstrapped and regtested on ia64-linux, the testcase is also verified on 
x86-64 as reported in the PR.  Ok for trunk?

Andrey

2010-10-05  Andrey Belevantsev  <abel@ispras.ru>

	PR rtl-optimization/45570

	* sel-sched-ir.c (cfg_preds_1): When walking out of the region, assert
	that we are pipelining outer loops.  Allow returning zero predecessors.

	* gcc.dg/pr45570.c: New test.
Vladimir Makarov - Oct. 5, 2010, 2:38 p.m.
On 10/05/2010 08:35 AM, Andrey Belevantsev wrote:
> Hello,
>
> As explained in the PR trail, this is the variant of PR40101 when we 
> cannot devise a positive seqno for a bookkeeping copy by examining 
> insn's neighbors.  Fixed by removing the assert and allowing the code 
> of PR40101 patch to provide an arbitrary positive value.
>
> Bootstrapped and regtested on ia64-linux, the testcase is also 
> verified on x86-64 as reported in the PR.  Ok for trunk?
>
>
Yes, thanks for working on this.
>
> 2010-10-05  Andrey Belevantsev <abel@ispras.ru>
>
>     PR rtl-optimization/45570
>
>     * sel-sched-ir.c (cfg_preds_1): When walking out of the region, 
> assert
>     that we are pipelining outer loops.  Allow returning zero 
> predecessors.
>
>     * gcc.dg/pr45570.c: New test.
>

Patch

Index: gcc/testsuite/gcc.dg/pr45570.c
===================================================================
*** gcc/testsuite/gcc.dg/pr45570.c	(revision 0)
--- gcc/testsuite/gcc.dg/pr45570.c	(revision 0)
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+ /* { dg-options "O3 -fselective-scheduling2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -ftracer" } */
+ void
+ parser_get_next_char (char c, int qm, char *p)
+ {
+   int quote_mode = 0;
+   for (; *p; p++)
+     {
+       if (qm)
+ 	{
+ 	  if (quote_mode == 0 && *p == '"' && *(p - 1))
+ 	    {
+ 	      quote_mode = 1;
+ 	      continue;
+ 	    }
+ 	  if (quote_mode && *p == '"' && *(p - 1))
+ 	    quote_mode = 0;
+ 	}
+       if (quote_mode == 0 && *p == c && *(p - 1))
+ 	break;
+     }
+ }
+ 
+ void
+ parser_get_next_parameter (char *p)
+ {
+   parser_get_next_char (':', 1, p);
+ }
+ 
Index: gcc/sel-sched-ir.c
===================================================================
*** gcc/sel-sched-ir.c	(revision 164986)
--- gcc/sel-sched-ir.c	(working copy)
*************** cfg_preds_1 (basic_block bb, insn_t **pr
*** 4580,4587 ****
        basic_block pred_bb = e->src;
        insn_t bb_end = BB_END (pred_bb);
  
!       /* ??? This code is not supposed to walk out of a region.  */
!       gcc_assert (in_current_region_p (pred_bb));
  
        if (sel_bb_empty_p (pred_bb))
  	cfg_preds_1 (pred_bb, preds, n, size);
--- 4580,4591 ----
        basic_block pred_bb = e->src;
        insn_t bb_end = BB_END (pred_bb);
  
!       if (!in_current_region_p (pred_bb))
! 	{
! 	  gcc_assert (flag_sel_sched_pipelining_outer_loops
! 		      && current_loop_nest);
! 	  continue;
! 	}
  
        if (sel_bb_empty_p (pred_bb))
  	cfg_preds_1 (pred_bb, preds, n, size);
*************** cfg_preds_1 (basic_block bb, insn_t **pr
*** 4594,4600 ****
  	}
      }
  
!   gcc_assert (*n != 0);
  }
  
  /* Find all predecessors of BB and record them in PREDS and their number
--- 4598,4606 ----
  	}
      }
  
!   gcc_assert (*n != 0
! 	      || (flag_sel_sched_pipelining_outer_loops
! 		  && current_loop_nest));
  }
  
  /* Find all predecessors of BB and record them in PREDS and their number