aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2020-01-20 18:28:38 +0000
committerRichard Sandiford <richard.sandiford@arm.com>2020-01-23 09:19:15 +0000
commitccb68179642cf7ba5ee05a0d8571a95d0145e3a2 (patch)
treebb866a5e9962d58d733d13c3c95c251dc61c33e9
parent92bea423c295f5c6c9b0cf06a5a555011cc98bdc (diff)
downloadgcc-ccb68179642cf7ba5ee05a0d8571a95d0145e3a2.zip
gcc-ccb68179642cf7ba5ee05a0d8571a95d0145e3a2.tar.gz
gcc-ccb68179642cf7ba5ee05a0d8571a95d0145e3a2.tar.bz2
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.
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/auto-inc-dec.c12
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr93124.c44
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);
+ }
+ }
+}