diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-03-23 10:10:02 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-03-23 10:10:02 +0100 |
commit | b3d8938043f400cb462600c3f5fb7d346c45caea (patch) | |
tree | 87a36277bfe60adbaba670aa6d98cea3143ac6fb /gcc | |
parent | 6f5799be393e835b4cce70d070ae30039fdf38a7 (diff) | |
download | gcc-b3d8938043f400cb462600c3f5fb7d346c45caea.zip gcc-b3d8938043f400cb462600c3f5fb7d346c45caea.tar.gz gcc-b3d8938043f400cb462600c3f5fb7d346c45caea.tar.bz2 |
re PR inline-asm/85034 (-O1 internal compiler error: in elimination_costs_in_insn, at reload1.c:3633)
PR inline-asm/85034
* function.c (match_asm_constraints_1): Don't optimize if input
doesn't satisfy general_operand predicate for output's mode.
* gcc.target/i386/pr85034.c: New test.
From-SVN: r258796
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/function.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr85034.c | 11 |
4 files changed, 20 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0be26ef..577cba6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2018-03-23 Jakub Jelinek <jakub@redhat.com> + PR inline-asm/85034 + * function.c (match_asm_constraints_1): Don't optimize if input + doesn't satisfy general_operand predicate for output's mode. + PR inline-asm/85022 * alias.c (write_dependence_p): Don't require for x_canonicalized non-VOIDmode if x has VOIDmode. diff --git a/gcc/function.c b/gcc/function.c index 485ddfb..61515e3 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -6661,10 +6661,9 @@ match_asm_constraints_1 (rtx_insn *insn, rtx *p_sets, int noutputs) /* Only do the transformation for pseudos. */ if (! REG_P (output) || rtx_equal_p (output, input) - || (GET_MODE (input) != VOIDmode - && GET_MODE (input) != GET_MODE (output)) || !(REG_P (input) || SUBREG_P (input) - || MEM_P (input) || CONSTANT_P (input))) + || MEM_P (input) || CONSTANT_P (input)) + || !general_operand (input, GET_MODE (output))) continue; /* We can't do anything if the output is also used as input, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 14e7833..f004851 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2018-03-23 Jakub Jelinek <jakub@redhat.com> + PR inline-asm/85034 + * gcc.target/i386/pr85034.c: New test. + PR inline-asm/85022 * c-c++-common/torture/pr85022.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/pr85034.c b/gcc/testsuite/gcc.target/i386/pr85034.c new file mode 100644 index 0000000..4a35b11 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr85034.c @@ -0,0 +1,11 @@ +/* PR inline-asm/85034 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void +foo (void) +{ + volatile float a; + struct S { char a; } b = { 0 }; + asm volatile ("" : "=r" (a) : "0ir" (b)); +} |