This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug tree-optimization/32964] New: union cause ineffient code inside loops


Testcase:
union A
{
 float a;
};
float t(float a)
{
  union A a1, a2, a3;
  a1.a = a;
  for(int i =0;i<100;i++)
  {
  a2 = a1;
  a2.a += a;
  a1 = a2;
  }
  a3 = a1;
  return a3.a;
}

--------------
We currently get on powerpc-linux-gnu in the inner loop:
.L2:
        stw 0,8(1)
        lfs 0,8(1)
        fadds 0,1,0
        stfs 0,8(1)
        lwz 0,8(1)
        bdnz .L2

Notice how we are storing and loading from the same address twice in the loop.
That is bad news for the Cell.
This also happens on x86:
.L2:
        flds    -4(%ebp)  <--- load a1.a
        addl    $1, %eax
        fadd    %st(1), %st
        cmpl    $100, %eax
        fstps   -8(%ebp)   <--- store a2.a
        movl    -8(%ebp), %edx  <--- load a2.a
        movl    %edx, -4(%ebp)  <--- store a1.a
        jne     .L2


-- 
           Summary: union cause ineffient code inside loops
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: pinskia at gcc dot gnu dot org


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]