From 03ce701abb566ddc1b756db9c713c0150f7acb49 Mon Sep 17 00:00:00 2001 From: John David Anglin Date: Mon, 22 Dec 2014 23:10:18 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/dse.c | 11 +++++++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/pr55023.c | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr55023.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e096b52da3f..9f0408506a5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-12-22 John David Anglin + + PR target/55023 + * dse.c (scan_insn): Treat sibling call as though it does a wild read. + 2014-12-22 Bin Cheng PR rtl-optimization/62151 diff --git a/gcc/dse.c b/gcc/dse.c index 2555bd1d5a9..3a7f31c1b83 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 4fb663862cd..9337c95374e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-12-22 John David Anglin + + * gcc.dg/pr55023.c: New file. + 2014-12-22 Francois-Xavier Coudert * 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 00000000000..8f6b300b17b --- /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; +}