diff mbox

[AVR] : Fix PR target/50289

Message ID 4E64995A.5020406@gjlay.de
State New
Headers show

Commit Message

Georg-Johann Lay Sept. 5, 2011, 9:41 a.m. UTC
PR50289 is a minor issue with -mcall-prologues and global register variables
resp. fixed registers: Such registers shall be omitted in function
prologue/epilogue.

For test program

void bar (long long, long long, void*);

register char x asm ("7");

void foo (char a)
{
    asm volatile ("":::"6");
    bar (0, 0, &a);
}


however, avr.c:sequent_regs_live() generates a register sequence that covers
fixed R7, i.e. prologue saves R7...R17, Y and reads

foo:
    ldi r26,lo8(1)
    ldi r27,hi8(1)
    ldi r30,lo8(gs(1f))
    ldi r31,hi8(gs(1f))
    rjmp __prologue_saves__+((18 - 13) * 2)
1:
/* prologue: function */

With the patch no sequences are generated that contain fixed regsisters, i.e.
prologue for the example reads now

foo:
	push r6	 ;  31	pushqi1/1	[length = 1]
	push r8	 ;  32	pushqi1/1	[length = 1]
	push r9	 ;  33	pushqi1/1	[length = 1]
	push r10	 ;  34	pushqi1/1	[length = 1]
	push r11	 ;  35	pushqi1/1	[length = 1]
	push r12	 ;  36	pushqi1/1	[length = 1]
	push r13	 ;  37	pushqi1/1	[length = 1]
	push r14	 ;  38	pushqi1/1	[length = 1]
	push r15	 ;  39	pushqi1/1	[length = 1]
	push r16	 ;  40	pushqi1/1	[length = 1]
	push r17	 ;  41	pushqi1/1	[length = 1]
	push r28	 ;  42	pushqi1/1	[length = 1]
	push r29	 ;  43	pushqi1/1	[length = 1]
	push __tmp_reg__	 ;  47	*addhi3_sp_R_pc2	[length = 1]
	in r28,__SP_L__	 ;  48	*movhi_sp/2	[length = 2]
	in r29,__SP_H__
/* prologue: function */

Ok to install?

Johann

	PR target/50289
	* config/avr/avr.c (sequent_regs_live): Don't recognize sequences
	that contain global register variable.
diff mbox

Patch

Index: config/avr/avr.c
===================================================================
--- config/avr/avr.c	(revision 178525)
+++ config/avr/avr.c	(working copy)
@@ -522,6 +522,17 @@  sequent_regs_live (void)
 
   for (reg = 0; reg < 18; ++reg)
     {
+      if (fixed_regs[reg])
+        {
+          /* Don't recognize sequences that contain global register
+             variables.  */
+      
+          if (live_seq != 0)
+            return 0;
+          else
+            continue;
+        }
+      
       if (!call_used_regs[reg])
 	{
 	  if (df_regs_ever_live_p (reg))