[Bug middle-end/21990] Wrong code for 4.0 and head: Reload clobbers the frame pointer by using it as spill register without recognizing the clobbering
bjoern dot m dot haase at web dot de
gcc-bugzilla@gcc.gnu.org
Sun Sep 4 10:35:00 GMT 2005
------- Additional Comments From bjoern dot m dot haase at web dot de 2005-09-04 10:35 -------
Indeed IMHO the problem stems from the patch:
+2005-01-22 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/19378
+ * config/avr/avr.c (avr_hard_regno_mode_ok): Rewrite.
+
IMO the problem stems from the change
- /* Reload can use r28:r29 for reload register and for frame pointer
- in one insn. It's wrong. We must disable it. */
- if (mode != Pmode && reload_in_progress && frame_pointer_required_p ()
- && regno <= REG_Y && (regno + GET_MODE_SIZE (mode)) >= (REG_Y + 1))
+ /* 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;
Denis Chertykov's older version using "frame_pointer_required_p ()" has now
vanished. A problem during register allocation has been removed by Roger
Sayle's patch. However, the old frame pointer bug has been re-introduced.
My suggestion is to use the following implementation. (according patch to
today's head attached) This patch has passed regression tests on head without
new regressions on head on the c-testsuite for compilation and simulator
excecution for the atmega128.
I also verified on an old snapshot that had exposed PR21990 that this patch
resolves PR21990.
I'll post this message also on gcc-patches.
Yours,
Bjoern
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21990
More information about the Gcc-bugs
mailing list