https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93318
Jan Hubicka <hubicka at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2020-01-18 CC| |luoxhu at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #2 from Jan Hubicka <hubicka at gcc dot gnu.org> --- The problem happens at WPA. We end up producing unmatched indirect call. We produce speculative call and later try to resolve it to direct call: (gdb) up #1 0x0000000000a1fca9 in cgraph_edge::remove (edge=0x7fff8a778a28) at ../../gcc/cgraph.c:1027 1027 edge->remove_caller (); (gdb) #2 0x0000000000a20368 in cgraph_edge::resolve_speculation (edge=0x7fff8a7764e0, callee_decl=0x7fff9803ed00) at ../../gcc/cgraph.c:1246 1246 remove (e2); (gdb) #3 0x0000000000a20403 in cgraph_edge::make_direct (edge=0x7fff8a778a28, callee=0x7fff79251b40) at ../../gcc/cgraph.c:1266 1266 edge = resolve_speculation (edge, callee->decl); (gdb) #4 0x0000000000d394b8 in ipa_make_edge_direct_to_target (ie=0x7fff8a778a28, target=0x7fff9803ed00, speculative=false) at ../../gcc/ipa-prop.c:3305 3305 ie = cgraph_edge::make_direct (ie, callee); (gdb) #5 0x0000000000d39f09 in try_make_edge_direct_simple_call (ie=0x7fff8a778a28, jfunc=0x7fff601b4870, target_type=0x7fff9800a3f0, new_root=0x7fff7a06c000, new_root_info=0x7fff608a0a80) at ../../gcc/ipa-prop.c:3590 3590 cs = ipa_make_edge_direct_to_target (ie, target); (gdb) #6 0x0000000000d3a82f in update_indirect_edges_after_inlining (cs=0x7fff792d54e0, node=0x7fff858fe000, new_edges=0x7fffffffdd98) at ../../gcc/ipa-prop.c:3812 3812 new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc, (gdb) after this we already have one speculative edge but no indirect edge: _ZN2js8frontend12FunctionTree16visitRecursivelyEP9JSContextPNS0_10ParserBaseEPFbS5_PS1_E/35641710 (visitRecursively) @0x7fff858fe000 Type: function definition analyzed Visibility: next sharing asm name: 35638756 References: _ZZN2js8frontend10ParserBase24publishDeferredFunctionsEPNS0_12FunctionTreeEENUlPS1_S3_E_4_FUNES4_S3_/33954806 (addr) (speculative) Referring: Read from file: ../../../js/src/build/libjs_static.a Function visitRecursively/35641710 is inline copy in publishDeferredItems/33218097 Clone of _ZN2js8frontend12FunctionTree16visitRecursivelyEP9JSContextPNS0_10ParserBaseEPFbS5_PS1_E/33948013 Availability: local Unit id: 2275 Function flags: count:24992 (guessed) first_run:4521 local hot Called by: _ZN2js8frontend10ParserBase18publishLazyScriptsEPNS0_12FunctionTreeE/33954804 (inlined) (24992 (guessed),1.00 per call) Calls: __builtin_expect/10953 (24992 (guessed),1.00 per call) __builtin_expect/10953 (24992 (guessed),1.00 per call) _ZN2js28RunningWithTrustedPrincipalsEP9JSContext/32911433 (0 (precise),0.00 per call) __builtin_expect/10953 (0 (precise),0.00 per call) _ZN2js18ReportOverRecursedEP9JSContext/33263272 (0 (precise),0.00 per call) _ZN2js8frontend12FunctionTree16visitRecursivelyEP9JSContextPNS0_10ParserBaseEPFbS5_PS1_E/33948013 (0 (precise),0.00 per call) _ZZN2js8frontend10ParserBase18publishLazyScriptsEPNS0_12FunctionTreeEENUlPS1_S3_E_4_FUNES4_S3_/35641711 (inlined) (18743 (guessed),0.75 per call) _ZZN2js8frontend10ParserBase24publishDeferredFunctionsEPNS0_12FunctionTreeEENUlPS1_S3_E_4_FUNES4_S3_/35641713 (speculative) (inlined) (6249 (guessed),0.25 per call) It seems that resolve_speculation is broken. It definitely should not leave the call in inconsistent shape. Also the new code documents that one needs to iterate on speculations which is not done by cgraph_edge::make_direct