On Fri, Apr 29, 2022 at 11:52:37AM +0200, Richard Biener wrote:
> On Fri, 29 Apr 2022, Jakub Jelinek wrote:
> 
> > On Fri, Apr 29, 2022 at 11:32:15AM +0200, Richard Biener wrote:
> > > I think that's reasonable (we indeed shouldn't create a varpool node
> > > here).  I do think that we eventually want to retain removed nodes
> > > but mark them so.  In fact any debug references will be thrown away
> > > because of this anyway.
> > > 
> > > So I wonder if we can instead simply do if (!x_node) return 0;?
> > 
> > I had that in my first version, but after finding out that it triggers
> > so often for the constant pool decls I thought better to just use
> > x_decl in that case instead of x_node->decl.
> > I must say I'm unsure if constant pool decls always stay out of section
> > anchors or if they can be put there too.
> > 
> > > The question is also why sched does any queries for debug-insns,
> > > does it merely reset them based on the answer?  That said,
> > > it would be nice to be able to assert that x_node is not NULL
> > > and catch this in the callers somehow.
> > 
> > Unfortunately, several layers of callers don't really know it is for debug
> > insn.  And the touched code is solely for the section anchors, so e.g. just
> > checking symtab_node::get (decl) on all mentioned decls when we perhaps can
> > see if it is debug insn or not would be quite costly and we wouldn't know
> > if the other reference is anchored.
> 
> We might want to reset debug stmts at the time we RTL expand them
> if referred symbols have no cgraph node?  As said, ->get () instead
> of ->get_create () is obviously OK but the way we deal with the fallout
> is a bit suspicious there IMHO.

So, what about doing that if (!x_node) return 0; in alias.c with the
exception of DECL_IN_CONSTANT_POOL, plus in cfgexpand.cc throw away
VAR_DECLs without symtab node?

I'll need to do some extra checking on whether we don't really lose any
useful debug info with the second patch.

        Jakub
2022-04-29  Jakub Jelinek  <ja...@redhat.com>

        PR debug/105415
        * alias.cc (compare_base_symbol_refs): Avoid creating new symtab
        nodes, if it doesn't exist, punt.  For DECL_IN_CONSTANT_POOL decls
        use x_decl instead of x_node->decl.

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

--- gcc/alias.cc.jj     2022-02-21 16:51:50.261232505 +0100
+++ gcc/alias.cc        2022-04-29 12:25:02.022392689 +0200
@@ -2219,12 +2219,19 @@ compare_base_symbol_refs (const_rtx x_ba
          || (!TREE_STATIC (x_decl) && !TREE_PUBLIC (x_decl)))
        return 0;
 
-      symtab_node *x_node = symtab_node::get_create (x_decl)
-                           ->ultimate_alias_target ();
-      /* External variable cannot be in section anchor.  */
-      if (!x_node->definition)
-       return 0;
-      x_base = XEXP (DECL_RTL (x_node->decl), 0);
+      tree x_decl2 = x_decl;
+      if (!DECL_IN_CONSTANT_POOL (x_decl))
+       {
+         symtab_node *x_node = symtab_node::get (x_decl);
+         if (!x_node)
+           return 0;
+         x_node = x_node->ultimate_alias_target ();
+         /* External variable cannot be in section anchor.  */
+         if (!x_node->definition)
+           return 0;
+         x_decl2 = x_node->decl;
+       }
+      x_base = XEXP (DECL_RTL (x_decl2), 0);
       /* If not in anchor, we can disambiguate.  */
       if (!SYMBOL_REF_HAS_BLOCK_INFO_P (x_base))
        return 0;
--- gcc/testsuite/gcc.dg/pr105415.c.jj  2022-04-28 12:26:13.174302870 +0200
+++ gcc/testsuite/gcc.dg/pr105415.c     2022-04-28 12:25:36.770809149 +0200
@@ -0,0 +1,26 @@
+/* PR debug/105415 */
+/* { dg-do compile } */
+/* { dg-require-effective-target pthread } */
+/* { dg-options "-O2 -ftree-parallelize-loops=2 -fcompare-debug" } */
+
+int m;
+static int n;
+
+void
+foo (void)
+{
+  int s = 0;
+
+  while (m < 1)
+    {
+      s += n;
+      ++m;
+    }
+}
+
+void
+bar (int *arr, int i)
+{
+  while (i < 1)
+    arr[i++] = 1;
+}
2022-04-29  Jakub Jelinek  <ja...@redhat.com>

        * cfgexpand.cc (expand_debug_expr): Don't make_decl_rtl_for_debug
        if there is no symtab node for the VAR_DECL.

--- gcc/cfgexpand.cc.jj 2022-03-09 19:54:17.112284770 +0100
+++ gcc/cfgexpand.cc    2022-04-29 12:33:32.585363999 +0200
@@ -4565,7 +4565,8 @@ expand_debug_expr (tree exp)
              || !DECL_NAME (exp)
              || DECL_HARD_REGISTER (exp)
              || DECL_IN_CONSTANT_POOL (exp)
-             || mode == VOIDmode)
+             || mode == VOIDmode
+             || symtab_node::get (exp) == NULL)
            return NULL;
 
          op0 = make_decl_rtl_for_debug (exp);

Reply via email to