[RS6000] Fix ICE caused by rs6000_savres_strategy thinko
authorAlan Modra <amodra@gmail.com>
Tue, 3 May 2016 12:38:32 +0000 (22:08 +0930)
committerAlan Modra <amodra@gcc.gnu.org>
Tue, 3 May 2016 12:38:32 +0000 (22:08 +0930)
rev 235672 (git cffc0b35) changed the condition for SAVE_MULTIPLE/
STORE_MULTIPLE, wrongly allowing a single reg.

gcc/
* config/rs6000/rs6000.c (rs6000_savres_strategy): Correct condition
for SAVE_MULTIPLE/STORE_MULTIPLE.
gcc/testsuite/
* gcc.target/powerpc/savres.c: Add func using a single gpr.

From-SVN: r235820

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/savres.c

index af475b3ea38581fb02a68f6c4409d4b7f04fa992..6d8b0d620dec6ac7c0af3bf01f9dd87b8727a774 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-03  Alan Modra  <amodra@gmail.com>
+
+       * config/rs6000/rs6000.c (rs6000_savres_strategy): Correct condition
+       for SAVE_MULTIPLE/STORE_MULTIPLE.
+
 2016-05-03  Jakub Jelinek  <jakub@redhat.com>
 
        * config/i386/i386.md (*truncdfsf_mixed, *truncdfsf_i387,
index 839ff5b71e69eed3a307c164228cb7df8a5af577..61d39242b39a3308771d89284c58986408486390 100644 (file)
@@ -23425,7 +23425,7 @@ rs6000_savres_strategy (rs6000_stack_t *info,
   if (TARGET_MULTIPLE
       && !TARGET_POWERPC64
       && !(TARGET_SPE_ABI && info->spe_64bit_regs_used)
-      && info->first_gp_reg_save != 32)
+      && info->first_gp_reg_save < 31)
     {
       /* Prefer store multiple for saves over out-of-line routines,
         since the store-multiple instruction will always be smaller.  */
index 020312fa643ff231cca2b2c2ab4add401c8b3bdd..f8682ad9a77ad3d85716e3148e5a2db702e37959 100644 (file)
@@ -1,3 +1,7 @@
+2016-05-03  Alan Modra  <amodra@gmail.com>
+
+       * gcc.target/powerpc/savres.c: Add func using a single gpr.
+
 2016-05-03  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.target/i386/avx512f-cvt-1.c: New test.
index f10c99a4b939dcdbff363fc71217a8625dbc3210..f472f23e7282f965d2d62699927329d4fa7139ff 100644 (file)
@@ -441,6 +441,16 @@ void s_r (void)
   __asm __volatile ("#%0" : "=m" (a) : : "r30", "r31");
 }
 
+void s_r31 (void)
+{
+  char a[33];
+#ifndef NO_BODY
+  TRASH_GPR (r31);
+  __asm__ __volatile__ ("#%0" : : "r" (r31));
+#endif
+  __asm __volatile ("#%0" : "=m" (a) : : "r31");
+}
+
 void s_c (void)
 {
   char a[33];
@@ -1140,6 +1150,8 @@ int main (void)
   VERIFY_REGS;
   s_r ();
   VERIFY_REGS;
+  s_r31 ();
+  VERIFY_REGS;
   s_c ();
   VERIFY_REGS;
   s_0 ();