reload1.c (reload): Unshare all rtl after reload is done.

* reload1.c (reload): Unshare all rtl after reload is done.

	* simplify-rtx.c (simplify_plus_minus): Do not abort,
	but simply fail if the expression is too complex to simplify.
	(simplify_gen_binary): Handle simplify_plus_minus failures.

From-SVN: r50380
This commit is contained in:
Ulrich Weigand 2002-03-06 23:07:08 +00:00 committed by Ulrich Weigand
parent 348c9efcd3
commit e16e32914a
3 changed files with 24 additions and 9 deletions

View File

@ -1,3 +1,11 @@
2002-03-06 Ulrich Weigand <uweigand@de.ibm.com>
* reload1.c (reload): Unshare all rtl after reload is done.
* simplify-rtx.c (simplify_plus_minus): Do not abort,
but simply fail if the expression is too complex to simplify.
(simplify_gen_binary): Handle simplify_plus_minus failures.
Wed Mar 6 20:32:09 CET 2002 Jan Hubicka <jh@suse.cz>
* toplev.c (rest_of_compilation): Do jump threading before SSA path;

View File

@ -1278,6 +1278,11 @@ reload (first, global)
unused_insn_chains = 0;
fixup_abnormal_edges ();
/* Replacing pseudos with their memory equivalents might have
created shared rtx. Subsequent passes would get confused
by this, so unshare everything here. */
unshare_all_rtl_again (first);
return failure;
}

View File

@ -143,9 +143,13 @@ simplify_gen_binary (code, mode, op0, op1)
the operation. */
if (code == PLUS || code == MINUS)
return simplify_plus_minus (code, mode, op0, op1, 1);
else
return gen_rtx_fmt_ee (code, mode, op0, op1);
{
tem = simplify_plus_minus (code, mode, op0, op1, 1);
if (tem)
return tem;
}
return gen_rtx_fmt_ee (code, mode, op0, op1);
}
/* If X is a MEM referencing the constant pool, return the real value.
@ -1649,7 +1653,9 @@ simplify_binary_operation (code, mode, op0, op1)
we rebuild the operation.
If FORCE is true, then always generate the rtx. This is used to
canonicalize stuff emitted from simplify_gen_binary. */
canonicalize stuff emitted from simplify_gen_binary. Note that this
can still fail if the rtx is too complex. It won't fail just because
the result is not 'simpler' than the input, however. */
struct simplify_plus_minus_op_data
{
@ -1708,11 +1714,7 @@ simplify_plus_minus (code, mode, op0, op1, force)
case PLUS:
case MINUS:
if (n_ops == 7)
{
if (force)
abort ();
return NULL_RTX;
}
return NULL_RTX;
ops[n_ops].op = XEXP (this_op, 1);
ops[n_ops].neg = (this_code == MINUS) ^ this_neg;