http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55023
Bug #: 55023 Summary: hppa: wrong code generated with tail call optimisation Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: m...@mansr.com The following code is compiled incorrectly with flags -O2 -fno-inline: the third argument to the tail called function is not computed at all. This problem is present in all versions since 4.3. 4.1 and 4.2 compile it correctly. The error -fno-inline flag is needed to suppress inlining of the called function; when inlined it is compiled correctly. Providing only an external declaration for foo() also gives correct results. ---8<--- typedef long long int64_t; struct foo { int x; int y; }; int64_t foo(int64_t a, int64_t b, int64_t c) { return a + b + c; } int64_t bar(int64_t a, struct foo bq, struct foo cq) { int64_t b = bq.x + bq.y; int64_t c = cq.x + cq.y; return foo(a, b, c); } --->8--- This is the generated code: .align 4 .globl bar .type bar, @function bar: .PROC .CALLINFO FRAME=0,NO_CALLS,SAVE_RP .ENTRY stw %r23,-48(%r30) stw %r24,-44(%r30) ldw -44(%r30),%r28 stw %r2,-20(%r30) ldw -48(%r30),%r24 addl %r24,%r28,%r24 extrs %r24,0,1,%r23 ldw -20(%r30),%r2 bl foo,%r0 nop nop .EXIT .PROCEND