auto-inc-dec: Don't add incs/decs to bare CLOBBERs [PR93124]
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 20 Jan 2020 18:28:38 +0000 (18:28 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Thu, 23 Jan 2020 09:19:15 +0000 (09:19 +0000)
In this PR, auto-inc-dec was trying to turn:

    (set (reg X) (plus (reg X) (const_int N)))
    (clobber (mem (reg X)))

into:

    (clobber (mem (pre_modify (reg X) ...)))

But bare clobber insns are just there to describe dataflow.  They're
not supposed to generate any code.

2020-01-23  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
PR rtl-optimization/93124
* auto-inc-dec.c (merge_in_block): Don't add auto inc/decs to
bare USE and CLOBBER insns.

gcc/testsuite/
* gcc.dg/torture/pr93124.c: New test.

gcc/ChangeLog
gcc/auto-inc-dec.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr93124.c [new file with mode: 0644]

index 55b23927f763b054c5ecd5c3371461c292431806..d16ebbb7c3a13ec65d2c7e0c1e255e11d8ed55f5 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-23  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR rtl-optimization/93124
+       * auto-inc-dec.c (merge_in_block): Don't add auto inc/decs to
+       bare USE and CLOBBER insns.
+
 2020-01-22  Andrew Pinski  <apinski@marvell.com>
 
        * config/arc/arc.c (output_short_suffix): Check insn for nullness.
index 268231ecaff1e33696b70446f3c2553ccbad4696..7d0d91403f3856ceb5acd6768a14d929f4ec4b33 100644 (file)
@@ -1602,9 +1602,15 @@ merge_in_block (int max_reg, basic_block bb)
       else
        {
          insn_is_add_or_inc = false;
-         mem_insn.insn = insn;
-         if (find_mem (&PATTERN (insn)))
-           success_in_block++;
+         /* We can't use auto inc/dec for bare USEs and CLOBBERs,
+            since they aren't supposed to generate any code.  */
+         rtx_code code = GET_CODE (PATTERN (insn));
+         if (code != USE && code != CLOBBER)
+           {
+             mem_insn.insn = insn;
+             if (find_mem (&PATTERN (insn)))
+               success_in_block++;
+           }
        }
 
       /* If the inc insn was merged with a mem, the inc insn is gone
index eeeb1209d19b3125a230c461944600e022c969f5..d10c6fc8b81158e136a4dfdd47d3e14f430c6ef9 100644 (file)
@@ -1,3 +1,7 @@
+2020-01-23  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * gcc.dg/torture/pr93124.c: New test.
+
 2020-01-22  David Malcolm  <dmalcolm@redhat.com>
 
        PR analyzer/93382
diff --git a/gcc/testsuite/gcc.dg/torture/pr93124.c b/gcc/testsuite/gcc.dg/torture/pr93124.c
new file mode 100644 (file)
index 0000000..16bc8b5
--- /dev/null
@@ -0,0 +1,44 @@
+/* { dg-additional-options "-fno-rerun-cse-after-loop -fno-guess-branch-probability -fno-tree-fre" } */
+
+int x;
+
+void fn2 ();
+void fn3 ();
+void fn4 ();
+void fn5 ();
+void fn6 ();
+
+void
+fn1 (void)
+{
+  int n;
+  for (n = 0;; ++n) {
+    {
+      struct { char a[n]; } s;
+      fn2 (s);
+    }
+    struct { unsigned a[x]; } s;
+    int i, b;
+    for (i = 0; i < n; ++i)
+      ;
+    fn2 (s);
+    {
+      struct { char a[n]; } s;
+      int i;
+      for (i = 0; i < n; ++i)
+        s.a[i] = i;
+      fn3 (s, s);
+    }
+    fn4 ();
+    {
+      struct { unsigned a[n]; } s;
+      fn5 (s);
+    }
+    {
+      struct { char a[b]; } s;
+      for (; i < n;)
+        s.a[i] = i;
+      fn6 (s);
+    }
+  }
+}