diff options
author | Jim Wilson <wilson@cygnus.com> | 2000-09-08 01:35:53 +0000 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 2000-09-07 18:35:53 -0700 |
commit | 46146529f66e8e16ad5eef0eb286d903722649e5 (patch) | |
tree | 1249b18fdb950c858b6285494d6803b5dbb322ab /gcc | |
parent | f1158db34242a2bfcce395ebbe4f6ab7a1eaa759 (diff) | |
download | gcc-46146529f66e8e16ad5eef0eb286d903722649e5.zip gcc-46146529f66e8e16ad5eef0eb286d903722649e5.tar.gz gcc-46146529f66e8e16ad5eef0eb286d903722649e5.tar.bz2 |
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.
From-SVN: r36256
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.h | 7 | ||||
-rw-r--r-- | gcc/reload.c | 7 |
3 files changed, 17 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1e0953d..6965aea 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 7064745..86463b4 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 d83b1f6..d8abd39 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 |