From 03830a6fbdf11b26e035bae3305d0e41128b814c Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 20 Dec 2019 17:57:21 +0100 Subject: [PATCH] backport: re PR inline-asm/92615 (ICE in extract_insn) Backported from mainline 2019-11-23 Jakub Jelinek 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. From-SVN: r279651 --- 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(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr92615.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9b5b4a0cf5b9..6803846520c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2019-12-20 Jakub Jelinek + + Backported from mainline + 2019-11-23 Jakub Jelinek + + 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 Backport from mainline diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index ce3fbd120ed7..ed1f767c7496 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -44385,11 +44385,15 @@ ix86_md_asm_adjust (vec &outputs, vec &/*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 c1d3e99b58a3..f3d0452f6e8a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2019-12-20 Jakub Jelinek Backported from mainline + 2019-11-23 Jakub Jelinek + + PR target/92615 + * gcc.target/i386/pr92615.c: New test. + 2019-11-22 Jakub Jelinek 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 000000000000..b84bfcdabbe2 --- /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)); +} -- 2.47.2