re PR inline-asm/84941 (internal compiler error: in reg_overlap_mentioned_p, at rtlan...
authorJakub Jelinek <jakub@redhat.com>
Thu, 22 Mar 2018 12:31:46 +0000 (13:31 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 22 Mar 2018 12:31:46 +0000 (13:31 +0100)
PR inline-asm/84941
* function.c (match_asm_constraints_1): Don't do the optimization
if input isn't a REG, SUBREG, MEM or constant.

* gcc.dg/pr84941.c: New test.

From-SVN: r258764

gcc/ChangeLog
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr84941.c [new file with mode: 0644]

index 06320e4..5a748b6 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR inline-asm/84941
+       * function.c (match_asm_constraints_1): Don't do the optimization
+       if input isn't a REG, SUBREG, MEM or constant.
+
 2018-03-22  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/84956
index 1a09ff0..485ddfb 100644 (file)
@@ -6662,7 +6662,9 @@ match_asm_constraints_1 (rtx_insn *insn, rtx *p_sets, int noutputs)
       if (! REG_P (output)
          || rtx_equal_p (output, input)
          || (GET_MODE (input) != VOIDmode
-             && GET_MODE (input) != GET_MODE (output)))
+             && GET_MODE (input) != GET_MODE (output))
+         || !(REG_P (input) || SUBREG_P (input)
+              || MEM_P (input) || CONSTANT_P (input)))
        continue;
 
       /* We can't do anything if the output is also used as input,
index abc1b9f..4039a01 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR inline-asm/84941
+       * gcc.dg/pr84941.c: New test.
+
 2018-03-22  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/84956
diff --git a/gcc/testsuite/gcc.dg/pr84941.c b/gcc/testsuite/gcc.dg/pr84941.c
new file mode 100644 (file)
index 0000000..6f4674e
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR inline-asm/84941 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void
+foo (void)
+{
+  short *b[1] = { 0 };
+  asm volatile ("" : "=m,m" (b), "=r,r" (b) : "1,p" (b));
+}