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

--- Comment #10 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
So I think the wrong code is due to reload NOT being able to handle:
(mem/f:HI (post_inc:HI (reg:HI 26 [ ivtmp.10 ])) [1 MEM[(int (*<T2da>) (int)
*)_18]+0 S2 A16])


That is if you look at:
```
void f3(int x, int (*p3 []) (int))
{
  int i;
  int next = x;
  for (i = 0; i < x; i++)
    next = p3[0](next);
}

```

IRA produces:
```
      Popping a3(r30,l0)  --         assign reg 13
```

For:
```
(call_insn 14 13 28 3 (set (reg:HI 12 R12)
        (call:HI (mem:HI (mem/f:HI (reg/f:HI 30 [ p3 ]) [1 *p3_7(D)+0 S2 A16])
[0 *_1 S2 A16])
            (const_int 0 [0]))) "t.c":7:12 89 {call_value_internal}
     (expr_list:REG_CALL_DECL (nil)
        (nil))
    (expr_list:HI (use (reg:HI 12 R12))
        (nil)))

```

Which reload is able to handle:
```
.L2:
        CMP.W   2(R1), R10 { JL .L3
        ; start of epilogue
        ADD.W   #4, R1
        POPM.W  #1, r10
        RET
.L3:
        MOV.W   R13, @R1 ;;;<<< store
        MOV.W   @R13, R14
        CALL    R14
        ADD.W   #1, R10
        MOV.W   @R1, R13 ;; << load
        BR      #.L2
```


BUT then again this is less than optimal here. because we are doing the
save/restore of r13 around the function call.

Reply via email to