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

Uroš Bizjak <ubizjak at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ubizjak at gmail dot com
          Component|target                      |rtl-optimization

--- Comment #5 from Uroš Bizjak <ubizjak at gmail dot com> ---
The problem is in the postreload late combine pass.

Looking at _.323r.postreload dump, we have the following sequence that handles
stack pointer adjustments before the second call to 'bar' (insn 199) in foo:

  ...
  176: {sp:DI=ax:DI+0x80;clobber flags:CC;}
      REG_ARGS_SIZE 0
  177: {sp:DI=sp:DI-0x40;clobber flags:CC;}
      REG_ARGS_SIZE 0x40
  ...
  187: {sp:DI=r13:DI-0x40;clobber flags:CC;}
      REG_ARGS_SIZE 0x80
  ...
  199: call [`bar'] argc:0x80
      REG_CALL_DECL `bar'
      REG_EH_REGION 0
  ...

but in _.325r.late_combine dump, the same sequence got additional (insn 338)
just before the second call to 'bar' (insn 199) in foo:

  ...
  176: {sp:DI=ax:DI+0x80;clobber flags:CC;}
      REG_ARGS_SIZE 0
  177: {sp:DI=sp:DI-0x40;clobber flags:CC;}
      REG_ARGS_SIZE 0x40
  ...
  187: {sp:DI=r13:DI-0x40;clobber flags:CC;}
      REG_ARGS_SIZE 0x80
  ...
  338: {sp:DI=ax:DI+0x80;clobber flags:CC;}
      REG_ARGS_SIZE 0
  199: call [`bar'] argc:0x80
      REG_CALL_DECL `bar'
      REG_EH_REGION 0
  ...

The compilation goes down the hill from here, creating wrong code:

        ...
        subq    $64, %rsp       # 177   [c=4 l=4]  *adddi_1/1
        ...
        leaq    -64(%r13), %rsp # 534   [c=4 l=4]  *leadi
        leaq    128(%rax), %rsp # 535   [c=4 l=7]  *leadi   <--- **here**
        ...
        call    bar     # 199   [c=0 l=5]  *call
        ...


FWIW, putting (insn 535) in front of (insn 177) in the assembly fixes the
testcase.

Reply via email to