diff mbox series

Fix PR 83530

Message ID eb76f547-3840-76c6-fb17-4840d1bbbda2@ispras.ru
State New
Headers show
Series Fix PR 83530 | expand

Commit Message

Andrey Belevantsev April 3, 2018, 3:41 p.m. UTC
Hello,

This issue is when we cannot correctly make insn tick data for the
unscheduled code (but processed by the modulo scheduler).  Fixed by closely
following usual scheduling process as described in the PR.

Best,
Andrey

2018-04-03  Andrey Belevantsev  <abel@ispras.ru>

	PR rtl-optimization/83530

	* sel-sched.c (force_next_insn): New global variable.
	(remove_insn_for_debug): When force_next_insn is true, also leave only
next insn
	in the ready list.
	(sel_sched_region): When the region wasn't scheduled, make another pass
over it
	with force_next_insn set to 1.


	* gcc.dg/pr8350.c: New test.

Comments

Alexander Monakov April 6, 2018, 3:55 p.m. UTC | #1
On Tue, 3 Apr 2018, Andrey Belevantsev wrote:

> Hello,
> 
> This issue is when we cannot correctly make insn tick data for the
> unscheduled code (but processed by the modulo scheduler).  Fixed by closely
> following usual scheduling process as described in the PR.

This is ok with the following nit-picks fixed.

> 2018-04-03  Andrey Belevantsev  <abel@ispras.ru>
> 
> 	PR rtl-optimization/83530
> 
> 	* sel-sched.c (force_next_insn): New global variable.
> 	(remove_insn_for_debug): When force_next_insn is true, also leave only
> next insn
> 	in the ready list.
> 	(sel_sched_region): When the region wasn't scheduled, make another pass
> over it
> 	with force_next_insn set to 1.

Overlong lines.

> 	* gcc.dg/pr8350.c: New test.

Typo in test name.
 
> --- a/gcc/sel-sched.c
> +++ b/gcc/sel-sched.c
> @@ -5004,12 +5004,16 @@ remove_temp_moveop_nops (bool full_tidying)
>     distinguishing between bookkeeping copies and original insns.  */
>  static int max_uid_before_move_op = 0;
> 
> +/* When true, we're always scheduling next insn on the already scheduled code
> +   to get the right insn data for the following bundling or other passes.  */
> +static int force_next_insn = 0;
> +
>  /* Remove from AV_VLIW_P all instructions but next when debug counter
>     tells us so.  Next instruction is fetched from BNDS.  */
>  static void
>  remove_insns_for_debug (blist_t bnds, av_set_t *av_vliw_p)
>  {
> -  if (! dbg_cnt (sel_sched_insn_cnt))
> +  if (! dbg_cnt (sel_sched_insn_cnt) || force_next_insn)
>      /* Leave only the next insn in av_vliw.  */
>      {
>        av_set_iterator av_it;
> @@ -7642,7 +7646,13 @@ sel_sched_region (int rgn)
>      sel_sched_region_1 ();
>    else
>      /* Force initialization of INSN_SCHED_CYCLEs for correct bundling.  */

I believe this comment needs updating.

Please also consider moving both assignments of reset_sched_cycles_p to
after the if-else statement, just before sel_region_finish call.

> -    reset_sched_cycles_p = true;
> +    {
> +      reset_sched_cycles_p = false;
> +      pipelining_p = false;
> +      force_next_insn = 1;
> +      sel_sched_region_1 ();
> +      force_next_insn = 0;
> +    }
> 
>    sel_region_finish (reset_sched_cycles_p);
>  }
Andrey Belevantsev April 9, 2018, 9:10 a.m. UTC | #2
On 06.04.2018 18:55, Alexander Monakov wrote:
> On Tue, 3 Apr 2018, Andrey Belevantsev wrote:
> 
>> Hello,
>>
>> This issue is when we cannot correctly make insn tick data for the
>> unscheduled code (but processed by the modulo scheduler).  Fixed by closely
>> following usual scheduling process as described in the PR.
> 
> This is ok with the following nit-picks fixed.

Thank, I've committed the attached.

Andrey

> 
>> 2018-04-03  Andrey Belevantsev  <abel@ispras.ru>
>>
>> 	PR rtl-optimization/83530
>>
>> 	* sel-sched.c (force_next_insn): New global variable.
>> 	(remove_insn_for_debug): When force_next_insn is true, also leave only
>> next insn
>> 	in the ready list.
>> 	(sel_sched_region): When the region wasn't scheduled, make another pass
>> over it
>> 	with force_next_insn set to 1.
> 
> Overlong lines.
> 
>> 	* gcc.dg/pr8350.c: New test.
> 
> Typo in test name.
>  
>> --- a/gcc/sel-sched.c
>> +++ b/gcc/sel-sched.c
>> @@ -5004,12 +5004,16 @@ remove_temp_moveop_nops (bool full_tidying)
>>     distinguishing between bookkeeping copies and original insns.  */
>>  static int max_uid_before_move_op = 0;
>>
>> +/* When true, we're always scheduling next insn on the already scheduled code
>> +   to get the right insn data for the following bundling or other passes.  */
>> +static int force_next_insn = 0;
>> +
>>  /* Remove from AV_VLIW_P all instructions but next when debug counter
>>     tells us so.  Next instruction is fetched from BNDS.  */
>>  static void
>>  remove_insns_for_debug (blist_t bnds, av_set_t *av_vliw_p)
>>  {
>> -  if (! dbg_cnt (sel_sched_insn_cnt))
>> +  if (! dbg_cnt (sel_sched_insn_cnt) || force_next_insn)
>>      /* Leave only the next insn in av_vliw.  */
>>      {
>>        av_set_iterator av_it;
>> @@ -7642,7 +7646,13 @@ sel_sched_region (int rgn)
>>      sel_sched_region_1 ();
>>    else
>>      /* Force initialization of INSN_SCHED_CYCLEs for correct bundling.  */
> 
> I believe this comment needs updating.
> 
> Please also consider moving both assignments of reset_sched_cycles_p to
> after the if-else statement, just before sel_region_finish call.
> 
>> -    reset_sched_cycles_p = true;
>> +    {
>> +      reset_sched_cycles_p = false;
>> +      pipelining_p = false;
>> +      force_next_insn = 1;
>> +      sel_sched_region_1 ();
>> +      force_next_insn = 0;
>> +    }
>>
>>    sel_region_finish (reset_sched_cycles_p);
>>  }
Index: gcc/ChangeLog
===================================================================
*** gcc/ChangeLog	(revision 259227)
--- gcc/ChangeLog	(revision 259228)
***************
*** 1,3 ****
--- 1,13 ----
+ 2018-04-09  Andrey Belevantsev  <abel@ispras.ru>
+ 
+ 	PR rtl-optimization/83530
+ 
+ 	* sel-sched.c (force_next_insn): New global variable.
+ 	(remove_insn_for_debug): When force_next_insn is true, also leave only
+ 	next insn in the ready list.
+ 	(sel_sched_region): When the region wasn't scheduled, make another pass
+ 	over it with force_next_insn set to 1.
+ 
  2018-04-08  Monk Chiang  <sh.chiang04@gmail.com>
  
  	* config.gcc (nds32le-*-*, nds32be-*-*): Add nds32/nds32_intrinsic.h
Index: gcc/testsuite/gcc.dg/pr83530.c
===================================================================
*** gcc/testsuite/gcc.dg/pr83530.c	(revision 0)
--- gcc/testsuite/gcc.dg/pr83530.c	(revision 259228)
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+ /* { dg-options "-O2 -fmodulo-sched -fselective-scheduling2" } */
+ int vm, z0;
+ short int mz;
+ 
+ int
+ ny (void)
+ {
+   int ch;
+ 
+   for (ch = 0; ch < 6; ++ch)
+     vm += ch / vm;
+ 
+   return z0 + mz;
+ }
Index: gcc/testsuite/ChangeLog
===================================================================
*** gcc/testsuite/ChangeLog	(revision 259227)
--- gcc/testsuite/ChangeLog	(revision 259228)
***************
*** 1,3 ****
--- 1,8 ----
+ 2018-04-09  Andrey Belevantsev  <abel@ispras.ru>
+ 
+ 	PR rtl-optimization/83530
+ 	* gcc.dg/pr83530.c: New test.
+ 
  2018-04-07  Thomas Koenig  <tkoenig@gcc.gnu.org>
  
  	PR middle-end/82976
Index: gcc/sel-sched.c
===================================================================
*** gcc/sel-sched.c	(revision 259227)
--- gcc/sel-sched.c	(revision 259228)
*************** remove_temp_moveop_nops (bool full_tidyi
*** 5004,5015 ****
     distinguishing between bookkeeping copies and original insns.  */
  static int max_uid_before_move_op = 0;
  
  /* Remove from AV_VLIW_P all instructions but next when debug counter
     tells us so.  Next instruction is fetched from BNDS.  */
  static void
  remove_insns_for_debug (blist_t bnds, av_set_t *av_vliw_p)
  {
!   if (! dbg_cnt (sel_sched_insn_cnt))
      /* Leave only the next insn in av_vliw.  */
      {
        av_set_iterator av_it;
--- 5004,5019 ----
     distinguishing between bookkeeping copies and original insns.  */
  static int max_uid_before_move_op = 0;
  
+ /* When true, we're always scheduling next insn on the already scheduled code
+    to get the right insn data for the following bundling or other passes.  */
+ static int force_next_insn = 0;
+ 
  /* Remove from AV_VLIW_P all instructions but next when debug counter
     tells us so.  Next instruction is fetched from BNDS.  */
  static void
  remove_insns_for_debug (blist_t bnds, av_set_t *av_vliw_p)
  {
!   if (! dbg_cnt (sel_sched_insn_cnt) || force_next_insn)
      /* Leave only the next insn in av_vliw.  */
      {
        av_set_iterator av_it;
*************** sel_sched_region (int rgn)
*** 7641,7649 ****
    if (schedule_p)
      sel_sched_region_1 ();
    else
!     /* Force initialization of INSN_SCHED_CYCLEs for correct bundling.  */
!     reset_sched_cycles_p = true;
! 
    sel_region_finish (reset_sched_cycles_p);
  }
  
--- 7645,7659 ----
    if (schedule_p)
      sel_sched_region_1 ();
    else
!     {
!       /* Schedule always selecting the next insn to make the correct data
! 	 for bundling or other later passes.  */
!       pipelining_p = false;
!       force_next_insn = 1;
!       sel_sched_region_1 ();
!       force_next_insn = 0;
!     }
!   reset_sched_cycles_p = pipelining_p;
    sel_region_finish (reset_sched_cycles_p);
  }
diff mbox series

Patch

diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index 76092f9587a..fca2b69c5ee 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -5004,12 +5004,16 @@  remove_temp_moveop_nops (bool full_tidying)
    distinguishing between bookkeeping copies and original insns.  */
 static int max_uid_before_move_op = 0;

+/* When true, we're always scheduling next insn on the already scheduled code
+   to get the right insn data for the following bundling or other passes.  */
+static int force_next_insn = 0;
+
 /* Remove from AV_VLIW_P all instructions but next when debug counter
    tells us so.  Next instruction is fetched from BNDS.  */
 static void
 remove_insns_for_debug (blist_t bnds, av_set_t *av_vliw_p)
 {
-  if (! dbg_cnt (sel_sched_insn_cnt))
+  if (! dbg_cnt (sel_sched_insn_cnt) || force_next_insn)
     /* Leave only the next insn in av_vliw.  */
     {
       av_set_iterator av_it;
@@ -7642,7 +7646,13 @@  sel_sched_region (int rgn)
     sel_sched_region_1 ();
   else
     /* Force initialization of INSN_SCHED_CYCLEs for correct bundling.  */
-    reset_sched_cycles_p = true;
+    {
+      reset_sched_cycles_p = false;
+      pipelining_p = false;
+      force_next_insn = 1;
+      sel_sched_region_1 ();
+      force_next_insn = 0;
+    }

   sel_region_finish (reset_sched_cycles_p);
 }
diff --git a/gcc/testsuite/gcc.dg/pr83530.c b/gcc/testsuite/gcc.dg/pr83530.c
new file mode 100644
index 00000000000..f4d8927de92
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr83530.c
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fmodulo-sched -fselective-scheduling2" } */
+int vm, z0;
+short int mz;
+
+int
+ny (void)
+{
+  int ch;
+
+  for (ch = 0; ch < 6; ++ch)
+    vm += ch / vm;
+
+  return z0 + mz;
+}