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

--- Comment #187 from Kazumoto Kojima <kkojima at gcc dot gnu.org> ---
Created attachment 58989
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=58989&action=edit
a testcase for wrong code which is pre-processed gcc/gimple-fold.cc

One other segfault is seen when compiling libgcc/libgcov-driver.c. 
It seems that gcc/gimple-fold.cc: fold_const_aggregate_ref_1(tree_node*,
tree_node* (*)(tree_node*)) is miscompiled with -O2 -mlra.  The asm code
sequences in question are

[-O2 -mno-lra]
        ...
        mov.l   .L13907,r1      ! 2387  [c=10 l=2]  movsi_ie/0
        mov     #0,r6   ! 2383  [c=4 l=2]  movsi_ie/2
        mov.l   r3,@(4,r0)      ! 542   [c=4 l=2]  movsi_ie/8
        mov.l   r5,@(8,r0)      ! 546   [c=4 l=2]  movsi_ie/8
        mov     #96,r0  ! 2385  [c=4 l=2]  movsi_ie/2
        mov.l   r3,@(8,r15)     ! 556   [c=4 l=2]  movsi_ie/8
        mov.l   r5,@(4,r15)     ! 558   [c=4 l=2]  movsi_ie/8
        mov.l   r3,@r15 ! 560   [c=4 l=2]  movsi_ie/8
        mov.l   r6,@(16,r15)    ! 552   [c=4 l=2]  movsi_ie/8
        mov.l   r6,@(12,r15)    ! 554   [c=4 l=2]  movsi_ie/8
        mov.l   @(r0,r15),r6    ! 563   [c=3 l=2]  movsi_ie/5
        mov.l   @(56,r15),r5    ! 564   [c=1 l=2]  movsi_ie/5
        jsr     @r1     ! 566   [c=5 l=2]  call_valuei
        mov.l   @(60,r15),r4    ! 565   [c=1 l=2]  movsi_ie/5
        mov.l   @(60,r15),r10   ! 2388  [c=1 l=2]  movsi_ie/5
        mov     r0,r7   ! 1828  [c=4 l=2]  movsi_ie/1
        mov.l   @(56,r15),r4    ! 576   [c=1 l=2]  movsi_ie/5
        mov.l   r0,@(16,r10)    ! 570   [c=4 l=2]  movsi_ie/8
        mov     r10,r5  ! 577   [c=4 l=2]  movsi_ie/1
        mov.l   .L13908,r10     ! 2389  [c=10 l=2]  movsi_ie/0
        jsr     @r10    ! 579   [c=1 l=2]  block_lump_real_i4/0
        mov     #1,r6   ! 578   [c=4 l=2]  movsi_ie/2

[-O2 -mlra]
        ...
        mov.l   .L13994,r14     ! 2172  [c=10 l=2]  movsi_ie/0
        mov.l   r0,@(16,r10)    ! 524   [c=4 l=2]  movsi_ie/8
        mov     #1,r6   ! 532   [c=4 l=2]  movsi_ie/2
        mov.l   r0,@(56,r15)    ! 2562  [c=4 l=2]  movsi_ie/8
        jsr     @r14    ! 533   [c=1 l=2]  block_lump_real_i4/0
        mov     r10,r5  ! 531   [c=4 l=2]  movsi_ie/1
        mov.l   @(40,r15),r7    ! 2173  [c=1 l=2]  movsi_ie/5
        mov     #0,r3   ! 2694  [c=4 l=2]  movsi_ie/2
        mov     #8,r2   ! 2693  [c=4 l=2]  movsi_ie/2
        mov.w   .L13995,r1      ! 2561  [c=10 l=2]  *movhi/0
        mov.l   r2,@(44,r7)     ! 2695  [c=4 l=2]  movsi_ie/8
        mov     r4,r5   ! 567   [c=4 l=2]  movsi_ie/1
        mov.l   r3,@(48,r7)     ! 2696  [c=4 l=2]  movsi_ie/8
        mov     r10,r4  ! 568   [c=4 l=2]  movsi_ie/1
        mov.l   @(60,r15),r7    ! 2419  [c=1 l=2]  movsi_ie/5
        mov.l   .L13996,r2      ! 2566  [c=10 l=2]  movsi_ie/0
        mov.l   r7,@r13 ! 541   [c=4 l=2]  movsi_ie/8
        mov.l   r1,@(8,r13)     ! 549   [c=4 l=2]  movsi_ie/8
        mov.l   r12,@(4,r13)    ! 2176  [c=4 l=2]  movsi_ie/8
        mov.l   @(56,r15),r6    ! 566   [c=1 l=2]  movsi_ie/5
        mov.l   r1,@(4,r15)     ! 561   [c=4 l=2]  movsi_ie/8
        mov.l   r11,@(16,r15)   ! 2179  [c=4 l=2]  movsi_ie/8
        mov.l   r11,@(12,r15)   ! 2180  [c=4 l=2]  movsi_ie/8
        mov.l   r12,@(8,r15)    ! 2181  [c=4 l=2]  movsi_ie/8
        jsr     @r2     ! 569   [c=5 l=2]  call_valuei
        mov.l   r12,@r15        ! 2183  [c=4 l=2]  movsi_ie/8
        mov     #1,r6   ! 581   [c=4 l=2]  movsi_ie/2
        mov.l   r0,@(16,r10)    ! 573   [c=4 l=2]  movsi_ie/8
        mov     r0,r7   ! 1839  [c=4 l=2]  movsi_ie/1
        jsr     @r14    ! 582   [c=1 l=2]  block_lump_real_i4/0
        mov     r10,r5  ! 580   [c=4 l=2]  movsi_ie/1

In the latter case,  the last jsr @r14 that is calling __movstr_i4_odd libgcc
asm function of which arguments are r4, r5, r6.  We can't see any explicit insn
to set r4 after jsr@r2 that is calling wi::mul_internal c++ function which may
clobber r4.  We can find mov.l   @(56,r15),r4 before jsr @r10 which is
__movstr_i4_odd call in the former -mno-lra case.

In the -mlra case, r4 is 0x1 when  __movstr_i4_odd is called.  Looks a wrong
code.

Reply via email to