re PR target/88188 (ICE in print_operand, at config/rs6000/rs6000.c)
authorJakub Jelinek <jakub@redhat.com>
Tue, 4 Dec 2018 19:41:52 +0000 (20:41 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 4 Dec 2018 19:41:52 +0000 (20:41 +0100)
PR target/88188
* config/rs6000/rs6000.c (ccr_bit): Return -1 instead of assertion
failures.
(print_operand): Use REG_P instead of GET_CODE == REG.
<case 'D'>: Also check CR_REGNO_P (REGNO (x)).
<case 't'>: Likewise.  Remove GET_MODE check.
* config/rs6000/rs6000.md (scc patterns): Assert ccr_bit didn't
return -1.

* gcc.target/powerpc/pr88188-2.c: New test.

From-SVN: r266794

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr88188-2.c [new file with mode: 0644]

index 0ab1186cd40d353abe0075c5601e837daec963df..add8fbae1fcae881c6ecf31571255da2cb081228 100644 (file)
@@ -1,3 +1,14 @@
+2018-12-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/88188
+       * config/rs6000/rs6000.c (ccr_bit): Return -1 instead of assertion
+       failures.
+       (print_operand): Use REG_P instead of GET_CODE == REG.
+       <case 'D'>: Also check CR_REGNO_P (REGNO (x)).
+       <case 't'>: Likewise.  Remove GET_MODE check.
+       * config/rs6000/rs6000.md (scc patterns): Assert ccr_bit didn't
+       return -1.
+
 2018-12-04  Martin Sebor  <msebor@redhat.com>
 
        * doc/extend.texi (attribute aligned): Expand.
index 4e35a05bb38cc23878a057f05e0e1794fdd4261b..4f12558b0a872cbb2b5adea066cc2cc61a42ba37 100644 (file)
@@ -20626,7 +20626,8 @@ ccr_bit (rtx op, int scc_p)
 
   reg = XEXP (op, 0);
 
-  gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
+  if (!REG_P (reg) || !CR_REGNO_P (REGNO (reg)))
+    return -1;
 
   cc_mode = GET_MODE (reg);
   cc_regnum = REGNO (reg);
@@ -20636,9 +20637,19 @@ ccr_bit (rtx op, int scc_p)
 
   /* When generating a sCOND operation, only positive conditions are
      allowed.  */
-  gcc_assert (!scc_p
-             || code == EQ || code == GT || code == LT || code == UNORDERED
-             || code == GTU || code == LTU);
+  if (scc_p)
+    switch (code)
+      {
+      case EQ:
+      case GT:
+      case LT:
+      case UNORDERED:
+      case GTU:
+      case LTU:
+       break;
+      default:
+       return -1;
+      }
 
   switch (code)
     {
@@ -20663,7 +20674,7 @@ ccr_bit (rtx op, int scc_p)
       return scc_p ? base_bit + 3 : base_bit + 1;
 
     default:
-      gcc_unreachable ();
+      return -1;
     }
 }
 \f
@@ -20756,7 +20767,7 @@ print_operand (FILE *file, rtx x, int code)
 
     case 'D':
       /* Like 'J' but get to the GT bit only.  */
-      if (!REG_P (x))
+      if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
        {
          output_operand_lossage ("invalid %%D value");
          return;
@@ -20784,7 +20795,7 @@ print_operand (FILE *file, rtx x, int code)
 
     case 'E':
       /* X is a CR register.  Print the number of the EQ bit of the CR */
-      if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
+      if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
        output_operand_lossage ("invalid %%E value");
       else
        fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
@@ -20793,7 +20804,7 @@ print_operand (FILE *file, rtx x, int code)
     case 'f':
       /* X is a CR register.  Print the shift count needed to move it
         to the high-order four bits.  */
-      if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
+      if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
        output_operand_lossage ("invalid %%f value");
       else
        fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
@@ -20802,7 +20813,7 @@ print_operand (FILE *file, rtx x, int code)
     case 'F':
       /* Similar, but print the count for the rotate in the opposite
         direction.  */
-      if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
+      if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
        output_operand_lossage ("invalid %%F value");
       else
        fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
@@ -21000,7 +21011,7 @@ print_operand (FILE *file, rtx x, int code)
 
     case 'R':
       /* X is a CR register.  Print the mask for `mtcrf'.  */
-      if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
+      if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
        output_operand_lossage ("invalid %%R value");
       else
        fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
@@ -21016,7 +21027,7 @@ print_operand (FILE *file, rtx x, int code)
 
     case 't':
       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
-      if (!REG_P (x) || GET_MODE (x) != CCmode)
+      if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
        {
          output_operand_lossage ("invalid %%t value");
          return;
index 797d5c32e64dabcabe069835690f57f3ac51d5e3..18987cd720723391f2aeca04d1762675defd704d 100644 (file)
   int put_bit = 31 - (INTVAL (operands[3]) & 31);
   int count;
 
+  gcc_assert (is_bit != -1);
   if (is_bit >= put_bit)
     count = is_bit - put_bit;
   else
   int put_bit = 31 - (INTVAL (operands[3]) & 31);
   int count;
 
+  gcc_assert (is_bit != -1);
   /* Force split for non-cc0 compare.  */
   if (which_alternative == 1)
      return "#";
index 887705e2503f499b45358397c225bc4863e83afe..6daa60cf8a2c466f6d695235177eae86abd96a01 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/88188
+       * gcc.target/powerpc/pr88188-2.c: New test.
+
 2018-12-04  Marek Polacek  <polacek@redhat.com>
 
        PR c++/88184 - ICE when treating name as template-name.
diff --git a/gcc/testsuite/gcc.target/powerpc/pr88188-2.c b/gcc/testsuite/gcc.target/powerpc/pr88188-2.c
new file mode 100644 (file)
index 0000000..8c3267b
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR target/88188 */
+/* { dg-do compile } */
+
+void
+foo (void)
+{
+  __asm volatile ("%D0" : : "r" (0));  /* { dg-error "invalid %D value" } */
+}