--- Comment #10 from law at redhat dot com 2010-02-25 18:49 ---
Fixed long ago. Code looks reasonably efficient with trunk.
--
law at redhat dot com changed:
What|Removed |Added
-
--- Comment #9 from vmakarov at gcc dot gnu dot org 2009-07-22 22:00
---
Subject: Bug 37488
Author: vmakarov
Date: Wed Jul 22 22:00:17 2009
New Revision: 149962
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=149962
Log:
2009-07-22 Vladimir Makarov
PR target/37488
--- Comment #8 from vmakarov at redhat dot com 2009-06-30 21:49 ---
I've checked gcc4.3. It has the same problem. So the reason is not only in
the chosen register class. The both RAs make the pseudo in question
conflicting with all call clobbered hard-regs because it leaves on abnorma
--- Comment #7 from vmakarov at redhat dot com 2009-06-29 19:44 ---
Paolo, Steven, thanks for looking into this problem. Using the mips approach
is a good idea. Although the costs of FLOAT_REGS and SSE_REGS are the same in
ira-costs.c, IRA should prefer SSE_REGS or FLOAT_REGS depending
--- Comment #6 from steven at gcc dot gnu dot org 2009-06-22 22:23 ---
Vlad, what can we do with IRA to make it choose a better regclass here? Maybe
do something similar to what MIPS does, changing IRA_COVER_CLASSES for i386
depending on target options?
--
http://gcc.gnu.org/bugzil
--- Comment #5 from bonzini at gnu dot org 2009-02-04 16:31 ---
The old register allocator chose
Register 59 pref FLOAT_SSE_REGS or none
but that is not a cover class.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37488
--- Comment #4 from bonzini at gnu dot org 2009-02-04 16:22 ---
We get a wrong choice of class
a1 (r59,l0) best FLOAT_REGS, cover FLOAT_REGS
(remember this is with -mfpmath=sse) despite the preferred reload class is
indeed SSE_REGS.
But then, we get the spill even without SSE math
--- Comment #3 from bonzini at gnu dot org 2009-02-04 16:03 ---
requires computed gotos and floats, even smaller testcase
void test(char *ip, double *reg_f)
{
static void * const addrs[] = {&&L1, &&L2};
double reg_f_a;
reg_f_a = 0.0;
goto *addrs[*++ip];
L1: reg_f_a = reg_f[*++
--- Comment #2 from bonzini at gnu dot org 2009-02-04 15:57 ---
minimized testcase:
void test(char *ip, double *reg_f)
{
static void * const addrs[] = {&&L1, &&L2};
double reg_f_a;
reg_f_a = 0.0;
goto *addrs[*++ip];
L1:
reg_f_a += reg_f[*++ip];