aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-03-30 22:16:52 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-03-30 22:16:52 +0200
commit03a5f060b9bdcf4520645cb4e6c15297e3eea060 (patch)
tree62931f856516f4b4de948b98b3788cef3bad0e7d
parent8533c9d8ac498572eec1978b30860b487e47ade3 (diff)
downloadgcc-03a5f060b9bdcf4520645cb4e6c15297e3eea060.zip
gcc-03a5f060b9bdcf4520645cb4e6c15297e3eea060.tar.gz
gcc-03a5f060b9bdcf4520645cb4e6c15297e3eea060.tar.bz2
re PR debug/43593 (Var-tracking unnecessarily flushes all call used registers on calls instead of regs invalidated by call)
PR debug/43593 * var-tracking.c (dataflow_set_clear_at_call): Invalidate just regs_invalidated_by_call instead all call_used_reg_set registers. * gcc.dg/guality/pr43593.c: New test. From-SVN: r157834
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr43593.c24
-rw-r--r--gcc/var-tracking.c2
4 files changed, 37 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a533a7f..cddbce7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-03-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/43593
+ * var-tracking.c (dataflow_set_clear_at_call): Invalidate
+ just regs_invalidated_by_call instead all call_used_reg_set
+ registers.
+
2010-03-30 Sebastian Pop <sebastian.pop@amd.com>
PR middle-end/43430
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c9ede61..a7af1c6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-03-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/43593
+ * gcc.dg/guality/pr43593.c: New test.
+
2010-03-30 Sebastian Pop <sebastian.pop@amd.com>
PR middle-end/43430
diff --git a/gcc/testsuite/gcc.dg/guality/pr43593.c b/gcc/testsuite/gcc.dg/guality/pr43593.c
new file mode 100644
index 0000000..d8cc413
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/guality/pr43593.c
@@ -0,0 +1,24 @@
+/* PR debug/43593 */
+/* { dg-do run } */
+/* { dg-options "-g" } */
+
+void __attribute__((noinline))
+bar (int *p)
+{
+ asm volatile ("" : : "r" (p) : "memory");
+}
+
+int __attribute__((noinline))
+foo (void)
+{
+ int i, *j = &i;
+ bar (j);
+ return 6 + i; /* { dg-final { gdb-test 16 "j" "&i" } } */
+}
+
+int
+main (void)
+{
+ foo ();
+ return 0;
+}
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index bff7d11..e0f7229 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -4170,7 +4170,7 @@ dataflow_set_clear_at_call (dataflow_set *set)
int r;
for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
- if (TEST_HARD_REG_BIT (call_used_reg_set, r))
+ if (TEST_HARD_REG_BIT (regs_invalidated_by_call, r))
var_regno_delete (set, r);
if (MAY_HAVE_DEBUG_INSNS)