re PR inline-asm/93027 (ICE: in match_reload, at lra-constraints.c:1060)
authorVladimir Makarov <vmakarov@redhat.com>
Fri, 10 Jan 2020 20:07:45 +0000 (20:07 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Fri, 10 Jan 2020 20:07:45 +0000 (20:07 +0000)
2020-01-10  Vladimir Makarov  <vmakarov@redhat.com>

PR inline-asm/93207
* lra-constraints.c (match_reload): Permit input operands have the
same mode as output while other input operands have a different
mode.

2020-01-10  Vladimir Makarov  <vmakarov@redhat.com>

PR inline-asm/93207
* gcc.target/i386/pr93207.c: New test.

From-SVN: r280133

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr93207.c [new file with mode: 0644]

index acdebad529916a0aa9b4b70138f32024678fd1e1..e9c00524cdd93cb027800fbce8f7658c3b0d18ee 100644 (file)
@@ -1,3 +1,10 @@
+2020-01-10  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR inline-asm/93207
+       * lra-constraints.c (match_reload): Permit input operands have the
+       same mode as output while other input operands have a different
+       mode.
+
 2020-01-10  Wilco Dijkstra  <wdijkstr@arm.com>
 
        PR tree-optimization/90838
index 57e2457efacb1cd1b6854acd284c4be61938b040..f71e0c9ff8de6e9adc190d56d147b678cac8e946 100644 (file)
@@ -1054,12 +1054,15 @@ match_reload (signed char out, signed char *ins, signed char *outs,
   curr_insn_input_reloads[curr_insn_input_reloads_num].match_p = true;
   curr_insn_input_reloads[curr_insn_input_reloads_num++].reg = new_in_reg;
   for (i = 0; (in = ins[i]) >= 0; i++)
-    {
-      lra_assert
-       (GET_MODE (*curr_id->operand_loc[in]) == VOIDmode
-        || GET_MODE (new_in_reg) == GET_MODE (*curr_id->operand_loc[in]));
+    if (GET_MODE (*curr_id->operand_loc[in]) == VOIDmode
+       || GET_MODE (new_in_reg) == GET_MODE (*curr_id->operand_loc[in]))
       *curr_id->operand_loc[in] = new_in_reg;
-    }
+    else
+      {
+       lra_assert
+         (GET_MODE (new_out_reg) == GET_MODE (*curr_id->operand_loc[in]));
+       *curr_id->operand_loc[in] = new_out_reg;
+      }
   lra_update_dups (curr_id, ins);
   if (out < 0)
     return;
index 42820ef16eaef3b034971355a8401f9280a94245..1edada1ca15a701e28a6431e4096543a6bf7ec87 100644 (file)
@@ -1,3 +1,8 @@
+2020-01-10  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR inline-asm/93207
+       * gcc.target/i386/pr93207.c: New test.
+
 2020-01-10  Wilco Dijkstra  <wdijkstr@arm.com>
 
        * testsuite/gcc.target/aarch64/pr90838.c: New test.
diff --git a/gcc/testsuite/gcc.target/i386/pr93207.c b/gcc/testsuite/gcc.target/i386/pr93207.c
new file mode 100644 (file)
index 0000000..1bd571d
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR inline-asm/93207 */
+/* { dg-do compile } */
+/* { dg-options "-O0" } */
+
+int main (void) {
+  int f = 0, w;
+
+  asm volatile(
+    ""
+    : "+m&l"(f)
+    : "0a"(&w)
+  );
+  return 0;
+}