aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-05-20 09:59:03 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-05-20 09:59:03 -0700
commit1441374bc987ffd5e969ec1e58739c01696aba3b (patch)
tree0e8241da43d327f7b9fc8d8237c6e39b2df91ec8
parent9aa338ece29130841d1e74c30fa37ca8ac72993b (diff)
downloadgcc-1441374bc987ffd5e969ec1e58739c01696aba3b.zip
gcc-1441374bc987ffd5e969ec1e58739c01696aba3b.tar.gz
gcc-1441374bc987ffd5e969ec1e58739c01696aba3b.tar.bz2
cse.c (canon_hash): Reorder do_not_record test.
* cse.c (canon_hash): Reorder do_not_record test. Always allow pic_offset_table_rtx. From-SVN: r53665
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cse.c35
2 files changed, 29 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 31e4d6e..70e76fc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2002-05-20 Richard Henderson <rth@redhat.com>
+
+ * cse.c (canon_hash): Reorder do_not_record test. Always
+ allow pic_offset_table_rtx.
+
2002-05-19 Toon Moene <toon@moene.indiv.nluug.nl>
* optabs.c (expand_cmplxdiv_wide): Use complex_part_zero_p.
diff --git a/gcc/cse.c b/gcc/cse.c
index b13de96..514ba40 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -2249,10 +2249,11 @@ canon_hash (x, mode)
case REG:
{
unsigned int regno = REGNO (x);
+ bool record;
/* On some machines, we can't record any non-fixed hard register,
because extending its life will cause reload problems. We
- consider ap, fp, and sp to be fixed for this purpose.
+ consider ap, fp, sp, gp to be fixed for this purpose.
We also consider CCmode registers to be fixed for this purpose;
failure to do so leads to failure to simplify 0<100 type of
@@ -2262,16 +2263,28 @@ canon_hash (x, mode)
Nor should we record any register that is in a small
class, as defined by CLASS_LIKELY_SPILLED_P. */
- if (regno < FIRST_PSEUDO_REGISTER
- && (global_regs[regno]
- || CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (regno))
- || (SMALL_REGISTER_CLASSES
- && ! fixed_regs[regno]
- && x != frame_pointer_rtx
- && x != hard_frame_pointer_rtx
- && x != arg_pointer_rtx
- && x != stack_pointer_rtx
- && GET_MODE_CLASS (GET_MODE (x)) != MODE_CC)))
+ if (regno >= FIRST_PSEUDO_REGISTER)
+ record = true;
+ else if (x == frame_pointer_rtx
+ || x == hard_frame_pointer_rtx
+ || x == arg_pointer_rtx
+ || x == stack_pointer_rtx
+ || x == pic_offset_table_rtx)
+ record = true;
+ else if (global_regs[regno])
+ record = false;
+ else if (fixed_regs[regno])
+ record = true;
+ else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
+ record = true;
+ else if (SMALL_REGISTER_CLASSES)
+ record = false;
+ else if (CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (regno)))
+ record = false;
+ else
+ record = true;
+
+ if (!record)
{
do_not_record = 1;
return 0;