https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87565
Bug ID: 87565 Summary: suboptimal memory-indirect tailcalls on arm Product: gcc Version: 9.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: amonakov at gcc dot gnu.org Target Milestone: --- Target: arm-*-* When tailcalling via a pointer that needs to be loaded from memory, gcc could use 'ldr pc, [...]' instead of an ldr-bx sequence. void foo(int a, int b, void (*p[])(int, int)) { p[1](a, b); } I see at -Os foo: ldr r3, [r2, #4] bx r3 @ indirect register sibling call But afaict this could be simply foo: ldr pc, [r2, #4] (x86 has memory-indirect jumps too and there GCC gets this right via dedicated sibcall patterns)