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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P1
                 CC|                            |vmakarov at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
This looks like a LRA bug.
We have:
(insn 153 152 276 18 (parallel [
            (set (reg/f:DI 183 [ ivtmp.58 ])
                (plus:DI (reg/f:DI 20 frame)
                    (const_int -608 [0xfffffffffffffda0])))
            (clobber (reg:CC 17 flags))
        ]) 219 {*adddi_1}
     (expr_list:REG_UNUSED (reg:CC 17 flags)
        (expr_list:REG_EQUIV (plus:DI (reg/f:DI 20 frame)
                (const_int -608 [0xfffffffffffffda0]))
            (nil))))
...
(insn 64 159 185 18 (set (reg:DI 182 [ ivtmp.58 ])
        (reg/f:DI 183 [ ivtmp.58 ])) pr69691.c:94 85 {*movdi_internal}
     (expr_list:REG_EQUAL (plus:DI (reg/f:DI 20 frame)
            (const_int -608 [0xfffffffffffffda0]))
        (nil)))
(insn 186 185 323 18 (set (reg:SI 247)
        (plus:SI (plus:SI (subreg:SI (reg/f:DI 183 [ ivtmp.58 ]) 0)
                (subreg:SI (reg:DI 202) 0))
            (const_int 1 [0x1]))) 214 {*leasi}
     (nil))
in *.ira, and LRA creates:
(note 153 152 349 18 NOTE_INSN_DELETED)
...
(insn 64 350 185 18 (set (reg:DI 3 bx [orig:182 ivtmp.58 ] [182])
        (plus:DI (reg/f:DI 7 sp)
            (const_int 32 [0x20]))) pr69691.c:94 215 {*leadi}
     (expr_list:REG_EQUAL (plus:DI (reg/f:DI 20 frame)
            (const_int -608 [0xfffffffffffffda0]))
        (nil)))
(note 185 64 186 18 NOTE_INSN_DELETED)
(insn 186 185 351 18 (set (reg:SI 0 ax [247])
        (plus:SI (plus:SI (reg:SI 7 sp)
                (reg:SI 42 r13 [202]))
            (const_int 65 [0x41]))) 214 {*leasi}
     (nil))

out of this.  Note, frame-608 is eliminated to sp+32 (looks correct), but in
insn 186 which is supposed to be (int)(frame-608) + (int)r13 + 1 the used
offset is 65, instead of 32+1, so it seems that the 32 from sp+32 got added
twice there during LRA.  Vlad, can you please have a look?

That said, on the generated assembly, I find it weird that nothing post reload
CSEs simple stuff like:
        leaq    32(%rsp), %rdi
        leaq    32(%rsp), %r14
or
        leaq    32(%rsp), %rax
        movl    %esi, %esi
        leaq    336(%rsp), %r14
        leaq    32(%rsp), %rbx
Wouldn't it be smaller and better to use movq %rdi, %r14 or movq %rax, %rbx?
Smaller for sure (movq is 2 bytes smaller than leaq with 1 byte immediate).

Reply via email to