aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2002-03-06 23:07:08 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2002-03-06 23:07:08 +0000
commite16e32914a3fc97be5b420a92281207d37c3d22a (patch)
tree2cde44acc5fa8132dc2f6b4d74e224267af6c0f6
parent348c9efcd3341f49e593a51983a594a7fb764386 (diff)
downloadgcc-e16e32914a3fc97be5b420a92281207d37c3d22a.zip
gcc-e16e32914a3fc97be5b420a92281207d37c3d22a.tar.gz
gcc-e16e32914a3fc97be5b420a92281207d37c3d22a.tar.bz2
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/reload1.c5
-rw-r--r--gcc/simplify-rtx.c20
3 files changed, 24 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 64cf53d..583e83a 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 7b420a1..a4a9c0c 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 5596e0c..b50a339 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;