[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