Fix ICE with -fauto-profile when walking vdefs

Sebastian Pop sebpop@gmail.com
Fri Mar 31 16:10:00 GMT 2017


Hi,

with trunk gcc as of today and gcc releases 6.* and 5.*,
I get an ICE when compiling a large c++ project with autoFDO
at -O1 and above with -fauto-profile=some.gcov

internal compiler error: tree check: expected ssa_name, have var_decl
in walk_aliased_vdefs_1, at tree-ssa-alias.c:2912
0x1072fec tree_check_failed(tree_node const*, char const*, int, char
const*, ...)
        ../../gcc/tree.c:9819
0xed6ad9 tree_check(tree_node*, char const*, int, char const*, tree_code)
        ../../gcc/tree.h:3064
0xed6ad9 walk_aliased_vdefs_1
        ../../gcc/tree-ssa-alias.c:2912
0xed6b61 walk_aliased_vdefs(ao_ref*, tree_node*, bool (*)(ao_ref*,
tree_node*, void*), void*, bitmap_head**, bool*, unsigned int)
        ../../gcc/tree-ssa-alias.c:2972
0xbe97f0 parm_ref_data_preserved_p
        ../../gcc/ipa-prop.c:1015
0xbe97f0 ipa_load_from_parm_agg(ipa_func_body_info*,
vec<ipa_param_descriptor, va_gc, vl_embed>*, gimple*, tree_node*,
int*, long*, long*, bool*, bool*)
        ../../gcc/ipa-prop.c:1138
0xbd3213 unmodified_parm_or_parm_agg_item
        ../../gcc/ipa-inline-analysis.c:1626
0xbd4d05 set_cond_stmt_execution_predicate
        ../../gcc/ipa-inline-analysis.c:1789
0xbd4d05 compute_bb_predicates
        ../../gcc/ipa-inline-analysis.c:1925
0xbdb140 estimate_function_body_sizes
        ../../gcc/ipa-inline-analysis.c:2603
0xbdfcce compute_inline_parameters(cgraph_node*, bool)
        ../../gcc/ipa-inline-analysis.c:3048
0x1446ce8 early_inline
        ../../gcc/auto-profile.c:1592
0x1449aac auto_profile
        ../../gcc/auto-profile.c:1656

The patch below fixes the ICE by checking that the vdef is an SSA_NAME
before trying to walk to a def stmt.  At that point I see that the
vdef is a var_decl:

(gdb) p vdef
$1 = (tree) 0x7fffda143750
(gdb) pt
warning: Expression is not an assignment (and might have no effect)
 <var_decl 0x7fffda143750 .MEM
    type <void_type 0x7ffff65d4f18 void type_6 VOID
        align 8 symtab 0 alias set -1 canonical type 0x7ffff65d4f18
        pointer_to_this <pointer_type 0x7ffff65dc0a8>>
    used static ignored external VOID file <built-in> line 0 col 0
    align 8>
(gdb) pgs
warning: Expression is not an assignment (and might have no effect)
.MEM

vdef comes from two frames above as gimple_vuse (stmt) in:

  int walked = walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified,
  &modified, NULL);

(gdb) p stmt
$2 = (gimple *) 0x7fffd77d4730
(gdb) pgg
# VUSE <.MEM>
_66 = this_13(D)->s_;

The reason why I have left the check in the do-while loop
is because vdef is updated at the bottom of the loop as:

      vdef = gimple_vuse (def_stmt);

and that may again find a default definition vdef
that is not pointing to another statement defining it.

The patch passed bootstrap and regression test on x86_64-linux.
Ok for trunk and other release branches?

Thanks,
Sebastian

        * tree-ssa-alias.c (walk_aliased_vdefs_1): Handle default virtual defs.

diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 3f0c650475d..5a66306610f 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -2909,6 +2909,10 @@ walk_aliased_vdefs_1 (ao_ref *ref, tree vdef,
 {
   do
     {
+      /* Before asking for a statement, check that it is an SSA_NAME.  */
+      if (TREE_CODE(vdef) != SSA_NAME)
+       return cnt;
+
       gimple *def_stmt = SSA_NAME_DEF_STMT (vdef);

       if (*visited



More information about the Gcc-patches mailing list