diff options
author | Richard Sandiford <rsandifo@gcc.gnu.org> | 2007-12-18 07:40:17 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2007-12-18 07:40:17 +0000 |
commit | eef75f5ec020e74ff2c9a90ffed32427abfba837 (patch) | |
tree | 5322d5e68639e47b06f7c6531dcdf93b7aa38e00 /gcc | |
parent | b6541c1068441d06393f9c93829138bc1340f4da (diff) | |
download | gcc-eef75f5ec020e74ff2c9a90ffed32427abfba837.zip gcc-eef75f5ec020e74ff2c9a90ffed32427abfba837.tar.gz gcc-eef75f5ec020e74ff2c9a90ffed32427abfba837.tar.bz2 |
200x-xx-xx Kaz Kylheku <kaz@zeugmasystems.com>
gcc/
200x-xx-xx Kaz Kylheku <kaz@zeugmasystems.com>
PR rtl-optimization/34456
* resource.c (mark_set_resources): Use regs_invalidated_by_call
rather than call_used_regs and global_regs.
gcc/testsuite/
PR rtl-optimization/34456
* gcc.c-torture/execute/pr34456.c: New test.
From-SVN: r131033
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/resource.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr34456.c | 30 |
4 files changed, 43 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c3595a4..a482ad8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-12-18 Kaz Kylheku <kaz@zeugmasystems.com> + + PR rtl-optimization/34456 + * resource.c (mark_set_resources): Use regs_invalidated_by_call + rather than call_used_regs and global_regs. + 2007-12-18 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/34490 diff --git a/gcc/resource.c b/gcc/resource.c index 2ffde4f..d7e3339 100644 --- a/gcc/resource.c +++ b/gcc/resource.c @@ -663,9 +663,8 @@ mark_set_resources (rtx x, struct resources *res, int in_dest, rtx link; res->cc = res->memory = 1; - for (r = 0; r < FIRST_PSEUDO_REGISTER; r++) - if (call_used_regs[r] || global_regs[r]) - SET_HARD_REG_BIT (res->regs, r); + + IOR_HARD_REG_SET (res->regs, regs_invalidated_by_call); for (link = CALL_INSN_FUNCTION_USAGE (x); link; link = XEXP (link, 1)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e75f2aa..bc09250 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-12-18 Richard Sandiford <rsandifo@nildram.co.uk> + + PR rtl-optimization/34456 + * gcc.c-torture/execute/pr34456.c: New test. + 2007-12-18 Jakub Jelinek <jakub@redhat.com> PR c++/34488 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr34456.c b/gcc/testsuite/gcc.c-torture/execute/pr34456.c new file mode 100644 index 0000000..526c954 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr34456.c @@ -0,0 +1,30 @@ +#include <stdlib.h> + +int __attribute__ ((noinline)) debug (void) { return 1; } +int errors; + +struct s { int elt; int (*compare) (int); }; + +static int +compare (const void *x, const void *y) +{ + const struct s *s1 = x, *s2 = y; + int (*compare1) (int); + int elt2; + + compare1 = s1->compare; + elt2 = s2->elt; + if (elt2 != 0 && debug () && compare1 (s1->elt) != 0) + errors++; + return compare1 (elt2); +} + +int bad_compare (int x) { return -x; } +struct s array[2] = { { 1, bad_compare }, { -1, bad_compare } }; + +int +main (void) +{ + qsort (array, 2, sizeof (struct s), compare); + return errors == 0; +} |