https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118591

--- Comment #2 from Georg-Johann Lay <gjl at gcc dot gnu.org> ---
(In reply to Georg-Johann Lay from comment #1)
> Created attachment 60230 [details]
> reduced C99 test case

In that test case:

__attribute__((noipa))
void func2 (long a, long b)
{
  static unsigned char count = 0;
  if (b != count++)
    __builtin_abort ();
}

int main (void)
{
  for (long b = 0; b < 5; ++b)
    func2 (0, b);

  return 0;
}

With -mlra -Os -mmcu=attiny40 -dp, main prepares argument b as follows (it
lives in Y[1]:SI):

        subi r28,-4      ;  48  [c=8 l=2]  *addhi3/3
        sbci r29,-1
        ld r20,Y                 ;  49  [c=4 l=1]  movqi_insn/3
        push r20                 ;  8   [c=4 l=1]  pushqi1/0
        ld r20,Y                 ;  53  [c=4 l=1]  movqi_insn/3
        push r20                 ;  10  [c=4 l=1]  pushqi1/0
        ld r20,Y                 ;  57  [c=4 l=1]  movqi_insn/3
        push r20                 ;  12  [c=4 l=1]  pushqi1/0
        ld r20,Y+                ;  96  [c=4 l=1]  movqi_insn/3
        push r20                 ;  14  [c=4 l=1]  pushqi1/0

which is complete garbage and looks like elimination going bananas.  With
-mno-lra, all is fine:

        subi r28,-4      ;  47  [c=8 l=2]  *addhi3/3
        sbci r29,-1
        ld r20,Y                 ;  48  [c=4 l=1]  movqi_insn/3
        push r20                 ;  8   [c=4 l=1]  pushqi1/0
        ld r21,-Y                ;  91  [c=4 l=1]  movqi_insn/3
        push r21                 ;  10  [c=4 l=1]  pushqi1/0
        ld r22,-Y                ;  93  [c=4 l=1]  movqi_insn/3
        push r22                 ;  12  [c=4 l=1]  pushqi1/0
        ld r23,-Y                ;  95  [c=4 l=1]  movqi_insn/3
        push r23                 ;  14  [c=4 l=1]  pushqi1/0

(FYI, the FP in Y is adjusted later (after the call) due to -mfuse-add, which
also tidies the byte loads to LD -Y.)

Reply via email to