2011/6/9 Georg-Johann Lay <[email protected]>:
> This is a tentative patch to fix PR46779 and hopefully also related
> issues like PR45291.
>
- /* Disallow QImode in stack pointer regs. */
- if ((regno == REG_SP || regno == (REG_SP + 1)) && mode == QImode)
+ /* Don't allocate data to non-GENERAL_REGS registers. */
+
+ if (regno >= 32)
return 0;
I think that we not need in this code.
GCC core must bother about this.
+
+ if (GET_MODE_SIZE (mode) == 1)
return 1;
I'm agree with this.
+
+ /* Disallow big registers that overlap the frame pointer.
+ This will hopefully reduce the number of spill failures. */
+
+ if (GET_MODE_SIZE (mode) > 2
+ && regno <= REG_Y
+ && regno + GET_MODE_SIZE (mode) >= REG_Y + 1)
+ {
+ return 0;
+ }
Fragment from GCC info:
--------------------------------------
HARD_REGNO_MODE_OK (regno, mode)A C expression that is nonzero if it
is permissible to store a value of mode mode in hard register number
regno (or in several registers starting with that one). For a machine
where all registers are equivalent, a suitable definition is
#define HARD_REGNO_MODE_OK(REGNO, MODE) 1
You need not include code to check for the numbers of fixed registers,
because the allocation mechanism considers them to be always occupied.
-----------------------------------------
Again, GCC core must bother about this.
- /* Otherwise disallow all regno/mode combinations that span r28:r29. */
- if (regno <= (REG_Y + 1) && (regno + GET_MODE_SIZE (mode)) >= (REG_Y + 1))
- return 0;
-
- if (mode == QImode)
- return 1;
-
- /* Modes larger than QImode occupy consecutive registers. */
- if (regno + GET_MODE_SIZE (mode) > FIRST_PSEUDO_REGISTER)
- return 0;
-
This is a right change.
Denis.