aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2005-01-18 17:52:33 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2005-01-18 09:52:33 -0800
commitb4c33883987fe5c5a8022d02fa7579688d37b927 (patch)
tree40a09ff51423bf68a0d6f2772f26d18edcd6a83a /gcc
parent56015ceeb5303ecc35444b1d3d5efbaa79e5f030 (diff)
downloadgcc-b4c33883987fe5c5a8022d02fa7579688d37b927.zip
gcc-b4c33883987fe5c5a8022d02fa7579688d37b927.tar.gz
gcc-b4c33883987fe5c5a8022d02fa7579688d37b927.tar.bz2
re PR c/19472 (compiler internal error: in var_ann, at tree-flow-inline.h:34)
2005-01-18 Andrew Pinski <pinskia@physics.uc.edu> PR c/19472 * semantics.c (finish_asm_stmt): Strip nops off input memory operands. 2005-01-18 Andrew Pinski <pinskia@physics.uc.edu> PR C/19472 * c-typeck.c (build_asm_expr): Strip nops off input memory operands. 2005-01-18 Andrew Pinski <pinskia@physics.uc.edu> PR C/19472 * gcc.dg/asm-a.c: New test. From-SVN: r93840
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-typeck.c10
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/asm-a.c14
6 files changed, 47 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 396f7ce..0ca0d44 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-01-18 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR C/19472
+ * c-typeck.c (build_asm_expr): Strip nops off
+ input memory operands.
+
2005-01-18 David Edelsohn <edelsohn@gnu.org>
* config/rs6000/aix43.h (CPLUSPLUS_CPP_SPEC): Delete
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 2b06502..f26e386 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -6335,8 +6335,14 @@ build_asm_expr (tree string, tree outputs, tree inputs, tree clobbers,
{
/* If the operand is going to end up in memory,
mark it addressable. */
- if (!allows_reg && allows_mem && !c_mark_addressable (input))
- input = error_mark_node;
+ if (!allows_reg && allows_mem)
+ {
+ /* Strip the nops as we allow this case. FIXME, this really
+ should be rejected or made deprecated. */
+ STRIP_NOPS (input);
+ if (!c_mark_addressable (input))
+ input = error_mark_node;
+ }
}
else
input = error_mark_node;
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7301400..76e41b5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2005-01-18 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR c/19472
+ * semantics.c (finish_asm_stmt): Strip nops off
+ input memory operands.
+
2005-01-18 Kazu Hirata <kazu@cs.umass.edu>
* Make-lang.in, call.c, cvt.c, init.c, rtti.c, tree.c,
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index b34de19..2dc0cbb 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1206,8 +1206,14 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands,
{
/* If the operand is going to end up in memory,
mark it addressable. */
- if (!allows_reg && allows_mem && !cxx_mark_addressable (operand))
- operand = error_mark_node;
+ if (!allows_reg && allows_mem)
+ {
+ /* Strip the nops as we allow this case. FIXME, this really
+ should be rejected or made deprecated. */
+ STRIP_NOPS (operand);
+ if (!cxx_mark_addressable (operand))
+ operand = error_mark_node;
+ }
}
else
operand = error_mark_node;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 634daa6..aef18d0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-18 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR c/19472
+ * gcc.dg/asm-a.c: New test.
+
2005-01-18 Kaz Kojima <kkojima@gcc.gnu.org>
* gcc.dg/sh-relax.c: Add prototype for abort.
diff --git a/gcc/testsuite/gcc.dg/asm-a.c b/gcc/testsuite/gcc.dg/asm-a.c
new file mode 100644
index 0000000..aca2d4e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/asm-a.c
@@ -0,0 +1,14 @@
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O2" } */
+
+/* The problem was we were not striping the long cast here.
+ Note this really should be invalid code but not for the
+ current release (4.0) as we have people using it. */
+
+void blockCopy_MMX2(int*);
+void postProcess_MMX2()
+{
+ int c, x,y, width;
+ asm( "" :: "m" ((long)x));
+ blockCopy_MMX2(&c);
+}