summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>2005-11-12 07:12:09 +0000
committerhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>2005-11-12 07:12:09 +0000
commitf6205c6fcee992d0ed4f4623d6b34fc5908ec4ed (patch)
tree13d1b5b48d40ed6fe25f4f0451bff9e312f1d737
parent391496ab44185c44435dab9cdd7606f6d480e009 (diff)
downloadppe42-gcc-f6205c6fcee992d0ed4f4623d6b34fc5908ec4ed.tar.gz
ppe42-gcc-f6205c6fcee992d0ed4f4623d6b34fc5908ec4ed.zip
* recog.c (constrain_operands) <case 'g'>: For a match, require
that a non-register matches general_operand when strict >= 0. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106821 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/recog.c20
2 files changed, 18 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 285101584b6..f539184d3b0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-11-12 Hans-Peter Nilsson <hp@axis.com>
+
+ * recog.c (constrain_operands) <case 'g'>: For a match, require
+ that a non-register matches general_operand when strict >= 0.
+
2005-11-11 Steven Bosscher <stevenb@suse.de>
* loop-invariant.c (move_loop_invariants): Fix a thinko in the
diff --git a/gcc/recog.c b/gcc/recog.c
index 111f9cb62f8..16bb280d857 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -2429,16 +2429,22 @@ constrain_operands (int strict)
break;
/* No need to check general_operand again;
- it was done in insn-recog.c. */
+ it was done in insn-recog.c. Well, except that reload
+ doesn't check the validity of its replacements, but
+ that should only matter when there's a bug. */
case 'g':
/* Anything goes unless it is a REG and really has a hard reg
but the hard reg is not in the class GENERAL_REGS. */
- if (strict < 0
- || GENERAL_REGS == ALL_REGS
- || !REG_P (op)
- || (reload_in_progress
- && REGNO (op) >= FIRST_PSEUDO_REGISTER)
- || reg_fits_class_p (op, GENERAL_REGS, offset, mode))
+ if (REG_P (op))
+ {
+ if (strict < 0
+ || GENERAL_REGS == ALL_REGS
+ || (reload_in_progress
+ && REGNO (op) >= FIRST_PSEUDO_REGISTER)
+ || reg_fits_class_p (op, GENERAL_REGS, offset, mode))
+ win = 1;
+ }
+ else if (strict < 0 || general_operand (op, mode))
win = 1;
break;
OpenPOWER on IntegriCloud