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
This commit is contained in:
John David Anglin 2014-12-22 23:10:18 +00:00
parent 5341599ab6
commit 03ce701abb
4 changed files with 53 additions and 0 deletions

View File

@ -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

View File

@ -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.

View File

@ -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++.

View File

@ -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;
}