Extracted from
http://embed.cs.utah.edu/embarrassing/dec_09/harvest/gcc-head_llvm-gcc-head/

I've seen this in multiple examples both compared to llvm and icc.
The other compilers merge adjacent stores to structures in memory,
gcc doesn't.

Simple toy example:

struct foo { 
        short a;
        char c;
        char d;
        int x;
};

void f(struct foo *f)
{
        f->a = 1;
        f->c = 0;
        f->d = 1;
        f->x = 0;
}


generates with -O2 -S -mtune=generic 4.5.0 20091219

 movw    $1, (%rdi)
 movb    $0, 2(%rdi)
 movb    $1, 3(%rdi)
 movl    $0, 4(%rdi)

but since everything is aligned it could be just (from icc)

   movl      $16777217, (%rdi)                             #11.2
   movl      $0, 4(%rdi)                                   #14.2

(possibly even a single movq, exploiting CPUs with very fast misalignment
support like Nehalem)


-- 
           Summary: no store merging for structure stores
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: andi-gcc at firstfloor dot org
  GCC host triplet: x86_64-linux
GCC target triplet: x86_64-linux


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

Reply via email to