http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54019

             Bug #: 54019
           Summary: [SH] Tail calls with -fPIC use bsrf instead of braf
    Classification: Unclassified
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: target
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: olege...@gcc.gnu.org
            Target: sh*-*-*


The following function:

int a, b;

int bleh (int x, int y);

int foo (void)
{
  return bleh (a + b, a - b);
}

compiled with -m4 -O2 -ml -fPIC:

        mov.l   r12,@-r15       ! 42    movsi_ie/11    [length = 2]
        mova    .L3,r0          ! 44    mova    [length = 2]
        mov.l   .L3,r12         ! 45    movsi_ie/1    [length = 2]
        sts.l   pr,@-r15        ! 43    movsi_ie/13    [length = 2]
        add     r0,r12          ! 46    *addsi3_compact    [length = 2]
        mov.l   .L4,r0          ! 5    movsi_ie/1    [length = 2]
        mov.l   @(r0,r12),r2    ! 7    movsi_ie/7    [length = 2]
        mov.l   .L5,r0          ! 34    movsi_ie/1    [length = 2]
        mov.l   @r2,r5          ! 8    movsi_ie/7    [length = 2]
        mov.l   @(r0,r12),r1    ! 11    movsi_ie/7    [length = 2]
        mov     r5,r4           ! 37    movsi_ie/2    [length = 2]
        mov.l   @r1,r1          ! 12    movsi_ie/7    [length = 2]
        add     r1,r4           ! 15    *addsi3_compact    [length = 2]
        sub     r1,r5           ! 16    *subsi3_internal    [length = 2]
        mov.l   .L6,r1          ! 39    movsi_ie/1    [length = 2]
        bsrf    r1              ! 41    call_valuei_pcrel    [length = 4]
.LPCS0:
        nop
        lds.l   @r15+,pr        ! 55    movsi_ie/17    [length = 2]
        rts                     ! 58    *return_i    [length = 2]
        mov.l   @r15+,r12       ! 56    movsi_ie/7    [length = 2]
.L7:
        .align 2
.L3:
        .long   _GLOBAL_OFFSET_TABLE_
.L4:
        .long   _a@GOT
.L5:
        .long   _b@GOT
.L6:
    .long   __Z4blehii@PLT-(.LPCS0+2-.)
    .cfi_endproc

Instead of 'bsrf' the 'braf' instruction could be used.
Maybe this is a side effect of PR 12306.

Reply via email to