[PATCH] Fix var-tracking ICE (PR debug/46387)

Jakub Jelinek jakub@redhat.com
Mon Nov 15 20:21:00 GMT 2010


On Mon, Nov 15, 2010 at 01:23:20PM +0100, Richard Guenther wrote:
> On Thu, Nov 11, 2010 at 4:28 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> > On Thu, Nov 11, 2010 at 11:45:50AM +0100, Richard Guenther wrote:
> >> I see.  I'm not sure I like the special just-for-vartracking function in alias.c
> >> too much (in fact I hoped we can share it for selsched).
> >
> > Ok, here is a simpler version where it can't be reverted (except for
> > init_alias_analysis) and var-tracking doesn't try to revert it.
> >
> > Bootstrapped/regtested on x86_64-linux and i686-linux, tested on the
> > testcase with ia64-linux cross, ok for trunk?
> 
> After much discussion and no real solution to commonize all needs
> I think this patch is ok if you add a comment to the function comment
> that the function is private to var-tracking (and maybe rename it
> to vt_equate_reg_base_value).

Thanks, this is what I've committed after another bootstrap/regtest round.

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.

	* gcc.dg/pr46387.c: New test.

--- gcc/rtl.h.jj	2010-11-10 13:14:41.000000000 +0100
+++ gcc/rtl.h	2010-11-11 12:52:52.000000000 +0100
@@ -2503,6 +2503,7 @@ extern int may_alias_p (const_rtx, const
 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);
--- gcc/alias.c.jj	2010-11-10 13:14:41.000000000 +0100
+++ gcc/alias.c	2010-11-11 12:54:01.000000000 +0100
@@ -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)
 {
--- gcc/var-tracking.c.jj	2010-11-10 13:14:41.000000000 +0100
+++ gcc/var-tracking.c	2010-11-11 12:53:27.000000000 +0100
@@ -8229,6 +8229,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);
--- gcc/testsuite/gcc.dg/pr46387.c.jj	2010-11-11 12:52:52.000000000 +0100
+++ gcc/testsuite/gcc.dg/pr46387.c	2010-11-11 12:52:52.000000000 +0100
@@ -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;
+}

	Jakub



More information about the Gcc-patches mailing list