aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/alias.c9
-rw-r--r--gcc/rtl.h1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr46387.c32
-rw-r--r--gcc/var-tracking.c5
6 files changed, 59 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 26dff01..fc7c8d1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-11-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/46387
+ * rtl.h (vt_equate_reg_base_value): New prototype.
+ * alias.c (vt_equate_reg_base_value): New function.
+ * var-tracking.c (vt_init_cfa_base): Use it.
+
2010-11-15 Jan Hubicka <jh@suse.cz>
Diego Novillo <dnovillo@google.com>
diff --git a/gcc/alias.c b/gcc/alias.c
index 2e0ac06..2a87797 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -2906,6 +2906,15 @@ init_alias_analysis (void)
timevar_pop (TV_ALIAS_ANALYSIS);
}
+/* Equate REG_BASE_VALUE (reg1) to REG_BASE_VALUE (reg2).
+ Special API for var-tracking pass purposes. */
+
+void
+vt_equate_reg_base_value (const_rtx reg1, const_rtx reg2)
+{
+ VEC_replace (rtx, reg_base_value, REGNO (reg1), REG_BASE_VALUE (reg2));
+}
+
void
end_alias_analysis (void)
{
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 3e1df2c..66751a6 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2503,6 +2503,7 @@ extern int may_alias_p (const_rtx, const_rtx);
extern void init_alias_target (void);
extern void init_alias_analysis (void);
extern void end_alias_analysis (void);
+extern void vt_equate_reg_base_value (const_rtx, const_rtx);
extern bool memory_modified_in_insn_p (const_rtx, const_rtx);
extern rtx find_base_term (rtx);
extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c855ae3..5b8a56e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/46387
+ * gcc.dg/pr46387.c: New test.
+
2010-11-15 Nicola Pero <nicola.pero@meta-innovation.com>
* objc.dg/property/dotsyntax-16.m: New.
diff --git a/gcc/testsuite/gcc.dg/pr46387.c b/gcc/testsuite/gcc.dg/pr46387.c
new file mode 100644
index 0000000..e06bd3b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr46387.c
@@ -0,0 +1,32 @@
+/* PR debug/46387 */
+/* { dg-do compile } */
+/* { dg-options "-g -O2" } */
+
+struct S { double x; double y; short z; };
+int a = 0, b = 0, c;
+void bar (int, int, int);
+void baz (int *, int *, int *);
+
+void
+foo (struct S *v)
+{
+ int x, y, z;
+ if (!a && b != 0)
+ return;
+ if (v->z)
+ baz (&x, &y, &z);
+ else
+ {
+ x = v->x;
+ y = v->y;
+ }
+ x = x / (5 + 1);
+ y = y / (5 + 1);
+ if (x < 0)
+ x = 0;
+ if (x > c - 1)
+ x = c - 1;
+ if (b == 0)
+ bar (x, y, 1);
+ return;
+}
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 5967ddf..85847f0 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -8230,6 +8230,11 @@ vt_init_cfa_base (void)
if (!MAY_HAVE_DEBUG_INSNS)
return;
+ /* Tell alias analysis that cfa_base_rtx should share
+ find_base_term value with stack pointer or hard frame pointer. */
+ vt_equate_reg_base_value (cfa_base_rtx,
+ frame_pointer_needed
+ ? hard_frame_pointer_rtx : stack_pointer_rtx);
val = cselib_lookup_from_insn (cfa_base_rtx, GET_MODE (cfa_base_rtx), 1,
get_insns ());
preserve_value (val);