Bug 31568 - ICE with invalid %y operand (inline-asm)
Summary: ICE with invalid %y operand (inline-asm)
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 4.3.0
: P3 normal
Target Milestone: 4.4.0
Assignee: Andrew Pinski
URL: http://gcc.gnu.org/ml/gcc-patches/200...
Keywords: ice-on-invalid-code, patch
Depends on:
Blocks:
 
Reported: 2007-04-13 23:05 UTC by Andrew Pinski
Modified: 2008-07-15 12:53 UTC (History)
1 user (show)

See Also:
Host:
Target: powerpc*-*-*
Build:
Known to work:
Known to fail:
Last reconfirmed: 2007-07-09 08:50:46


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Andrew Pinski 2007-04-13 23:05:44 UTC
Testcase:
int f(int *a)
{
  asm("%y0" : "=m"(a[2]) );
}

This should instead produce an error with recommending the Z constraint.
Comment 1 Andrew Pinski 2007-07-09 08:50:46 UTC
I have a patch for this when I get back in August.
Comment 2 Andrew Pinski 2008-07-14 12:43:16 UTC
Testing this patch right now:
Index: testsuite/gcc.target/powerpc/asm-y.c
===================================================================
--- testsuite/gcc.target/powerpc/asm-y.c        (revision 0)
+++ testsuite/gcc.target/powerpc/asm-y.c        (revision 0)
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+/* Test that %yN does not cause an internal error if used incorrectly.  */
+
+int f(int *a)
+{
+  asm ("#%y0" : "=m"(a[2])); /* { dg-error "try using the 'Z' constraint" } */
+  asm ("#%y0" : "=m"(a[1])); /* { dg-error "try using the 'Z' constraint" } */
+  asm ("#%y0" : "=m"(a[0]));
+}
Index: config/rs6000/rs6000.c
===================================================================
--- config/rs6000/rs6000.c      (revision 137784)
+++ config/rs6000/rs6000.c      (working copy)
@@ -12288,9 +12288,13 @@ print_operand (FILE *file, rtx x, int co
          fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
        else
          {
-           gcc_assert (GET_CODE (tmp) == PLUS
-                       && REG_P (XEXP (tmp, 0))
-                       && REG_P (XEXP (tmp, 1)));
+           if (!GET_CODE (tmp) == PLUS
+               || !REG_P (XEXP (tmp, 0))
+               || !REG_P (XEXP (tmp, 1)))
+             {
+               output_operand_lossage ("invalid %%y value, try using the 'Z' constraint");
+               break;
+             }
 
            if (REGNO (XEXP (tmp, 0)) == 0)
              fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
Comment 3 Andrew Pinski 2008-07-15 12:53:18 UTC
Fixed.
Comment 4 Andrew Pinski 2008-07-15 12:53:42 UTC
Subject: Bug 31568

Author: pinskia
Date: Tue Jul 15 12:52:56 2008
New Revision: 137837

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=137837
Log:
2008-07-15  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR target/31568
        * config/rs6000/rs6000.c (print_operand <case 'y'>): Don't use
        gcc_assert, instead call output_operand_lossage.

2008-07-15  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR target/31568
        * gcc.target/powerpc/asm-y.c: New testcase.


Added:
    trunk/gcc/testsuite/gcc.target/powerpc/asm-y.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/rs6000/rs6000.c
    trunk/gcc/testsuite/ChangeLog