Commit 03ce701a by John David Anglin

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
parent 5341599a
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
......@@ -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.
......
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++.
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment