re PR target/60077 (gcc.target/i386/pr35767-5.c FAILs)
PR target/60077 * expr.c (emit_move_resolve_push): Export; be bit more selective on when to clear alias set. * expr.h (emit_move_resolve_push): Declare. * function.h (struct function): Add tail_call_marked. * tree-tailcall.c (optimize_tail_call): Set tail_call_marked. * config/i386/i386-protos.h (ix86_expand_push): Remove. * config/i386/i386.md (TImode move expander): De not call ix86_expand_push. (FP push expanders): Preserve memory attributes. * config/i386/sse.md (push<mode>1): Remove. * config/i386/i386.c (ix86_expand_vector_move): Handle push operation. (ix86_expand_push): Remove. * config/i386/mmx.md (push<mode>1): Remove. From-SVN: r207587
This commit is contained in:
parent
44afe5e47b
commit
e2f0f5f704
@ -1,3 +1,21 @@
|
||||
2014-02-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR target/60077
|
||||
* expr.c (emit_move_resolve_push): Export; be bit more selective
|
||||
on when to clear alias set.
|
||||
* expr.h (emit_move_resolve_push): Declare.
|
||||
* function.h (struct function): Add tail_call_marked.
|
||||
* tree-tailcall.c (optimize_tail_call): Set tail_call_marked.
|
||||
* config/i386/i386-protos.h (ix86_expand_push): Remove.
|
||||
* config/i386/i386.md (TImode move expander): De not call
|
||||
ix86_expand_push.
|
||||
(FP push expanders): Preserve memory attributes.
|
||||
* config/i386/sse.md (push<mode>1): Remove.
|
||||
* config/i386/i386.c (ix86_expand_vector_move): Handle push
|
||||
operation.
|
||||
(ix86_expand_push): Remove.
|
||||
* config/i386/mmx.md (push<mode>1): Remove.
|
||||
|
||||
2014-02-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/60030
|
||||
|
@ -84,7 +84,6 @@ extern void ix86_expand_clear (rtx);
|
||||
extern void ix86_expand_move (enum machine_mode, rtx[]);
|
||||
extern void ix86_expand_vector_move (enum machine_mode, rtx[]);
|
||||
extern void ix86_expand_vector_move_misalign (enum machine_mode, rtx[]);
|
||||
extern void ix86_expand_push (enum machine_mode, rtx);
|
||||
extern rtx ix86_fixup_binary_operands (enum rtx_code,
|
||||
enum machine_mode, rtx[]);
|
||||
extern void ix86_fixup_binary_operands_no_copy (enum rtx_code,
|
||||
|
@ -16828,6 +16828,9 @@ ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
|
||||
rtx op0 = operands[0], op1 = operands[1];
|
||||
unsigned int align = GET_MODE_ALIGNMENT (mode);
|
||||
|
||||
if (push_operand (op0, VOIDmode))
|
||||
op0 = emit_move_resolve_push (mode, op0);
|
||||
|
||||
/* Force constants other than zero into memory. We do not know how
|
||||
the instructions used to build constants modify the upper 64 bits
|
||||
of the register, once we have that information we may be able
|
||||
@ -17255,30 +17258,6 @@ ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
/* Expand a push in MODE. This is some mode for which we do not support
|
||||
proper push instructions, at least from the registers that we expect
|
||||
the value to live in. */
|
||||
|
||||
void
|
||||
ix86_expand_push (enum machine_mode mode, rtx x)
|
||||
{
|
||||
rtx tmp;
|
||||
|
||||
tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
|
||||
GEN_INT (-GET_MODE_SIZE (mode)),
|
||||
stack_pointer_rtx, 1, OPTAB_DIRECT);
|
||||
if (tmp != stack_pointer_rtx)
|
||||
emit_move_insn (stack_pointer_rtx, tmp);
|
||||
|
||||
tmp = gen_rtx_MEM (mode, stack_pointer_rtx);
|
||||
|
||||
/* When we push an operand onto stack, it has to be aligned at least
|
||||
at the function argument boundary. However since we don't have
|
||||
the argument type, we can't determine the actual argument
|
||||
boundary. */
|
||||
emit_move_insn (tmp, x);
|
||||
}
|
||||
|
||||
/* Helper function of ix86_fixup_binary_operands to canonicalize
|
||||
operand order. Returns true if the operands should be swapped. */
|
||||
|
||||
|
@ -1821,8 +1821,6 @@
|
||||
{
|
||||
if (TARGET_64BIT)
|
||||
ix86_expand_move (TImode, operands);
|
||||
else if (push_operand (operands[0], TImode))
|
||||
ix86_expand_push (TImode, operands[1]);
|
||||
else
|
||||
ix86_expand_vector_move (TImode, operands);
|
||||
DONE;
|
||||
@ -2682,7 +2680,11 @@
|
||||
(match_operand:TF 1 "sse_reg_operand"))]
|
||||
"TARGET_SSE && reload_completed"
|
||||
[(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -16)))
|
||||
(set (mem:TF (reg:P SP_REG)) (match_dup 1))])
|
||||
(set (match_dup 0) (match_dup 1))]
|
||||
{
|
||||
/* Preserve memory attributes. */
|
||||
operands[0] = replace_equiv_address (operands[0], stack_pointer_rtx);
|
||||
})
|
||||
|
||||
(define_insn "*pushxf"
|
||||
[(set (match_operand:XF 0 "push_operand" "=<,<")
|
||||
@ -2708,8 +2710,12 @@
|
||||
(match_operand:XF 1 "fp_register_operand"))]
|
||||
"reload_completed"
|
||||
[(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
|
||||
(set (mem:XF (reg:P SP_REG)) (match_dup 1))]
|
||||
"operands[2] = GEN_INT (-GET_MODE_SIZE (XFmode));")
|
||||
(set (match_dup 0) (match_dup 1))]
|
||||
{
|
||||
operands[2] = GEN_INT (-GET_MODE_SIZE (XFmode));
|
||||
/* Preserve memory attributes. */
|
||||
operands[0] = replace_equiv_address (operands[0], stack_pointer_rtx);
|
||||
})
|
||||
|
||||
(define_insn "*pushdf"
|
||||
[(set (match_operand:DF 0 "push_operand" "=<,<,<,<")
|
||||
@ -2730,7 +2736,11 @@
|
||||
(match_operand:DF 1 "any_fp_register_operand"))]
|
||||
"reload_completed"
|
||||
[(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -8)))
|
||||
(set (mem:DF (reg:P SP_REG)) (match_dup 1))])
|
||||
(set (match_dup 0) (match_dup 1))]
|
||||
{
|
||||
/* Preserve memory attributes. */
|
||||
operands[0] = replace_equiv_address (operands[0], stack_pointer_rtx);
|
||||
})
|
||||
|
||||
(define_insn "*pushsf_rex64"
|
||||
[(set (match_operand:SF 0 "push_operand" "=X,X,X")
|
||||
@ -2764,7 +2774,7 @@
|
||||
(match_operand:SF 1 "any_fp_register_operand"))]
|
||||
"reload_completed"
|
||||
[(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
|
||||
(set (mem:SF (reg:P SP_REG)) (match_dup 1))]
|
||||
(set (match_dup 0) (match_dup 1))]
|
||||
{
|
||||
rtx op = XEXP (operands[0], 0);
|
||||
if (GET_CODE (op) == PRE_DEC)
|
||||
@ -2778,6 +2788,8 @@
|
||||
gcc_assert (CONST_INT_P (op));
|
||||
}
|
||||
operands[2] = op;
|
||||
/* Preserve memory attributes. */
|
||||
operands[0] = replace_equiv_address (operands[0], stack_pointer_rtx);
|
||||
})
|
||||
|
||||
(define_split
|
||||
|
@ -213,14 +213,6 @@
|
||||
[(const_int 0)]
|
||||
"ix86_split_long_move (operands); DONE;")
|
||||
|
||||
(define_expand "push<mode>1"
|
||||
[(match_operand:MMXMODE 0 "register_operand")]
|
||||
"TARGET_MMX"
|
||||
{
|
||||
ix86_expand_push (<MODE>mode, operands[0]);
|
||||
DONE;
|
||||
})
|
||||
|
||||
(define_expand "movmisalign<mode>"
|
||||
[(set (match_operand:MMXMODE 0 "nonimmediate_operand")
|
||||
(match_operand:MMXMODE 1 "nonimmediate_operand"))]
|
||||
|
@ -913,14 +913,6 @@
|
||||
operands[2] = CONST0_RTX (DFmode);
|
||||
})
|
||||
|
||||
(define_expand "push<mode>1"
|
||||
[(match_operand:VMOVE 0 "register_operand")]
|
||||
"TARGET_SSE"
|
||||
{
|
||||
ix86_expand_push (<MODE>mode, operands[0]);
|
||||
DONE;
|
||||
})
|
||||
|
||||
(define_expand "movmisalign<mode>"
|
||||
[(set (match_operand:VMOVE 0 "nonimmediate_operand")
|
||||
(match_operand:VMOVE 1 "nonimmediate_operand"))]
|
||||
|
@ -3221,7 +3221,7 @@ emit_move_via_integer (enum machine_mode mode, rtx x, rtx y, bool force)
|
||||
/* A subroutine of emit_move_insn_1. X is a push_operand in MODE.
|
||||
Return an equivalent MEM that does not use an auto-increment. */
|
||||
|
||||
static rtx
|
||||
rtx
|
||||
emit_move_resolve_push (enum machine_mode mode, rtx x)
|
||||
{
|
||||
enum rtx_code code = GET_CODE (XEXP (x, 0));
|
||||
@ -4070,7 +4070,7 @@ emit_single_push_insn_1 (enum machine_mode mode, rtx x, tree type)
|
||||
{
|
||||
set_mem_attributes (dest, type, 1);
|
||||
|
||||
if (flag_optimize_sibling_calls)
|
||||
if (cfun->tail_call_marked)
|
||||
/* Function incoming arguments may overlap with sibling call
|
||||
outgoing arguments and we cannot allow reordering of reads
|
||||
from function arguments with stores to outgoing arguments
|
||||
|
@ -413,6 +413,7 @@ extern rtx emit_move_insn_1 (rtx, rtx);
|
||||
|
||||
extern rtx emit_move_complex_push (enum machine_mode, rtx, rtx);
|
||||
extern rtx emit_move_complex_parts (rtx, rtx);
|
||||
extern rtx emit_move_resolve_push (enum machine_mode, rtx);
|
||||
|
||||
/* Push a block of length SIZE (perhaps variable)
|
||||
and return an rtx to address the beginning of the block. */
|
||||
|
@ -667,6 +667,9 @@ struct GTY(()) function {
|
||||
/* Nonzero if the current function contains any loops with
|
||||
nonzero value in loop->simduid. */
|
||||
unsigned int has_simduid_loops : 1;
|
||||
|
||||
/* Set when the tail call has been identified. */
|
||||
unsigned int tail_call_marked : 1;
|
||||
};
|
||||
|
||||
/* Add the decl D to the local_decls list of FUN. */
|
||||
|
@ -909,6 +909,7 @@ optimize_tail_call (struct tailcall *t, bool opt_tailcalls)
|
||||
gimple stmt = gsi_stmt (t->call_gsi);
|
||||
|
||||
gimple_call_set_tail (stmt, true);
|
||||
cfun->tail_call_marked = true;
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
{
|
||||
fprintf (dump_file, "Found tail call ");
|
||||
|
Loading…
x
Reference in New Issue
Block a user