aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn David Anglin <danglin@gcc.gnu.org>2014-12-22 23:10:18 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2014-12-22 23:10:18 +0000
commit03ce701abb566ddc1b756db9c713c0150f7acb49 (patch)
treefd53c8b633e81a3820dcf82d29ebefed910b42b5
parent5341599ab6d3c313e779c8ded61844acd1283649 (diff)
downloadgcc-03ce701abb566ddc1b756db9c713c0150f7acb49.zip
gcc-03ce701abb566ddc1b756db9c713c0150f7acb49.tar.gz
gcc-03ce701abb566ddc1b756db9c713c0150f7acb49.tar.bz2
re PR target/55023 (hppa: wrong code generated with tail call optimisation)
PR target/55023 * dse.c (scan_insn): Treat sibling call as though it does a wild read. * testsuite/gcc.dg/pr55023.c: New file. From-SVN: r219037
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/dse.c11
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/pr55023.c33
4 files changed, 53 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e096b52..9f04085 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-12-22 John David Anglin <danglin@gcc.gnu.org>
+
+ PR target/55023
+ * dse.c (scan_insn): Treat sibling call as though it does a wild read.
+
2014-12-22 Bin Cheng <bin.cheng@arm.com>
PR rtl-optimization/62151
diff --git a/gcc/dse.c b/gcc/dse.c
index 2555bd1..3a7f31c 100644
--- a/gcc/dse.c
+++ b/gcc/dse.c
@@ -2483,6 +2483,17 @@ scan_insn (bb_info_t bb_info, rtx_insn *insn)
insn_info->cannot_delete = true;
+ /* Arguments for a sibling call that are pushed to memory are passed
+ using the incoming argument pointer of the current function. These
+ may or may not be frame related depending on the target. Since
+ argument pointer related stores are not currently tracked, we treat
+ a sibling call as though it does a wild read. */
+ if (SIBLING_CALL_P (insn))
+ {
+ add_wild_read (bb_info);
+ return;
+ }
+
/* Const functions cannot do anything bad i.e. read memory,
however, they can read their parameters which may have
been pushed onto the stack.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4fb6638..9337c953 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2014-12-22 John David Anglin <danglin@gcc.gnu.org>
+
+ * gcc.dg/pr55023.c: New file.
+
2014-12-22 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* lib/ubsan-dg.exp: Add library path for libstdc++.
diff --git a/gcc/testsuite/gcc.dg/pr55023.c b/gcc/testsuite/gcc.dg/pr55023.c
new file mode 100644
index 0000000..8f6b300
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr55023.c
@@ -0,0 +1,33 @@
+/* PR rtl-optimization/55023 */
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-inline" } */
+
+extern void abort (void);
+typedef long long int64_t;
+
+struct foo {
+ int x;
+ int y;
+};
+
+int64_t foo(int64_t a, int64_t b, int64_t c)
+{
+ return a + b + c;
+}
+
+int64_t bar(int64_t a, struct foo bq, struct foo cq)
+{
+ int64_t b = bq.x + bq.y;
+ int64_t c = cq.x + cq.y;
+ return foo(a, b, c);
+}
+
+int main(void)
+{
+ int64_t a = 1;
+ struct foo b = { 2, 3 };
+ struct foo c = { 4, 5 };
+ if (bar (a, b, c) != 15)
+ abort ();
+ return 0;
+}