[Bug rtl-optimization/31455] New: [4.3 Regression] lower subreg causes a performance regression in the inner loop sometimes
pinskia at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Tue Apr 3 05:02:00 GMT 2007
Testcase:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 256*1024*1024
float *data;
static inline
double one()
{
int i;
double sum;
sum = 0;
for (i=0; i<SIZE; i++)
sum += data[i];
return sum;
}
int f(double);
int main(int argc,char** argv)
{
struct timeval tv0,tv1;
double s0,s1;
int i;
data = malloc(SIZE*sizeof(float));
for (i=0; i<SIZE; i++)
data[i] = 1;
s0 = 0;
for (i=0; i<SIZE; i++)
s0 += data[i];
printf("%f\n", s0);
s1 = one();
printf("%f\n", s1);
free(data);
return 0;
}
--------------
At -O2 -static on powerpc-darwin, we get an inner loop with:
L6:
lfsx f0,r2,r9
addi r2,r2,4
lfd f13,56(r1)
fadd f13,f13,f0
stfd f13,56(r1)
bdnz L6
That is storing to the stack, with -O2 -fno-split-wide-types, we get the
correct thing:
L6:
lfsx f0,r2,r9
addi r2,r2,4
fadd f13,f13,f0
bdnz L6
In a way this is caused by how we expand the var-args function call:
(insn 90 89 91 7 (set (subreg:DF (reg:DI 183) 0)
(reg/v:DF 158 [ s0 ])) -1 (nil)
(nil))
(insn 91 90 92 7 (set (reg:DI 184)
(reg:DI 183)) -1 (nil)
(nil))
(insn 92 91 93 7 (set (reg:DI 185)
(reg:DI 183)) -1 (nil)
(nil))
(insn 93 92 94 7 (set (reg:DF 186)
(subreg:DF (reg:DI 184) 0)) -1 (nil)
(nil))
(insn 94 93 95 7 (set (reg:DF 187)
(subreg:DF (reg:DI 185) 0)) -1 (nil)
(nil))
(insn 96 95 97 7 (set (reg:DF 4 r4)
(reg:DF 186)) -1 (nil)
(nil))
(insn 97 96 98 7 (set (reg:DF 33 f1)
(reg:DF 187)) -1 (nil)
(nil))
And how lower subreg comes a long and splits the sub regs of DI up.
--
Summary: [4.3 Regression] lower subreg causes a performance
regression in the inner loop sometimes
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Keywords: missed-optimization, ra
Severity: normal
Priority: P3
Component: rtl-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: pinskia at gcc dot gnu dot org
GCC target triplet: powerpc-apple-darwin
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31455
More information about the Gcc-bugs
mailing list