]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/38948 (unrecognizable insn, postreload.c:395)
authorHans-Peter Nilsson <hp@axis.com>
Tue, 13 Oct 2009 23:48:39 +0000 (23:48 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Tue, 13 Oct 2009 23:48:39 +0000 (23:48 +0000)
PR target/38948
* config/cris/cris.h (SECONDARY_RELOAD_CLASS): Handle reload
requests between special registers.

From-SVN: r152736

gcc/ChangeLog
gcc/config/cris/cris.h

index 8a5b067772273d6eb27c4fca8672e907f9ca0989..dbd7ada215e767390fc699e53022b6fb600e7f52 100644 (file)
@@ -1,3 +1,9 @@
+2009-10-14  Hans-Peter Nilsson  <hp@axis.com>
+
+       PR target/38948
+       * config/cris/cris.h (SECONDARY_RELOAD_CLASS): Handle reload
+       requests between special registers.
+
 2009-10-12  Hans-Peter Nilsson  <hp@axis.com>
 
        PR target/26515
index b8f4ae567132c15f7fd95214f193e68cd335dae4..061f98882144c0f7739144cd63d710d9648a5704 100644 (file)
@@ -642,12 +642,17 @@ enum reg_class
   ? GENERAL_REGS : (CLASS))
 
 /* We can't move special registers to and from memory in smaller than
-   word_mode.  */
-#define SECONDARY_RELOAD_CLASS(CLASS, MODE, X)         \
-  (((CLASS) != SPECIAL_REGS && (CLASS) != MOF_REGS)    \
-   || GET_MODE_SIZE (MODE) == 4                                \
-   || !MEM_P (X)                                       \
-   ? NO_REGS : GENERAL_REGS)
+   word_mode.  We also can't move between special registers.  Luckily,
+   -1, as returned by true_regnum for non-sub/registers, is valid as a
+   parameter to our REGNO_REG_CLASS, returning GENERAL_REGS, so we get
+   the effect that any X that isn't a special-register is treated as
+   a non-empty intersection with GENERAL_REGS.  */
+#define SECONDARY_RELOAD_CLASS(CLASS, MODE, X)                         \
+ ((((CLASS) == SPECIAL_REGS || (CLASS) == MOF_REGS)                    \
+   && ((GET_MODE_SIZE (MODE) < 4 && MEM_P (X))                         \
+       || !reg_classes_intersect_p (REGNO_REG_CLASS (true_regnum (X)), \
+                                   GENERAL_REGS)))                     \
+   ? GENERAL_REGS : NO_REGS)
 
 /* FIXME: Fix regrename.c; it should check validity of replacements,
    not just with a silly pass-specific macro.  We may miss some