re PR target/10177 (VRsave mask wrong)

2002-03-31  Segher Boessenkool  <segher@koffie.nl>

        PR target/10177
        * config/rs6000/rs6000.h (HARD_REGNO_RENAME_OK): New.
        * config/rs6000/rs6000.c (compute_vrsave_mask):
        Don't mark all call-clobbered registers as used.

From-SVN: r65092
This commit is contained in:
Segher Boessenkool 2003-03-31 19:46:57 +02:00 committed by Aldy Hernandez
parent 7f1fc38ea4
commit c8ae788f59
3 changed files with 13 additions and 13 deletions

View File

@ -1,3 +1,10 @@
2002-03-31 Segher Boessenkool <segher@koffie.nl>
PR target/10177
* config/rs6000/rs6000.h (HARD_REGNO_RENAME_OK): New.
* config/rs6000/rs6000.c (compute_vrsave_mask): Don't mark
all call-clobbered registers as used.
2003-03-31 Michael Matz <matz@suse.de>
* cppexp.c (cpp_classify_number): Accept '.' after "0x".

View File

@ -9021,19 +9021,6 @@ compute_vrsave_mask ()
if (mask == 0)
return mask;
/* Next, add all registers that are call-clobbered. We do this
because post-reload register optimizers such as regrename_optimize
may choose to use them. They never change the register class
chosen by reload, so cannot create new uses of altivec registers
if there were none before, so the early exit above is safe. */
/* ??? Alternately, we could define HARD_REGNO_RENAME_OK to disallow
altivec registers not saved in the mask, which might well make the
adjustments below more effective in eliding the save/restore of
VRSAVE in small functions. */
for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
if (call_used_regs[i])
mask |= ALTIVEC_REG_BIT (i);
/* Next, remove the argument registers from the set. These must
be in the VRSAVE mask set by the caller, so we don't need to add
them in again. More importantly, the mask we compute here is

View File

@ -961,6 +961,12 @@ extern int rs6000_default_long_calls;
? ALTIVEC_VECTOR_MODE (MODE1) \
: 1)
/* Post-reload, we can't use any new AltiVec registers, as we already
emitted the vrsave mask. */
#define HARD_REGNO_RENAME_OK(SRC, DST) \
(! ALTIVEC_REGNO_P (DST) || regs_ever_live[DST])
/* A C expression returning the cost of moving data from a register of class
CLASS1 to one of CLASS2. */