From 343f6bbf97b13bba5cb6cbd6bdd2bbc601f342c6 Mon Sep 17 00:00:00 2001 From: David Edelsohn Date: Sat, 11 Dec 2004 17:37:25 +0000 Subject: [PATCH] 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 Ulrich Weigand 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 From-SVN: r92032 --- gcc/ChangeLog | 12 ++++++++++++ gcc/config/rs6000/darwin.h | 4 ++-- gcc/config/rs6000/rs6000.h | 14 +++++++------- gcc/config/rs6000/rs6000.md | 4 ++-- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 486ee8d7b0e..d4f8a76cc45 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2004-12-11 David Edelsohn + Ulrich Weigand + + 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 * 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 3026ae05a51..51a52ef026e 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 584111358da..6e74c0e0148 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 18d96da8821..51c4039c1ef 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) -- 2.30.2