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.
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))

Reply via email to