https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100308

            Bug ID: 100308
           Summary: IPA CP ipcp_modif_dom_walker removes calls w/o
                    updating the cgraph
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ipa
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
                CC: marxin at gcc dot gnu.org
  Target Milestone: ---

There's now (after a patch I have to commit)

    FAIL: gfortran.dg/gomp/pr88933.f90   -O  (internal compiler error)
    FAIL: gfortran.dg/gomp/pr88933.f90   -O  (test for excess errors)

/home/rguenther/src/gcc3/gcc/testsuite/gfortran.dg/gomp/pr88933.f90:11:14:
Error: edge b.constprop->__builtin_free has no corresponding call_stmt
# _18 = VDEF <.MEM_16(D)>
__builtin_free (l_14(D));
b.1.constprop.0/15 (b.constprop) @0x7ffff6753ee0
  Type: function definition analyzed
  Visibility: artificial
  References: 
  Referring: 
  Availability: local
  Function flags: count:1073741824 (estimated locally) body local
  Called by: a.0/0 (1073741824 (estimated locally),1.00 per call) (can throw
external) 
  Calls: memset/12 (445388112 (estimated locally),0.41 per call) free/14 (0
(precise),0.00 per call) 
during IPA pass: inline
dump file: pr88933.f90.083i.inline
/home/rguenther/src/gcc3/gcc/testsuite/gfortran.dg/gomp/pr88933.f90:11:14:
internal compiler error: verify_cgraph_node failed
0xd5f3aa cgraph_node::verify_node()
        /home/rguenther/src/gcc3/gcc/cgraph.c:3829
0xd46003 symtab_node::verify()
        /home/rguenther/src/gcc3/gcc/symtab.c:1356
0x14a8909 optimize_inline_calls(tree_node*)
        /home/rguenther/src/gcc3/gcc/tree-inline.c:5494
0x10a1640 inline_transform(cgraph_node*)


which is because in ipcp_modif_dom_walker::before_dom_children we do

      *m_something_changed = true;
      if (maybe_clean_eh_stmt (stmt)
          && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
        *m_cfg_changed = true;

which ends up wiping a BB containing a call (the function does
remove_edge_and_dominated_blocks).  We do seem to be setup to deal
with "other" parts as in the caller we do

  if (cfg_changed)
    delete_unreachable_blocks_update_callgraph (node, false);

the twist is that gimple_purge_dead_eh_edges wouldn't actually remove
dominated blocks if dominator info isn't available (but of course it is
in this case).

The issue is obviously latent.

Reply via email to