re PR inline-asm/85034 (-O1 internal compiler error: in elimination_costs_in_insn...
authorJakub Jelinek <jakub@redhat.com>
Fri, 23 Mar 2018 09:10:02 +0000 (10:10 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 23 Mar 2018 09:10:02 +0000 (10:10 +0100)
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

gcc/ChangeLog
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr85034.c [new file with mode: 0644]

index 0be26ef2b1659b9fd8262f5c1afa4b27f6e2eff3..577cba628e4b7775642c70bac80c13a46d231cf1 100644 (file)
@@ -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.
index 485ddfbd642a5e68d10601218c889eafd116a7fd..61515e38e47741d8f6551414acf369caea637810 100644 (file)
@@ -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,
index 14e78332f9767649115d9445bc7836642f524dfe..f004851943086eff876834ae0d83df76b549f5c4 100644 (file)
@@ -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 (file)
index 0000000..4a35b11
--- /dev/null
@@ -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));
+}