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

--- Comment #8 from Vladimir Makarov <vmakarov at gcc dot gnu.org> ---
I looked at the generated code  and I see only one issue with func foo:

void foo (void)
{
  double d = 0.0, e = 7.8;
  __asm ("# %0 %1" : : "m" (d), "m" (e));
}

for which GCC generates:

        movq    $0x000000000, -16(%rsp)
        movq    .LC1(%rip), %rax
        movq    %rax, -8(%rsp)
#APP
# 5 "b.i" 1
        # -16(%rsp) -8(%rsp)  # ! .LC1(%rip) could be used instead -8(%rsp)
# 0 "" 2
#NO_APP
        ret

I believe it is not a RA issue.

We have the following after expand:
    7: r99:DF=[`*.LC1']
    8: [r93:DI-0x8]=r99:DF
    9: {asm_operands;clobber flags:CC;}

after vreg (changing r93 to frame):
    7: r99:DF=[`*.LC1']
    8: [frame:DI-0x8]=r99:DF
    9: {asm_operands;clobber flags:CC;}

after combine1 (constant propagation of r99):
    7: NOTE_INSN_DELETED
    8: [frame:DI-0x8]=7.79999999999999982236431605997495353221893310546875e+0
    9: {asm_operands;clobber flags:CC;}

after reload (generation of reload insn 15 for insn 8):
    7: NOTE_INSN_DELETED
   15: ax:DF=[`*.LC1']
      REG_EQUAL 7.79999999999999982236431605997495353221893310546875e+0
    8: [sp:DI-0x8]=ax:DF
    9: {asm_operands;clobber flags:CC;}

Theoretically we could  do constant propagation of memory value in,
before, or after RA but it is too complicated.  Therefore I think it
should be fixed before or in expand pass.

Reply via email to