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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|2024-09-02 00:00:00         |2025-2-28

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
Re-confirmed.

(gdb) l
1859          /* It is invalid to release body before materializing clones
except
1860             for thunks that don't really need a body.  Verify also that we
do
1861             not leak pointers to the call statements.  */
1862          for (cgraph_node *node = clones; node;
1863               node = node->next_sibling_clone)
1864            gcc_assert (node->thunk && !node->callees->call_stmt);

(gdb) p debug_gimple_stmt (clones->callees->call_stmt)
__builtin___ubsan_handle_builtin_unreachable (&*.Lubsan_data15);

this gets introduced during inlining:

#0  symbol_table::create_edge (this=0x7ffff6806000, 
    caller=caller@entry=<cgraph_node * 0x7ffff660cdd0
"_ZThn8_NK12_GLOBAL__N_12F33fooE1BIc1AIcEcE"/8>, 
    callee=callee@entry=<cgraph_node * 0x7ffff660cbb0
"__builtin___ubsan_handle_builtin_unreachable"/71>,
call_stmt=call_stmt@entry=0x7ffff6688260, count=..., 
    indir_unknown_callee=indir_unknown_callee@entry=false, cloning_p=false)
    at /home/rguenther/src/gcc/gcc/cgraph.cc:912
#1  0x0000000000af3fa6 in cgraph_node::create_edge (
    this=this@entry=<cgraph_node * const 0x7ffff660cdd0
"_ZThn8_NK12_GLOBAL__N_12F33fooE1BIc1AIcEcE"/8>, 
    callee=<cgraph_node * 0x7ffff660cbb0
"__builtin___ubsan_handle_builtin_unreachable"/71>,
call_stmt=call_stmt@entry=0x7ffff6688260, count=..., 
    count@entry=..., cloning_p=cloning_p@entry=false)
    at /home/rguenther/src/gcc/gcc/cgraph.cc:952
#2  0x0000000000af5a09 in cgraph_update_edges_for_call_stmt_node (
    node=node@entry=<cgraph_node * 0x7ffff660cdd0
"_ZThn8_NK12_GLOBAL__N_12F33fooE1BIc1AIcEcE"/8>,
old_stmt=old_stmt@entry=<gimple_call 0x7ffff6688098>, 
    old_call=old_call@entry=<function_decl 0x7ffff6942f00
__builtin_unreachable>, new_stmt=new_stmt@entry=<gimple_call 0x7ffff6688260>)
    at /home/rguenther/src/gcc/gcc/cgraph.cc:1688
#3  0x0000000000af5bf1 in cgraph_update_edges_for_call_stmt (
    old_stmt=old_stmt@entry=<gimple_call 0x7ffff6688098>, 
    old_decl=old_decl@entry=<function_decl 0x7ffff6942f00
__builtin_unreachable>, new_stmt=new_stmt@entry=<gimple_call 0x7ffff6688260>)
    at /home/rguenther/src/gcc/gcc/cgraph.cc:1715
#4  0x000000000102414e in fold_marked_statements (first=first@entry=3, 
    statements=0x3234bd0) at /home/rguenther/src/gcc/gcc/tree-inline.cc:5497
#5  0x00000000010313b7 in optimize_inline_calls (
    fn=<function_decl 0x7ffff69f1400
_ZThn8_NK12_GLOBAL__N_12F33fooE1BIc1AIcEcE>) at
/home/rguenther/src/gcc/gcc/tree-inline.cc:5633
#6  0x0000000000d29834 in inline_transform (node=<optimized out>)
    at /home/rguenther/src/gcc/gcc/ipa-inline-transform.cc:808
#7  0x0000000000e94cf5 in execute_one_ipa_transform_pass (

for some reason we are inlining

<cgraph_node * 0x7ffff681aee0 "_ZThn8_NK12_GLOBAL__N_12F33fooE1BIc1AIcEcE"/8>
-> <cgraph_node * 0x7ffff6600330 "foo"/6>

where the caller is !thunk but has a clone that is thunk.  Then
cgraph_update_edges_for_call_stmt will update both and we get confused?

Reply via email to