From d8d6ea53a713ae30e8e4ccbe14ebec2002ce1f2c Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Fri, 11 Apr 2014 12:11:01 +0200
Subject: [PATCH] re PR rtl-optimization/60663 (Errors out on valid inline asm)

	PR rtl-optimization/60663
	* cse.c (cse_insn): Set src_volatile on ASM_OPERANDS in
	PARALLEL.

	* gcc.target/arm/pr60663.c: New test.

From-SVN: r209293
---
 gcc/ChangeLog                          |  6 ++++++
 gcc/cse.c                              |  7 +++++++
 gcc/testsuite/ChangeLog                |  5 +++++
 gcc/testsuite/gcc.target/arm/pr60663.c | 11 +++++++++++
 4 files changed, 29 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/arm/pr60663.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0aa9562b12e6..d702fae6b6f8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-04-11  Jakub Jelinek  <jakub@redhat.com>
+
+	PR rtl-optimization/60663
+	* cse.c (cse_insn): Set src_volatile on ASM_OPERANDS in
+	PARALLEL.
+
 2014-04-10  Jan Hubicka  <hubicka@ucw.cz>
 	    Jakub Jelinek  <jakub@redhat.com>
 
diff --git a/gcc/cse.c b/gcc/cse.c
index 852d13ebf5bc..b8223f7a35e1 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -4642,6 +4642,13 @@ cse_insn (rtx insn)
 	  && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
 	sets[i].src_volatile = 1;
 
+      /* Also do not record result of a non-volatile inline asm with
+	 more than one result or with clobbers, we do not want CSE to
+	 break the inline asm apart.  */
+      else if (GET_CODE (src) == ASM_OPERANDS
+	       && GET_CODE (x) == PARALLEL)
+	sets[i].src_volatile = 1;
+
 #if 0
       /* It is no longer clear why we used to do this, but it doesn't
 	 appear to still be needed.  So let's try without it since this
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a8bf48f4d53e..c9dbd8a2643e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-04-11  Jakub Jelinek  <jakub@redhat.com>
+
+	PR rtl-optimization/60663
+	* gcc.target/arm/pr60663.c: New test.
+
 2014-04-10  Jason Merrill  <jason@redhat.com>
 
 	* g++.dg/dso/dlclose1.C: Disable for 4.9.
diff --git a/gcc/testsuite/gcc.target/arm/pr60663.c b/gcc/testsuite/gcc.target/arm/pr60663.c
new file mode 100644
index 000000000000..b79b830e1a9d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr60663.c
@@ -0,0 +1,11 @@
+/* PR rtl-optimization/60663 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=armv7-a" } */
+
+int
+foo (void)
+{
+  unsigned i, j;
+  asm ("%0 %1" : "=r" (i), "=r" (j));
+  return i;
+}
-- 
GitLab