re PR target/79804 (ICE in print_reg, at config/i386/i386.c:17637)
authorUros Bizjak <ubizjak@gmail.com>
Thu, 20 Apr 2017 20:25:17 +0000 (22:25 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Thu, 20 Apr 2017 20:25:17 +0000 (22:25 +0200)
PR target/79804
* config/i386/i386.c (print_reg): Remove assert for disalowed
regno values, call output_operand_lossage instead.

testsuite/ChangeLog:

PR target/79804
* gcc.target/i386/pr79804.c: New test.

From-SVN: r247037

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

index f4cb9193169ffb4f4c22d6c039a1bc8bbf81497f..9a94fe68ddc5e072cf739ff0f2dbe7d2ad58ef03 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-20  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/79804
+       * config/i386/i386.c (print_reg): Remove assert for disalowed
+       regno values, call output_operand_lossage instead.
+
 2017-04-20  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/78090
index 0b2fa1b1f9fe491a9828ee430d886a1962ffaccc..535181cb4a432a030b814ec21e378b2310ffe5ac 100644 (file)
@@ -17650,12 +17650,16 @@ print_reg (rtx x, int code, FILE *file)
 
   regno = REGNO (x);
 
-  gcc_assert (regno != ARG_POINTER_REGNUM
-             && regno != FRAME_POINTER_REGNUM
-             && regno != FPSR_REG
-             && regno != FPCR_REG);
-
-  if (regno == FLAGS_REG)
+  if (regno == ARG_POINTER_REGNUM
+      || regno == FRAME_POINTER_REGNUM
+      || regno == FPSR_REG
+      || regno == FPCR_REG)
+    {
+      output_operand_lossage
+       ("invalid use of register '%s'", reg_names[regno]);
+      return;
+    }
+  else if (regno == FLAGS_REG)
     {
       output_operand_lossage ("invalid use of asm flag output");
       return;
index b5b5c02a89916626259bdbbdd33b7e6e85678945..f0a4f46967bf9ca1391ac4f6b07a2688cfc162bb 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-20  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/79804
+       * gcc.target/i386/pr79804.c: New test.
+
 2017-04-20  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/78090
diff --git a/gcc/testsuite/gcc.target/i386/pr79804.c b/gcc/testsuite/gcc.target/i386/pr79804.c
new file mode 100644 (file)
index 0000000..4325131
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR target/79804 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void foo (void)
+{
+  register int r20 asm ("20");
+
+  asm volatile ("# %0" : "=r"(r20));  /* { dg-error "invalid use of register" } */
+}