diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-02-22 18:17:17 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-02-22 18:17:17 +0100 |
commit | 888c705092d00dc3101d00701367f7c9a2c449cd (patch) | |
tree | 1eea20ef1542e6beef457d80e3db01e9f8e09c54 /gcc/reg-stack.c | |
parent | 6d3daa1afb14de9fe828fa26e2cb2762a90247b0 (diff) | |
download | gcc-888c705092d00dc3101d00701367f7c9a2c449cd.zip gcc-888c705092d00dc3101d00701367f7c9a2c449cd.tar.gz gcc-888c705092d00dc3101d00701367f7c9a2c449cd.tar.bz2 |
re PR target/70465 (Poor code for x87 asm)
PR target/70465
* reg-stack.c (emit_swap_insn): Treat (float_extend:?F (mem:?F))
and (const_double:?F) like (mem:?F) for the purpose of fxch %st(1)
elimination by swapping fld*.
* gcc.target/i386/pr70465-2.c: New test.
From-SVN: r245654
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r-- | gcc/reg-stack.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index 7bf007c..41ae7e4 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -895,12 +895,16 @@ emit_swap_insn (rtx_insn *insn, stack_ptr regstack, rtx reg) just use fld b fld a - if possible. */ + if possible. Similarly for fld1, fldz, fldpi etc. instead of any + of the loads or for float extension from memory. */ + i1src = SET_SRC (i1set); + if (GET_CODE (i1src) == FLOAT_EXTEND) + i1src = XEXP (i1src, 0); if (REG_P (i1dest) && REGNO (i1dest) == FIRST_STACK_REG - && MEM_P (SET_SRC (i1set)) - && !side_effects_p (SET_SRC (i1set)) + && (MEM_P (i1src) || GET_CODE (i1src) == CONST_DOUBLE) + && !side_effects_p (i1src) && hard_regno == FIRST_STACK_REG + 1 && i1 != BB_HEAD (current_block)) { @@ -930,6 +934,9 @@ emit_swap_insn (rtx_insn *insn, stack_ptr regstack, rtx reg) && (i2set = single_set (i2)) != NULL_RTX) { rtx i2dest = *get_true_reg (&SET_DEST (i2set)); + rtx i2src = SET_SRC (i2set); + if (GET_CODE (i2src) == FLOAT_EXTEND) + i2src = XEXP (i2src, 0); /* If the last two insns before insn that involve stack regs are loads, where the latter (i1) pushes onto the register stack and thus @@ -937,9 +944,9 @@ emit_swap_insn (rtx_insn *insn, stack_ptr regstack, rtx reg) %st to %st(1), consider swapping them. */ if (REG_P (i2dest) && REGNO (i2dest) == FIRST_STACK_REG - && MEM_P (SET_SRC (i2set)) + && (MEM_P (i2src) || GET_CODE (i2src) == CONST_DOUBLE) /* Ensure i2 doesn't have other side-effects. */ - && !side_effects_p (SET_SRC (i2set)) + && !side_effects_p (i2src) /* And that the two instructions can actually be swapped, i.e. there shouldn't be any stores in between i2 and i1 that might alias with |