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:
parent
5341599ab6
commit
03ce701abb
4 changed files with 53 additions and 0 deletions
|
@ -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
|
||||
|
|
11
gcc/dse.c
11
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.
|
||||
|
|
|
@ -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++.
|
||||
|
|
33
gcc/testsuite/gcc.dg/pr55023.c
Normal file
33
gcc/testsuite/gcc.dg/pr55023.c
Normal 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue