public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/55160] New: [4.8 Regression] Counterproductive loop induction variable optimization
@ 2012-11-01  1:41 olegendo at gcc dot gnu.org
  2012-11-01  6:28 ` [Bug rtl-optimization/55160] " amylaar at gcc dot gnu.org
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: olegendo at gcc dot gnu.org @ 2012-11-01  1:41 UTC (permalink / raw)
  To: gcc-bugs


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55160

             Bug #: 55160
           Summary: [4.8 Regression] Counterproductive loop induction
                    variable optimization
    Classification: Unclassified
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: olegendo@gcc.gnu.org
                CC: amylaar@gcc.gnu.org
            Target: sh*-*-* arm*-*-*


Starting with rev 192505 the following

int test_04 (int* x, int c)
{
  int s = 0;
  for (int i = 0; i < c; ++i)
    s += *--x;
  return s;
}

gets compiled to (SH, -O2 -m4 -ml):

        cmp/pl  r5
        bf/s    .L12
        mov     #0,r1
        mov     #0,r0
.L11:
        add     #-4,r4
        mov.l   @r4,r2
        add     #1,r1
        cmp/eq  r5,r1
        bf/s    .L11
        add     r2,r0
        rts
        nop
.L12:
        rts
        mov     #0,r0

whereas before (also on 4.7.3) it was:
        cmp/pl  r5
        bf/s    .L11
        mov     #0,r0
.L10:
        add     #-4,r4
        mov.l   @r4,r1
        dt      r5
        bf/s    .L10
        add     r1,r0
        rts    
        nop
.L11:
        rts    
        nop

In this case the inner loop code size effectively does not increase, but there
is overhead in setting up the loop.  Similar code is also generated on ARM.


Another similar case:

int test_03 (int* x, int c)
{
  int s = 0;
  for (int i = 0; i < c; ++i)
    s += x[i];
  return s;
}

rev 192505:
        cmp/pl  r5
        bf/s    .L4
        shll2   r5
        add     r4,r5
        mov     #0,r0
.L3:
        mov.l   @r4+,r1
        cmp/eq  r5,r4
        bf/s    .L3
        add     r1,r0
        rts
        nop
.L4:
        rts
        mov     #0,r0


before it was:
        cmp/pl  r5
        bf/s    .L6
        mov     #0,r0
        shll2   r5
        add     #-4,r5
        shlr2   r5
        add     #1,r5
.L3:
        mov.l   @r4+,r1
        dt      r5
        bf/s    .L3
        add     r1,r0
.L6:
        rts    
        nop

In this case, there was the useless loop setup code.  Ideally this should be
something like:

        cmp/pl  r5
        bf/s    .L6
        mov     #0,r0
.L3:
        mov.l   @r4+,r1
        dt      r5
        bf/s    .L3
        add     r1,r0
.L6:
        rts    
        nop

Jörn, I've added you in CC because your commit (rev 192505) seems to have
triggered something there.  I'm not sure whether this is actually the cause for
this counter productive transformation.


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

* [Bug rtl-optimization/55160] [4.8 Regression] Counterproductive loop induction variable optimization
  2012-11-01  1:41 [Bug rtl-optimization/55160] New: [4.8 Regression] Counterproductive loop induction variable optimization olegendo at gcc dot gnu.org
@ 2012-11-01  6:28 ` amylaar at gcc dot gnu.org
  2012-11-01  7:09 ` [Bug target/55160] " amylaar at gcc dot gnu.org
  2012-11-01 21:29 ` olegendo at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: amylaar at gcc dot gnu.org @ 2012-11-01  6:28 UTC (permalink / raw)
  To: gcc-bugs


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55160

--- Comment #1 from Jorn Wolfgang Rennecke <amylaar at gcc dot gnu.org> 2012-11-01 06:28:14 UTC ---
Author: amylaar
Date: Thu Nov  1 06:28:06 2012
New Revision: 193060

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=193060
Log:
        PR target/55160
        * config/sh/sh.md (doloop_end): Use emit_jump_insn.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/sh/sh.md


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

* [Bug target/55160] [4.8 Regression] Counterproductive loop induction variable optimization
  2012-11-01  1:41 [Bug rtl-optimization/55160] New: [4.8 Regression] Counterproductive loop induction variable optimization olegendo at gcc dot gnu.org
  2012-11-01  6:28 ` [Bug rtl-optimization/55160] " amylaar at gcc dot gnu.org
@ 2012-11-01  7:09 ` amylaar at gcc dot gnu.org
  2012-11-01 21:29 ` olegendo at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: amylaar at gcc dot gnu.org @ 2012-11-01  7:09 UTC (permalink / raw)
  To: gcc-bugs


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55160

Jorn Wolfgang Rennecke <amylaar at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Target|sh*-*-* arm*-*-*            |sh*-*-*
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |FIXED

--- Comment #2 from Jorn Wolfgang Rennecke <amylaar at gcc dot gnu.org> 2012-11-01 07:09:25 UTC ---
(In reply to comment #0)
> Starting with rev 192505 the following
> 
> int test_04 (int* x, int c)
> {
>   int s = 0;
>   for (int i = 0; i < c; ++i)
>     s += *--x;
>   return s;
> }
> 
..  
> In this case the inner loop code size effectively does not increase, but there
> is overhead in setting up the loop.  Similar code is also generated on ARM.

In order to get the r192504 arm port to generate a doloop_end pattern,
I have to enable thubm2 support and modulo scheduling, e.g.:
-O2 --std=c99 -mthumb -march=armv7 -fmodulo-sched

with these options, r192505 also gets the doloop_end pattern.
Therefore, I have removed arm from the target list.


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

* [Bug target/55160] [4.8 Regression] Counterproductive loop induction variable optimization
  2012-11-01  1:41 [Bug rtl-optimization/55160] New: [4.8 Regression] Counterproductive loop induction variable optimization olegendo at gcc dot gnu.org
  2012-11-01  6:28 ` [Bug rtl-optimization/55160] " amylaar at gcc dot gnu.org
  2012-11-01  7:09 ` [Bug target/55160] " amylaar at gcc dot gnu.org
@ 2012-11-01 21:29 ` olegendo at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: olegendo at gcc dot gnu.org @ 2012-11-01 21:29 UTC (permalink / raw)
  To: gcc-bugs


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55160

--- Comment #3 from Oleg Endo <olegendo at gcc dot gnu.org> 2012-11-01 21:28:53 UTC ---
Author: olegendo
Date: Thu Nov  1 21:28:49 2012
New Revision: 193071

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=193071
Log:
    PR target/55160
    * gcc.target/sh/pr55160.c: New.


Added:
    trunk/gcc/testsuite/gcc.target/sh/pr55160.c
Modified:
    trunk/gcc/testsuite/ChangeLog


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

end of thread, other threads:[~2012-11-01 21:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-11-01  1:41 [Bug rtl-optimization/55160] New: [4.8 Regression] Counterproductive loop induction variable optimization olegendo at gcc dot gnu.org
2012-11-01  6:28 ` [Bug rtl-optimization/55160] " amylaar at gcc dot gnu.org
2012-11-01  7:09 ` [Bug target/55160] " amylaar at gcc dot gnu.org
2012-11-01 21:29 ` olegendo at gcc dot gnu.org

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).