From 61630b27687dcd30748a594f90cd25035347959c Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 15 Nov 2010 21:07:39 +0100 Subject: [PATCH] re PR debug/46387 (ICE in add_stores, at var-tracking.c:5415) 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. * gcc.dg/pr46387.c: New test. From-SVN: r166766 --- gcc/ChangeLog | 7 +++++++ gcc/alias.c | 9 +++++++++ gcc/rtl.h | 1 + gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr46387.c | 32 ++++++++++++++++++++++++++++++++ gcc/var-tracking.c | 5 +++++ 6 files changed, 59 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr46387.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 26dff01113e..fc7c8d10acd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-11-15 Jakub Jelinek + + 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 Diego Novillo diff --git a/gcc/alias.c b/gcc/alias.c index 2e0ac06ce44..2a877979417 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 3e1df2c9bd9..66751a67854 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 c855ae3aa03..5b8a56e08b0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-15 Jakub Jelinek + + PR debug/46387 + * gcc.dg/pr46387.c: New test. + 2010-11-15 Nicola Pero * 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 00000000000..e06bd3b1065 --- /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 5967ddfd4e2..85847f0263f 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);