aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@gcc.gnu.org>2007-12-18 07:40:17 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2007-12-18 07:40:17 +0000
commiteef75f5ec020e74ff2c9a90ffed32427abfba837 (patch)
tree5322d5e68639e47b06f7c6531dcdf93b7aa38e00 /gcc
parentb6541c1068441d06393f9c93829138bc1340f4da (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/resource.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr34456.c30
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;
+}