Commit 75214935 by Vladimir Makarov Committed by Vladimir Makarov

re PR target/83252 (Wrong code with "-march=skylake-avx512 -O3")

2017-12-07  Vladimir Makarov  <vmakarov@redhat.com>

	PR target/83252
	PR rtl-optimization/80818
	* lra.c (add_regs_to_insn_regno_info): Make a hard reg in CLOBBER
	always early clobbered.
	* lra-lives.c (process_bb_lives): Check input hard regs for early
	clobbered non-operand hard reg.

From-SVN: r255471
parent 47f5f7e7
2017-12-07 Vladimir Makarov <vmakarov@redhat.com>
PR target/83252
PR rtl-optimization/80818
* lra.c (add_regs_to_insn_regno_info): Make a hard reg in CLOBBER
always early clobbered.
* lra-lives.c (process_bb_lives): Check input hard regs for early
clobbered non-operand hard reg.
2017-12-07 Jakub Jelinek <jakub@redhat.com> 2017-12-07 Jakub Jelinek <jakub@redhat.com>
PR middle-end/83164 PR middle-end/83164
...@@ -928,7 +928,18 @@ process_bb_lives (basic_block bb, int &curr_point, bool dead_insn_p) ...@@ -928,7 +928,18 @@ process_bb_lives (basic_block bb, int &curr_point, bool dead_insn_p)
for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next) for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
if (reg->type == OP_OUT if (reg->type == OP_OUT
&& reg_early_clobber_p (reg, n_alt) && ! reg->subreg_p) && reg_early_clobber_p (reg, n_alt) && ! reg->subreg_p)
make_hard_regno_dead (reg->regno); {
struct lra_insn_reg *reg2;
/* We can have early clobbered non-operand hard reg and
the same hard reg as an insn input. Don't make hard
reg dead before the insns. */
for (reg2 = curr_id->regs; reg2 != NULL; reg2 = reg2->next)
if (reg2->type != OP_OUT && reg2->regno == reg->regno)
break;
if (reg2 == NULL)
make_hard_regno_dead (reg->regno);
}
if (need_curr_point_incr) if (need_curr_point_incr)
next_program_point (curr_point, freq); next_program_point (curr_point, freq);
......
...@@ -1476,15 +1476,11 @@ add_regs_to_insn_regno_info (lra_insn_recog_data_t data, rtx x, ...@@ -1476,15 +1476,11 @@ add_regs_to_insn_regno_info (lra_insn_recog_data_t data, rtx x,
add_regs_to_insn_regno_info (data, SET_SRC (x), insn, OP_IN, false, 0); add_regs_to_insn_regno_info (data, SET_SRC (x), insn, OP_IN, false, 0);
break; break;
case CLOBBER: case CLOBBER:
{ /* We treat clobber of non-operand hard registers as early
int code = INSN_CODE (insn); clobber. */
add_regs_to_insn_regno_info (data, XEXP (x, 0), insn, OP_OUT,
/* We treat clobber of non-operand hard registers as early true, ALL_ALTERNATIVES);
clobber (the behavior is expected from asm). */ break;
add_regs_to_insn_regno_info (data, XEXP (x, 0), insn, OP_OUT,
code < 0, code < 0 ? ALL_ALTERNATIVES : 0);
break;
}
case PRE_INC: case PRE_DEC: case POST_INC: case POST_DEC: case PRE_INC: case PRE_DEC: case POST_INC: case POST_DEC:
add_regs_to_insn_regno_info (data, XEXP (x, 0), insn, OP_INOUT, false, 0); add_regs_to_insn_regno_info (data, XEXP (x, 0), insn, OP_INOUT, false, 0);
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment