[gcc/devel/c++-modules] auto-inc-dec: Don't add incs/decs to bare CLOBBERs [PR93124]

Nathan Sidwell nathan@gcc.gnu.org
Fri Jan 24 14:39:00 GMT 2020


https://gcc.gnu.org/g:ccb68179642cf7ba5ee05a0d8571a95d0145e3a2

commit ccb68179642cf7ba5ee05a0d8571a95d0145e3a2
Author: Richard Sandiford <richard.sandiford@arm.com>
Date:   Mon Jan 20 18:28:38 2020 +0000

    auto-inc-dec: Don't add incs/decs to bare CLOBBERs [PR93124]
    
    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.

Diff:
---
 gcc/ChangeLog                          |  6 +++++
 gcc/auto-inc-dec.c                     | 12 +++++++---
 gcc/testsuite/ChangeLog                |  4 ++++
 gcc/testsuite/gcc.dg/torture/pr93124.c | 44 ++++++++++++++++++++++++++++++++++
 4 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 55b2392..d16ebbb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/auto-inc-dec.c b/gcc/auto-inc-dec.c
index 268231e..7d0d914 100644
--- a/gcc/auto-inc-dec.c
+++ b/gcc/auto-inc-dec.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eeeb120..d10c6fc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..16bc8b5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr93124.c
@@ -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);
+    }
+  }
+}



More information about the Gcc-cvs mailing list