[gcc(refs/vendors/redhat/heads/gcc-9-branch)] backport: re PR inline-asm/92615 (ICE in extract_insn)

Jakub Jelinek jakub@gcc.gnu.org
Wed Jan 22 20:21:00 GMT 2020


https://gcc.gnu.org/g:bf5fabe45feb014df124b52175bb4fcf6597b4b5

commit bf5fabe45feb014df124b52175bb4fcf6597b4b5
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Fri Dec 20 17:57:21 2019 +0100

    backport: re PR inline-asm/92615 (ICE in extract_insn)
    
    	Backported from mainline
    	2019-11-23  Jakub Jelinek  <jakub@redhat.com>
    
    	PR target/92615
    	* config/i386/i386.c (ix86_md_asm_adjust): If dest_mode is
    	GET_MODE (dest), is not QImode, using ZERO_EXTEND and dest is not
    	register_operand, force x into register before storing it into dest.
    	Formatting fix.
    
    	* gcc.target/i386/pr92615.c: New test.

Diff:
---
 gcc/ChangeLog                           | 11 ++++++++
 gcc/config/i386/i386.c                  | 10 +++++---
 gcc/testsuite/ChangeLog                 |  5 ++++
 gcc/testsuite/gcc.target/i386/pr92615.c | 45 +++++++++++++++++++++++++++++++++
 4 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3718e9f..9fc21d2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2019-12-20  Jakub Jelinek  <jakub@redhat.com>
+
+	Backported from mainline
+	2019-11-23  Jakub Jelinek  <jakub@redhat.com>
+
+	PR target/92615
+	* config/i386/i386.c (ix86_md_asm_adjust): If dest_mode is
+	GET_MODE (dest), is not QImode, using ZERO_EXTEND and dest is not
+	register_operand, force x into register before storing it into dest.
+	Formatting fix.
+
 2019-12-20  Roman Zhuykov  <zhroma@ispras.ru>
 
 	Backport from mainline
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index ce3fbd1..ed1f767 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -44385,11 +44385,15 @@ ix86_md_asm_adjust (vec<rtx> &outputs, vec<rtx> &/*inputs*/,
 	    {
 	      x = force_reg (dest_mode, const0_rtx);
 
-	      emit_insn (gen_movstrictqi
-			 (gen_lowpart (QImode, x), destqi));
+	      emit_insn (gen_movstrictqi (gen_lowpart (QImode, x), destqi));
 	    }
 	  else
-	    x = gen_rtx_ZERO_EXTEND (dest_mode, destqi);
+	    {
+	      x = gen_rtx_ZERO_EXTEND (dest_mode, destqi);
+	      if (dest_mode == GET_MODE (dest)
+		  && !register_operand (dest, GET_MODE (dest)))
+		x = force_reg (dest_mode, x);
+	    }
 	}
 
       if (dest_mode != GET_MODE (dest))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f1774d3..37fb37f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,11 @@
 2019-12-20  Jakub Jelinek  <jakub@redhat.com>
 
 	Backported from mainline
+	2019-11-23  Jakub Jelinek  <jakub@redhat.com>
+
+	PR target/92615
+	* gcc.target/i386/pr92615.c: New test.
+
 	2019-11-22  Jakub Jelinek  <jakub@redhat.com>
 
 	PR c/90677
diff --git a/gcc/testsuite/gcc.target/i386/pr92615.c b/gcc/testsuite/gcc.target/i386/pr92615.c
new file mode 100644
index 0000000..b84bfcd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr92615.c
@@ -0,0 +1,45 @@
+/* PR target/92615 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void *a;
+long long b;
+char c;
+
+void
+foo (void)
+{
+  void *p;
+  long long q;
+  char r;
+  __asm__ ("" : : "r" (&p), "r" (&q), "r" (&r));
+  __asm__ ("" : "=@cca" (p));
+  a = p;
+  __asm__ ("" : "=@cca" (q));
+  b = q;
+  __asm__ ("" : "=@cca" (r));
+  c = r;
+  __asm__ ("" : : "r" (&p), "r" (&q), "r" (&r));
+}
+
+void
+bar (void)
+{
+  void *p;
+  long long q;
+  char r;
+  __asm__ ("" : "=@cca" (p));
+  a = p;
+  __asm__ ("" : "=@cca" (q));
+  b = q;
+  __asm__ ("" : "=@cca" (r));
+  c = r;
+  __asm__ ("" : : "r" (p), "A" (q), "q" (r));
+}
+
+void
+baz (void)
+{
+  void *p = (void *) &p;
+  __asm__ __volatile__ ("" : "=@ccng" (p) : "r" (1));
+}



More information about the Gcc-cvs mailing list