re PR rtl-optimization/23837 (Wrong code with REG_NO_CONFLICT notes (caused by combine))

PR rtl-optimization/23837
	* optabs.c (expand_binop): For a multi-word rotate, never emit
	a REG_NO_CONFLICT block.

From-SVN: r108690
This commit is contained in:
Steven Bosscher 2005-12-16 22:19:09 +00:00 committed by Steven Bosscher
parent f3a1a6532f
commit ebd8b60da1
2 changed files with 13 additions and 15 deletions

View File

@ -1,3 +1,9 @@
2005-12-16 Steven Bosscher <stevenb@suse.de>
PR rtl-optimization/23837
* optabs.c (expand_binop): For a multi-word rotate, never emit
a REG_NO_CONFLICT block.
2005-12-16 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR middle-end/25457

View File

@ -1420,7 +1420,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
&& ashl_optab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing
&& lshr_optab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing)
{
rtx insns, equiv_value;
rtx insns;
rtx into_target, outof_target;
rtx into_input, outof_input;
rtx inter;
@ -1520,20 +1520,12 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
if (inter != 0)
{
if (binoptab->code != UNKNOWN)
equiv_value = gen_rtx_fmt_ee (binoptab->code, mode, op0, op1);
else
equiv_value = 0;
/* We can't make this a no conflict block if this is a word swap,
because the word swap case fails if the input and output values
are in the same register. */
if (shift_count != BITS_PER_WORD)
emit_no_conflict_block (insns, target, op0, op1, equiv_value);
else
emit_insn (insns);
/* One may be tempted to wrap the insns in a REG_NO_CONFLICT
block to help the register allocator a bit. But a multi-word
rotate will need all the input bits when setting the output
bits, so there clearly is a conflict between the input and
output registers. So we can't use a no-conflict block here. */
emit_insn (insns);
return target;
}
}