aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Edelsohn <edelsohn@gnu.org>2004-12-11 17:37:25 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2004-12-11 12:37:25 -0500
commit343f6bbf97b13bba5cb6cbd6bdd2bbc601f342c6 (patch)
treece58e675bcb9e263056532c0fccf952149a8dc78
parent3bb18f492119d3ea6a326eb6a3b50ecc4557270b (diff)
downloadgcc-343f6bbf97b13bba5cb6cbd6bdd2bbc601f342c6.zip
gcc-343f6bbf97b13bba5cb6cbd6bdd2bbc601f342c6.tar.gz
gcc-343f6bbf97b13bba5cb6cbd6bdd2bbc601f342c6.tar.bz2
re PR middle-end/18641 (Another ICE caused by reload of a pseudo reg into f0 for a DImode expr)
2004-12-11 David Edelsohn <edelsohn@gnu.org> Ulrich Weigand <uweigand@de.ibm.com> PR target/18641 * config/rs6000/darwin.h (PREFERRED_RELOAD_CLASS): Reload all constants into all register classes intersecting with FLOAT_REGS via memory. * config/rs6000/rs6000.h (PREFERRED_RELOAD_CLASS): Same. * config/rs6000/rs6000.md (movdi_internal32): Ignore FPRs when choosing register preferences. (movdi_internal64): Same. Co-Authored-By: Ulrich Weigand <uweigand@de.ibm.com> From-SVN: r92032
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/config/rs6000/darwin.h4
-rw-r--r--gcc/config/rs6000/rs6000.h14
-rw-r--r--gcc/config/rs6000/rs6000.md4
4 files changed, 23 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 486ee8d..d4f8a76 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2004-12-11 David Edelsohn <edelsohn@gnu.org>
+ Ulrich Weigand <uweigand@de.ibm.com>
+
+ PR target/18641
+ * config/rs6000/darwin.h (PREFERRED_RELOAD_CLASS): Reload all
+ constants into all register classes intersecting with FLOAT_REGS
+ via memory.
+ * config/rs6000/rs6000.h (PREFERRED_RELOAD_CLASS): Same.
+ * config/rs6000/rs6000.md (movdi_internal32): Ignore FPRs when
+ choosing register preferences.
+ (movdi_internal64): Same.
+
2004-12-11 Kazu Hirata <kazu@cs.umass.edu>
* tree-into-ssa.c (rewrite_ssa_into_ssa): Free SSA_NAME_AUX
diff --git a/gcc/config/rs6000/darwin.h b/gcc/config/rs6000/darwin.h
index 3026ae0..51a52ef 100644
--- a/gcc/config/rs6000/darwin.h
+++ b/gcc/config/rs6000/darwin.h
@@ -342,8 +342,8 @@ do { \
#undef PREFERRED_RELOAD_CLASS
#define PREFERRED_RELOAD_CLASS(X,CLASS) \
- ((GET_CODE (X) == CONST_DOUBLE \
- && GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT) \
+ ((CONSTANT_P (X) \
+ && reg_classes_intersect_p ((CLASS), FLOAT_REGS)) \
? NO_REGS \
: ((GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == HIGH) \
&& reg_class_subset_p (BASE_REGS, (CLASS))) \
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 5841113..6e74c0e 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -1397,13 +1397,13 @@ enum reg_class
*/
#define PREFERRED_RELOAD_CLASS(X,CLASS) \
- (((GET_CODE (X) == CONST_DOUBLE \
- && GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT) \
- ? NO_REGS \
- : (GET_MODE_CLASS (GET_MODE (X)) == MODE_INT \
- && (CLASS) == NON_SPECIAL_REGS) \
- ? GENERAL_REGS \
- : (CLASS)))
+ ((CONSTANT_P (X) \
+ && reg_classes_intersect_p ((CLASS), FLOAT_REGS)) \
+ ? NO_REGS \
+ : (GET_MODE_CLASS (GET_MODE (X)) == MODE_INT \
+ && (CLASS) == NON_SPECIAL_REGS) \
+ ? GENERAL_REGS \
+ : (CLASS))
/* Return the register class of a scratch register needed to copy IN into
or out of a register in CLASS in MODE. If it can be done directly,
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 18d96da..51c4039 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -8496,7 +8496,7 @@
; List r->r after r->"o<>", otherwise reload will try to reload a
; non-offsettable address by using r->r which won't make progress.
(define_insn "*movdi_internal32"
- [(set (match_operand:DI 0 "nonimmediate_operand" "=o<>,r,r,f,f,m,r")
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=o<>,r,r,*f,*f,m,r")
(match_operand:DI 1 "input_operand" "r,r,m,f,m,f,IJKnGHF"))]
"! TARGET_POWERPC64
&& (gpc_reg_operand (operands[0], DImode)
@@ -8567,7 +8567,7 @@
}")
(define_insn "*movdi_internal64"
- [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,m,r,r,r,r,??f,f,m,r,*h,*h")
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,m,r,r,r,r,*f,*f,m,r,*h,*h")
(match_operand:DI 1 "input_operand" "r,m,r,I,L,nF,R,f,m,f,*h,r,0"))]
"TARGET_POWERPC64
&& (gpc_reg_operand (operands[0], DImode)