aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <andrew_pinski@playstation.sony.com>2008-07-15 12:52:56 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2008-07-15 05:52:56 -0700
commitcb8cc791fdc4912ebf3cbe935f7912569e4e6ac3 (patch)
tree3104440e046416750f78f036d0fce5f546443487 /gcc
parentf73c3e7c4e08d4bcbe66dbb7f83ff8c023940dcd (diff)
downloadgcc-cb8cc791fdc4912ebf3cbe935f7912569e4e6ac3.zip
gcc-cb8cc791fdc4912ebf3cbe935f7912569e4e6ac3.tar.gz
gcc-cb8cc791fdc4912ebf3cbe935f7912569e4e6ac3.tar.bz2
re PR target/31568 (ICE with invalid %y operand (inline-asm))
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. From-SVN: r137837
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/powerpc/asm-y.c11
4 files changed, 29 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 78c6f43..e0ce324 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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 Kai Tietz <kai.tietz@onevision.com>
* builtins.c (std_canonical_va_list): Treat structure based
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 214b692..57e8d5a 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -12288,9 +12288,13 @@ print_operand (FILE *file, rtx x, int code)
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)) ],
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3e71625..4526d9f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-07-15 Andrew Pinski <andrew_pinski@playstation.sony.com>
+
+ PR target/31568
+ * gcc.target/powerpc/asm-y.c: New testcase.
+
2008-07-14 Eric Botcazou <ebotcazou@adacore.com>
* case_optimization1.ad[sb]: New test.
diff --git a/gcc/testsuite/gcc.target/powerpc/asm-y.c b/gcc/testsuite/gcc.target/powerpc/asm-y.c
new file mode 100644
index 0000000..7d5a6a6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/asm-y.c
@@ -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]));
+}