aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-03-17 13:35:04 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-03-17 13:35:04 +0100
commit1b6fa86002afb4a8f28ab40afc812ec5e73ccba6 (patch)
treef38d80304975154c0fc076b80fccc2023ac48021
parentcb21e9cdf7176be9c23c3a003822cf7a3d3f4995 (diff)
downloadgcc-1b6fa86002afb4a8f28ab40afc812ec5e73ccba6.zip
gcc-1b6fa86002afb4a8f28ab40afc812ec5e73ccba6.tar.gz
gcc-1b6fa86002afb4a8f28ab40afc812ec5e73ccba6.tar.bz2
re PR rtl-optimization/48141 (DSE compile time hog)
PR rtl-optimization/48141 * dse.c (record_store): If no positions are needed in an insn that cannot be deleted, at least unchain it from active_local_stores. * gcc.dg/pr48141.c: New test. From-SVN: r171089
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dse.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr48141.c17
4 files changed, 32 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8ab1bd0..a0bdc23 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-03-17 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/48141
+ * dse.c (record_store): If no positions are needed in an insn
+ that cannot be deleted, at least unchain it from active_local_stores.
+
2011-03-16 Dodji Seketeli <dodji@redhat.com>
PR debug/47510
diff --git a/gcc/dse.c b/gcc/dse.c
index 8e9b645..e43ab72 100644
--- a/gcc/dse.c
+++ b/gcc/dse.c
@@ -1,5 +1,5 @@
/* RTL dead store elimination.
- Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
Contributed by Richard Sandiford <rsandifor@codesourcery.com>
@@ -1530,8 +1530,7 @@ record_store (rtx body, bb_info_t bb_info)
/* An insn can be deleted if every position of every one of
its s_infos is zero. */
- if (any_positions_needed_p (s_info)
- || ptr->cannot_delete)
+ if (any_positions_needed_p (s_info))
del = false;
if (del)
@@ -1543,7 +1542,8 @@ record_store (rtx body, bb_info_t bb_info)
else
active_local_stores = ptr->next_local_store;
- delete_dead_store_insn (insn_to_delete);
+ if (!insn_to_delete->cannot_delete)
+ delete_dead_store_insn (insn_to_delete);
}
else
last = ptr;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b057524..b76cd47 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-03-17 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/48141
+ * gcc.dg/pr48141.c: New test.
+
2011-03-16 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/constexpr-48089.C: New.
diff --git a/gcc/testsuite/gcc.dg/pr48141.c b/gcc/testsuite/gcc.dg/pr48141.c
new file mode 100644
index 0000000..006f5cb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr48141.c
@@ -0,0 +1,17 @@
+/* PR rtl-optimization/48141 */
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+#define A i = 0;
+#define B A A A A A A A A A A
+#define C B B B B B B B B B B
+#define D C C C C C C C C C C
+#define E D D D D D D D D D D
+
+int
+foo (void)
+{
+ volatile int i = 0;
+ E E E E E E E E E E E
+ return 0;
+}