re PR target/79559 (ICE in ix86_print_operand, at config/i386/i386.c:18189)
authorJakub Jelinek <jakub@redhat.com>
Sat, 18 Feb 2017 13:13:43 +0000 (14:13 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 18 Feb 2017 13:13:43 +0000 (14:13 +0100)
PR target/79559
* config/i386/i386.c (ix86_print_operand): Use output_operand_lossage
instead of gcc_assert for K, r and R code checks.  Formatting fixes.

* gcc.target/i386/pr79559.c: New test.

From-SVN: r245560

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr79559.c [new file with mode: 0644]

index 53cd408b6099f991d7843eb3896c3bd846e2aeff..90e6d1f0ae51fa1d66c85506011b0547ad64789c 100644 (file)
@@ -1,3 +1,9 @@
+2017-02-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/79559
+       * config/i386/i386.c (ix86_print_operand): Use output_operand_lossage
+       instead of gcc_assert for K, r and R code checks.  Formatting fixes.
+
 2017-02-17  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        PR target/79261
index a1c084f1b8f74a76e53adbcb478d85f31490461c..fb0dca2bf0be664a83c8a455e34f7799c54ca7d6 100644 (file)
@@ -17847,8 +17847,8 @@ ix86_print_operand (FILE *file, rtx x, int code)
              break;
 
            default:
-             output_operand_lossage
-               ("invalid operand size for operand code 'O'");
+             output_operand_lossage ("invalid operand size for operand "
+                                     "code 'O'");
              return;
            }
 
@@ -17882,15 +17882,14 @@ ix86_print_operand (FILE *file, rtx x, int code)
                  return;
 
                default:
-                 output_operand_lossage
-                   ("invalid operand size for operand code 'z'");
+                 output_operand_lossage ("invalid operand size for operand "
+                                         "code 'z'");
                  return;
                }
            }
 
          if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
-           warning
-             (0, "non-integer operand used with operand code 'z'");
+           warning (0, "non-integer operand used with operand code 'z'");
          /* FALLTHRU */
 
        case 'Z':
@@ -17952,13 +17951,12 @@ ix86_print_operand (FILE *file, rtx x, int code)
            }
          else
            {
-             output_operand_lossage
-               ("invalid operand type used with operand code 'Z'");
+             output_operand_lossage ("invalid operand type used with "
+                                     "operand code 'Z'");
              return;
            }
 
-         output_operand_lossage
-           ("invalid operand size for operand code 'Z'");
+         output_operand_lossage ("invalid operand size for operand code 'Z'");
          return;
 
        case 'd':
@@ -18157,7 +18155,12 @@ ix86_print_operand (FILE *file, rtx x, int code)
          break;
 
        case 'K':
-         gcc_assert (CONST_INT_P (x));
+         if (!CONST_INT_P (x))
+           {
+             output_operand_lossage ("operand is not an integer, invalid "
+                                     "operand code 'K'");
+             return;
+           }
 
          if (INTVAL (x) & IX86_HLE_ACQUIRE)
 #ifdef HAVE_AS_IX86_HLE
@@ -18180,8 +18183,12 @@ ix86_print_operand (FILE *file, rtx x, int code)
          return;
 
        case 'r':
-         gcc_assert (CONST_INT_P (x));
-         gcc_assert (INTVAL (x) == ROUND_SAE);
+         if (!CONST_INT_P (x) || INTVAL (x) != ROUND_SAE)
+           {
+             output_operand_lossage ("operand is not a specific integer, "
+                                     "invalid operand code 'r'");
+             return;
+           }
 
          if (ASSEMBLER_DIALECT == ASM_INTEL)
            fputs (", ", file);
@@ -18194,7 +18201,12 @@ ix86_print_operand (FILE *file, rtx x, int code)
          return;
 
        case 'R':
-         gcc_assert (CONST_INT_P (x));
+         if (!CONST_INT_P (x))
+           {
+             output_operand_lossage ("operand is not an integer, invalid "
+                                     "operand code 'R'");
+             return;
+           }
 
          if (ASSEMBLER_DIALECT == ASM_INTEL)
            fputs (", ", file);
@@ -18309,7 +18321,7 @@ ix86_print_operand (FILE *file, rtx x, int code)
          return;
 
        default:
-           output_operand_lossage ("invalid operand code '%c'", code);
+         output_operand_lossage ("invalid operand code '%c'", code);
        }
     }
 
index 035cf4739c2cc400d18ddbd8e269e50e7256674e..b4edfe81361a8048d507e675cde265c327201a92 100644 (file)
@@ -1,3 +1,8 @@
+2017-02-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/79559
+       * gcc.target/i386/pr79559.c: New test.
+
 2017-02-17  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/c11-float-2.c: New test.
diff --git a/gcc/testsuite/gcc.target/i386/pr79559.c b/gcc/testsuite/gcc.target/i386/pr79559.c
new file mode 100644 (file)
index 0000000..2eeb652
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR target/79559 */
+/* { dg-do compile } */
+
+void
+foo (int x)
+{
+  __asm__ volatile ("# %K0" : : "r" (x));      /* { dg-error "invalid operand code" } */
+  __asm__ volatile ("# %r0" : : "r" (x));      /* { dg-error "invalid operand code" } */
+  __asm__ volatile ("# %r0" : : "n" (129));    /* { dg-error "invalid operand code" } */
+  __asm__ volatile ("# %R0" : : "r" (x));      /* { dg-error "invalid operand code" } */
+}