public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/32414]  New: [4.1/4.2 Regression] Poor code for inner loop on i386
@ 2007-06-20  9:21 jakub at gcc dot gnu dot org
  2007-06-20 10:01 ` [Bug target/32414] " rguenth at gcc dot gnu dot org
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: jakub at gcc dot gnu dot org @ 2007-06-20  9:21 UTC (permalink / raw)
  To: gcc-bugs

/* { dg-do compile } */
/* { dg-options "-O2 -m32 -mtune=generic" } */

typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;

extern int get_src_stride(void);
extern int get_dst_stride(void);

void
foo (uint32_t *pSrc, uint32_t *pDst, uint16_t width, uint16_t height)
{
  uint32_t *dstLine;
  register uint32_t *dst;
  uint32_t *srcLine;
  register uint32_t *src;
  int dstStride, srcStride;
  uint16_t w;

  srcStride = get_src_stride ();
  dstStride = get_dst_stride ();
  dstLine = pDst;
  srcLine = pSrc;

  while (height--)
    {
      dst = dstLine;
      dstLine += dstStride;
      src = srcLine;
      srcLine += srcStride;
      w = width;

      while (w--)
        *dst++ = *src++ | 0xFF000000;
    }
}

generates extremely poor code for the inner loop in 4.1 and 4.2:
.L6:
        movl    -16(%ebp), %eax # src,
        subw    $1, -34(%ebp)   #, w
        addl    $4, -16(%ebp)   #, src
        movl    (%eax), %ecx    #,
        movl    -20(%ebp), %eax # dst,
        orl     $-16777216, %ecx        #,
        movl    %ecx, (%eax)    #,
        addl    $4, %eax        #,
        cmpw    $-1, -34(%ebp)  #, w
        movl    %eax, -20(%ebp) #, dst
        je      .L4     #,
        jmp     .L6     #

I believe this has been introduced by the
http://gcc.gnu.org/ml/gcc-patches/2005-07/msg02021.html
patch and fixed by
http://gcc.gnu.org/ml/gcc-patches/2007-01/msg02095.html
on the trunk.  The generated loop isn't perfect on the trunk:
.L4:
        movl    (%ebx), %eax    #* src, tmp82
        addl    $4, %ebx        #, src
        subw    $1, -14(%ebp)   #, w
        orl     $-16777216, %eax        #, tmp82
        movl    %eax, (%edi)    # tmp82,* dst
        addl    $4, %edi        #, dst
        cmpw    $-1, -14(%ebp)  #, w
        je      .L3     #,
        jmp     .L4     #
but still far better than what 4.1 and 4.2 generate.

Slightly modified:
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;

extern int get_src_stride(void);
extern int get_dst_stride(void);

void
foo (uint32_t *pSrc, uint32_t *pDst, uint16_t width, uint16_t height)
{
  uint32_t *dstLine;
  register uint32_t *dst;
  uint32_t *srcLine;
  register uint32_t *src;
  int dstStride, srcStride;
  uint32_t w;

  srcStride = get_src_stride ();
  dstStride = get_dst_stride ();
  dstLine = pDst;
  srcLine = pSrc;

  while (height--)
    {
      dst = dstLine;
      dstLine += dstStride;
      src = srcLine;
      srcLine += srcStride;
      for (w = 0; w < width; w++)
        dst[w] = src[w] | 0xFF000000;
    }
}
generates more compact code:
.L4:
        movl    (%edx,%ecx,4), %eax     #* srcLine, tmp79
        orl     $-16777216, %eax        #, tmp79
        movl    %eax, (%ebx,%ecx,4)     # tmp79,* dstLine
        addl    $1, %ecx        #, w
        cmpl    %esi, %ecx      # width, w
        jae     .L3     #,
        jmp     .L4     #


-- 
           Summary: [4.1/4.2 Regression] Poor code for inner loop on i386
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jakub at gcc dot gnu dot org
GCC target triplet: i386-linux


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


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

* [Bug target/32414] [4.1/4.2 Regression] Poor code for inner loop on i386
  2007-06-20  9:21 [Bug target/32414] New: [4.1/4.2 Regression] Poor code for inner loop on i386 jakub at gcc dot gnu dot org
@ 2007-06-20 10:01 ` rguenth at gcc dot gnu dot org
  2007-07-04  3:30 ` mmitchel at gcc dot gnu dot org
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2007-06-20 10:01 UTC (permalink / raw)
  To: gcc-bugs



-- 

rguenth at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rguenth at gcc dot gnu dot
                   |                            |org
           Keywords|                            |missed-optimization
   Target Milestone|---                         |4.1.3


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


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

* [Bug target/32414] [4.1/4.2 Regression] Poor code for inner loop on i386
  2007-06-20  9:21 [Bug target/32414] New: [4.1/4.2 Regression] Poor code for inner loop on i386 jakub at gcc dot gnu dot org
  2007-06-20 10:01 ` [Bug target/32414] " rguenth at gcc dot gnu dot org
@ 2007-07-04  3:30 ` mmitchel at gcc dot gnu dot org
  2008-07-04 22:15 ` [Bug target/32414] [4.2 " jsm28 at gcc dot gnu dot org
  2009-03-30 22:09 ` jsm28 at gcc dot gnu dot org
  3 siblings, 0 replies; 5+ messages in thread
From: mmitchel at gcc dot gnu dot org @ 2007-07-04  3:30 UTC (permalink / raw)
  To: gcc-bugs



-- 

mmitchel at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P2


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


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

* [Bug target/32414] [4.2 Regression] Poor code for inner loop on i386
  2007-06-20  9:21 [Bug target/32414] New: [4.1/4.2 Regression] Poor code for inner loop on i386 jakub at gcc dot gnu dot org
  2007-06-20 10:01 ` [Bug target/32414] " rguenth at gcc dot gnu dot org
  2007-07-04  3:30 ` mmitchel at gcc dot gnu dot org
@ 2008-07-04 22:15 ` jsm28 at gcc dot gnu dot org
  2009-03-30 22:09 ` jsm28 at gcc dot gnu dot org
  3 siblings, 0 replies; 5+ messages in thread
From: jsm28 at gcc dot gnu dot org @ 2008-07-04 22:15 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #1 from jsm28 at gcc dot gnu dot org  2008-07-04 22:14 -------
Closing 4.1 branch.


-- 

jsm28 at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|[4.1/4.2 Regression] Poor   |[4.2 Regression] Poor code
                   |code for inner loop on i386 |for inner loop on i386
   Target Milestone|4.1.3                       |4.2.5


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


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

* [Bug target/32414] [4.2 Regression] Poor code for inner loop on i386
  2007-06-20  9:21 [Bug target/32414] New: [4.1/4.2 Regression] Poor code for inner loop on i386 jakub at gcc dot gnu dot org
                   ` (2 preceding siblings ...)
  2008-07-04 22:15 ` [Bug target/32414] [4.2 " jsm28 at gcc dot gnu dot org
@ 2009-03-30 22:09 ` jsm28 at gcc dot gnu dot org
  3 siblings, 0 replies; 5+ messages in thread
From: jsm28 at gcc dot gnu dot org @ 2009-03-30 22:09 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #2 from jsm28 at gcc dot gnu dot org  2009-03-30 22:09 -------
Closing 4.2 branch, fixed in 4.3.


-- 

jsm28 at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
      Known to fail|                            |4.2.5
      Known to work|                            |4.3.0
         Resolution|                            |FIXED
   Target Milestone|4.2.5                       |4.3.0


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


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

end of thread, other threads:[~2009-03-30 22:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-06-20  9:21 [Bug target/32414] New: [4.1/4.2 Regression] Poor code for inner loop on i386 jakub at gcc dot gnu dot org
2007-06-20 10:01 ` [Bug target/32414] " rguenth at gcc dot gnu dot org
2007-07-04  3:30 ` mmitchel at gcc dot gnu dot org
2008-07-04 22:15 ` [Bug target/32414] [4.2 " jsm28 at gcc dot gnu dot org
2009-03-30 22:09 ` jsm28 at gcc dot gnu dot 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).