summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>2000-09-08 01:35:53 +0000
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>2000-09-08 01:35:53 +0000
commite6a0eb01ca519626e2be5e18d175dfc107fe36e1 (patch)
tree1249b18fdb950c858b6285494d6803b5dbb322ab
parentb3b57f6bbd0cbce37049cde1c0e9fa34c1b07335 (diff)
downloadppe42-gcc-e6a0eb01ca519626e2be5e18d175dfc107fe36e1.tar.gz
ppe42-gcc-e6a0eb01ca519626e2be5e18d175dfc107fe36e1.zip
Fix ia64-linux compiler abort on perl.
* reload.c (push_reload): Use CLASS_CANNOT_CHANGE_MODE_P in addition to CLASS_CANNOT_CHANGE_MODE. * config/ia64/ia64.h (CLASS_CANNOT_CHANGE_MODE_P): True only if the mode classes are different. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36256 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/ia64/ia64.h7
-rw-r--r--gcc/reload.c7
3 files changed, 17 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1e0953ddd44..6965aea5ade 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2000-09-07 Jim Wilson <wilson@cygnus.com>
+
+ * reload.c (push_reload): Use CLASS_CANNOT_CHANGE_MODE_P in addition
+ to CLASS_CANNOT_CHANGE_MODE.
+ * config/ia64/ia64.h (CLASS_CANNOT_CHANGE_MODE_P): True only if the
+ mode classes are different.
+
2000-09-07 Zack Weinberg <zack@wolery.cumb.org>
* cpplib.h (struct cpp_options): Add user_label_prefix member,
diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h
index 70647450e83..86463b4e029 100644
--- a/gcc/config/ia64/ia64.h
+++ b/gcc/config/ia64/ia64.h
@@ -1055,9 +1055,12 @@ enum reg_class
#define CLASS_CANNOT_CHANGE_MODE FR_REGS
-/* Defines illegal mode changes for CLASS_CANNOT_CHANGE_MODE. */
+/* Defines illegal mode changes for CLASS_CANNOT_CHANGE_MODE.
+ In FP regs, we can't change FP values to integer values and vice
+ versa, but we can change e.g. DImode to SImode. */
-#define CLASS_CANNOT_CHANGE_MODE_P(FROM,TO) 1
+#define CLASS_CANNOT_CHANGE_MODE_P(FROM,TO) \
+ (GET_MODE_CLASS (FROM) != GET_MODE_CLASS (TO))
/* A C expression that defines the machine-dependent operand constraint
letters (`I', `J', `K', .. 'P') that specify particular ranges of
diff --git a/gcc/reload.c b/gcc/reload.c
index d83b1f69e31..d8abd39bef8 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -946,7 +946,8 @@ push_reload (in, out, inloc, outloc, class,
if (in != 0 && GET_CODE (in) == SUBREG
&& (SUBREG_WORD (in) == 0 || strict_low)
#ifdef CLASS_CANNOT_CHANGE_MODE
- && class != CLASS_CANNOT_CHANGE_MODE
+ && (class != CLASS_CANNOT_CHANGE_MODE
+ || ! CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (SUBREG_REG (in)), inmode))
#endif
&& (CONSTANT_P (SUBREG_REG (in))
|| GET_CODE (SUBREG_REG (in)) == PLUS
@@ -1051,7 +1052,9 @@ push_reload (in, out, inloc, outloc, class,
if (out != 0 && GET_CODE (out) == SUBREG
&& (SUBREG_WORD (out) == 0 || strict_low)
#ifdef CLASS_CANNOT_CHANGE_MODE
- && class != CLASS_CANNOT_CHANGE_MODE
+ && (class != CLASS_CANNOT_CHANGE_MODE
+ || ! CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (SUBREG_REG (out)),
+ outmode))
#endif
&& (CONSTANT_P (SUBREG_REG (out))
|| strict_low
OpenPOWER on IntegriCloud