On 06.04.2018 19:10, Alexander Monakov wrote:
> On Tue, 3 Apr 2018, Andrey Belevantsev wrote:
> 
>> Hello,
>>
>> This issue ended up being fixed the way different from described in the PR.
>>  We do not want to walk away from the invariant "zero SCHED_TIMES -- insn
>> is not scheduled" even for bookkeeping copies (testing showed it trips over
>> asserts designed to catch this).  Rather we choose merging exprs in the way
>> the larger sched-times wins.
> 
> My understanding is this is not a "complete" solution to the problem, and a
> chance for a similar blowup on some other testcase remains. Still, avoiding
> picking the minimum sched-times value should be a good mitigation.

Well, it's not much different with any other situation when we pose a limit
on pipelining with the sched-times values.  At least for now I can't think
of something better.

Adjusted the comment as per your suggestion and committed the attached patch.

Andrey

> 
> Please consider adding a comment that the average sched-times value is taken
> as a compromise to thwart "endless" pipelining of bookkeeping-producing insns
> available anywhere vs. pipelining of useful insns, or something like that?
> 
> OK with that considered/added.
> 
>>
>> Best,
>> Andrey
>>
>> 2018-04-03  Andrey Belevantsev  <a...@ispras.ru>
>>
>>      PR rtl-optimization/83913
>>
>>      * sel-sched-ir.c (merge_expr_data): Choose the middle between two
>> different sched-times
>>      when merging exprs.
>>
>>      * gcc.dg/pr83913.c: New test.
>>
>> diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
>> index a965d2ec42f..f6de96a7f3d 100644
>> --- a/gcc/sel-sched-ir.c
>> +++ b/gcc/sel-sched-ir.c
>> @@ -1837,8 +1837,9 @@ merge_expr_data (expr_t to, expr_t from, insn_t
>> split_point)
>>    if (EXPR_PRIORITY (to) < EXPR_PRIORITY (from))
>>      EXPR_PRIORITY (to) = EXPR_PRIORITY (from);
>>
>> -  if (EXPR_SCHED_TIMES (to) > EXPR_SCHED_TIMES (from))
>> -    EXPR_SCHED_TIMES (to) = EXPR_SCHED_TIMES (from);
>> +  if (EXPR_SCHED_TIMES (to) != EXPR_SCHED_TIMES (from))
>> +    EXPR_SCHED_TIMES (to) = ((EXPR_SCHED_TIMES (from) + EXPR_SCHED_TIMES 
>> (to)
>> +                             + 1) / 2);
>>
>>    if (EXPR_ORIG_BB_INDEX (to) != EXPR_ORIG_BB_INDEX (from))
>>      EXPR_ORIG_BB_INDEX (to) = 0;
>> @@ -3293,11 +3294,22 @@ has_dependence_note_mem_dep (rtx mem 
>> ATTRIBUTE_UNUSED,
>>
>>  /* Note a dependence.  */
>>  static void
>> diff --git a/gcc/testsuite/gcc.dg/pr83913.c b/gcc/testsuite/gcc.dg/pr83913.c
>> new file mode 100644
>> index 00000000000..c898d71a261
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.dg/pr83913.c
>> @@ -0,0 +1,26 @@
>> +/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
>> +/* { dg-options "-O2 -funroll-all-loops -fselective-scheduling
>> -fsel-sched-pipelining -fschedule-insns -fno-dce -fno-forward-propagate
>> -fno-rerun-cse-after-loop -fno-web" } */
>> +
>> +int jo, z4;
>> +
>> +int
>> +be (long unsigned int l7, int nt)
>> +{
>> +  int en;
>> +
>> +  jo = l7;
>> +  for (en = 0; en < 24; ++en)
>> +    {
>> +      jo = (jo / z4) * (!!jo >= ((!!nt) & 2));
>> +      if (jo == 0)
>> +        nt = 0;
>> +      else
>> +        {
>> +          nt = z4;
>> +          ++z4;
>> +          nt = (long unsigned int) nt == (l7 + 1);
>> +        }
>> +    }
>> +
>> +  return nt;
>> +}
>>
>>
>>

Index: gcc/ChangeLog
===================================================================
*** gcc/ChangeLog       (revision 259229)
--- gcc/ChangeLog       (revision 259230)
***************
*** 1,5 ****
--- 1,12 ----
  2018-04-09  Andrey Belevantsev  <a...@ispras.ru>
  
+       PR rtl-optimization/83913
+ 
+       * sel-sched-ir.c (merge_expr_data): Choose the middle between two
+       different sched-times when merging exprs.
+ 
+ 2018-04-09  Andrey Belevantsev  <a...@ispras.ru>
+ 
        PR rtl-optimization/83962
  
        * sel-sched-ir.c (tidy_control_flow): Correct the order in which we call
Index: gcc/testsuite/gcc.dg/pr83913.c
===================================================================
*** gcc/testsuite/gcc.dg/pr83913.c      (revision 0)
--- gcc/testsuite/gcc.dg/pr83913.c      (revision 259230)
***************
*** 0 ****
--- 1,26 ----
+ /* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+ /* { dg-options "-O2 -funroll-all-loops -fselective-scheduling 
-fsel-sched-pipelining -fschedule-insns -fno-dce -fno-forward-propagate 
-fno-rerun-cse-after-loop -fno-web" } */
+ 
+ int jo, z4;
+ 
+ int
+ be (long unsigned int l7, int nt)
+ {
+   int en;
+ 
+   jo = l7;
+   for (en = 0; en < 24; ++en)
+     {
+       jo = (jo / z4) * (!!jo >= ((!!nt) & 2));
+       if (jo == 0)
+         nt = 0;
+       else
+         {
+           nt = z4;
+           ++z4;
+           nt = (long unsigned int) nt == (l7 + 1);
+         }
+     }
+ 
+   return nt;
+ }
Index: gcc/testsuite/ChangeLog
===================================================================
*** gcc/testsuite/ChangeLog     (revision 259229)
--- gcc/testsuite/ChangeLog     (revision 259230)
***************
*** 1,5 ****
--- 1,10 ----
  2018-04-09  Andrey Belevantsev  <a...@ispras.ru>
  
+       PR rtl-optimization/83913
+       * gcc.dg/pr83913.c: New test.
+ 
+ 2018-04-09  Andrey Belevantsev  <a...@ispras.ru>
+ 
        PR rtl-optimization/83962
        * gcc.dg/pr83962.c: New test.
  
Index: gcc/sel-sched-ir.c
===================================================================
*** gcc/sel-sched-ir.c  (revision 259229)
--- gcc/sel-sched-ir.c  (revision 259230)
*************** merge_expr_data (expr_t to, expr_t from,
*** 1837,1844 ****
    if (EXPR_PRIORITY (to) < EXPR_PRIORITY (from))
      EXPR_PRIORITY (to) = EXPR_PRIORITY (from);
  
!   if (EXPR_SCHED_TIMES (to) > EXPR_SCHED_TIMES (from))
!     EXPR_SCHED_TIMES (to) = EXPR_SCHED_TIMES (from);
  
    if (EXPR_ORIG_BB_INDEX (to) != EXPR_ORIG_BB_INDEX (from))
      EXPR_ORIG_BB_INDEX (to) = 0;
--- 1837,1848 ----
    if (EXPR_PRIORITY (to) < EXPR_PRIORITY (from))
      EXPR_PRIORITY (to) = EXPR_PRIORITY (from);
  
!   /* We merge sched-times half-way to the larger value to avoid the endless
!      pipelining of unneeded insns.  The average seems to be good compromise
!      between pipelining opportunities and avoiding extra work.  */
!   if (EXPR_SCHED_TIMES (to) != EXPR_SCHED_TIMES (from))
!     EXPR_SCHED_TIMES (to) = ((EXPR_SCHED_TIMES (from) + EXPR_SCHED_TIMES (to)
!                              + 1) / 2);
  
    if (EXPR_ORIG_BB_INDEX (to) != EXPR_ORIG_BB_INDEX (from))
      EXPR_ORIG_BB_INDEX (to) = 0;

Reply via email to