diff options
author | uweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-06 23:07:08 +0000 |
---|---|---|
committer | uweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-06 23:07:08 +0000 |
commit | 907bb1cf7398f0ac14f834f9d783386046857fdb (patch) | |
tree | 2cde44acc5fa8132dc2f6b4d74e224267af6c0f6 | |
parent | 72a7a1414b3a1f0e122107ef59a4692f9dfdf67a (diff) | |
download | gcc-907bb1cf7398f0ac14f834f9d783386046857fdb.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50380 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/reload1.c | 5 | ||||
-rw-r--r-- | gcc/simplify-rtx.c | 20 |
3 files changed, 24 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 64cf53def75..583e83a1ab3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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; diff --git a/gcc/reload1.c b/gcc/reload1.c index 7b420a1ea3d..a4a9c0cfa91 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -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; } diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 5596e0c1e0a..b50a3392f7b 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -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; |