re PR target/58139 (PowerPC volatile VSX register live across call)
authorPeter Bergner <bergner@vnet.ibm.com>
Thu, 5 Sep 2013 14:09:07 +0000 (09:09 -0500)
committerPeter Bergner <bergner@gcc.gnu.org>
Thu, 5 Sep 2013 14:09:07 +0000 (09:09 -0500)
PR target/58139
* reginfo.c (choose_hard_reg_mode): Scan through all mode classes
looking for widest mode.

From-SVN: r202286

gcc/ChangeLog
gcc/reginfo.c

index 44a23466f8e7ee545f1872cd78350ca72c7b208b..c6d9c010033f694df948f3aaf77ab21051921e9f 100644 (file)
@@ -1,3 +1,9 @@
+2013-09-05  Peter Bergner  <bergner@vnet.ibm.com>
+
+       PR target/58139
+       * reginfo.c (choose_hard_reg_mode): Scan through all mode classes
+       looking for widest mode.
+
 2013-09-05  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config.gcc (*-*-vxworks*): Do not override an existing extra_objs.
index 1fb6b5d226b3f75bfadc1ef33fc762666a69ea1d..49a7a5864e2335029d7affcbbcaf3a634d0d675b 100644 (file)
@@ -620,40 +620,35 @@ choose_hard_reg_mode (unsigned int regno ATTRIBUTE_UNUSED,
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
        && HARD_REGNO_MODE_OK (regno, mode)
-       && (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+       && (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+       && GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;
 
-  if (found_mode != VOIDmode)
-    return found_mode;
-
   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
        mode != VOIDmode;
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
        && HARD_REGNO_MODE_OK (regno, mode)
-       && (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+       && (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+       && GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;
 
-  if (found_mode != VOIDmode)
-    return found_mode;
-
   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
        mode != VOIDmode;
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
        && HARD_REGNO_MODE_OK (regno, mode)
-       && (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+       && (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+       && GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;
 
-  if (found_mode != VOIDmode)
-    return found_mode;
-
   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
        mode != VOIDmode;
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
        && HARD_REGNO_MODE_OK (regno, mode)
-       && (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+       && (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+       && GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;
 
   if (found_mode != VOIDmode)