* add dbgcnt and opt-info support for devirtualization @ 2014-05-15 23:55 Xinliang David Li 2014-05-16 11:00 ` Richard Biener 2014-05-16 16:03 ` Jan Hubicka 0 siblings, 2 replies; 13+ messages in thread From: Xinliang David Li @ 2014-05-15 23:55 UTC (permalink / raw) To: GCC Patches; +Cc: Jan Hubicka [-- Attachment #1: Type: text/plain, Size: 341 bytes --] Hi, debugging runtime bugs due to devirtualization can be hard for very large C++ programs with complicated class hierarchy. This patch adds the support to report this high level transformation via -fopt-info (not hidden inside dump file) and the ability the do binary search with cutoff. Ok for trunk after build and test? thanks, David [-- Attachment #2: devirt_debug_trunk.txt --] [-- Type: text/plain, Size: 9552 bytes --] Index: ChangeLog =================================================================== --- ChangeLog (revision 210479) +++ ChangeLog (working copy) @@ -1,3 +1,18 @@ +2014-05-15 Xinliang David Li <davidxl@google.com> + + * cgraphunit.c (walk_polymorphic_call_targets): Add + dbgcnt and fopt-info support. + 2014-05-15 Xinliang David Li <davidxl@google.com> + + * cgraphunit.c (walk_polymorphic_call_targets): Add + dbgcnt and fopt-info support. + * ipa-prop.c (ipa_make_edge_direct_to_target): Ditto. + * ipa-devirt.c (ipa_devirt): Ditto. + * ipa.c (walk_polymorphic_call_targets): Ditto. + * gimple-fold.c (fold_gimple_assign): Ditto. + (gimple_fold_call): Ditto. + * dbgcnt.def: New counter. + 2014-05-15 Martin Jambor <mjambor@suse.cz> PR ipa/61085 Index: ipa-prop.c =================================================================== --- ipa-prop.c (revision 210479) +++ ipa-prop.c (working copy) @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. #include "ipa-utils.h" #include "stringpool.h" #include "tree-ssanames.h" +#include "dbgcnt.h" /* Intermediate information about a parameter that is only useful during the run of ipa_analyze_node and is not kept afterwards. */ @@ -2494,6 +2495,13 @@ ipa_make_edge_direct_to_target (struct c fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" " in %s/%i, making it unreachable.\n", ie->caller->name (), ie->caller->order); + else if (dump_enabled_p ()) + { + location_t loc = gimple_location (ie->call_stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, + "Discovered direct call to non-function in %s, " + "making it unreachable\n", ie->caller->name ()); + } target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); callee = cgraph_get_create_node (target); unreachable = true; @@ -2527,6 +2535,10 @@ ipa_make_edge_direct_to_target (struct c } callee = cgraph_get_create_node (target); } + + if (!dbg_cnt (devirt)) + return NULL; + ipa_check_create_node_params (); /* We can not make edges to inline clones. It is bug that someone removed @@ -2547,6 +2559,13 @@ ipa_make_edge_direct_to_target (struct c else fprintf (dump_file, "with uid %i\n", ie->lto_stmt_uid); } + if (dump_enabled_p ()) + { + location_t loc = gimple_location (ie->call_stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, + "Converting indirect call in %s to direct call to %s\n", + ie->caller->name (), callee->name ()); + } ie = cgraph_make_edge_direct (ie, callee); es = inline_edge_summary (ie); es->call_stmt_size -= (eni_size_weights.indirect_call_cost Index: gimple-fold.c =================================================================== --- gimple-fold.c (revision 210479) +++ gimple-fold.c (working copy) @@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. #include "tree-ssa-address.h" #include "langhooks.h" #include "gimplify-me.h" +#include "dbgcnt.h" /* Return true when DECL can be referenced from current unit. FROM_DECL (if non-null) specify constructor of variable DECL was taken from. @@ -389,10 +390,23 @@ fold_gimple_assign (gimple_stmt_iterator if (final && targets.length () <= 1) { tree fndecl; + if (!dbg_cnt (devirt)) + return val; + if (targets.length () == 1) fndecl = targets[0]->decl; else fndecl = builtin_decl_implicit (BUILT_IN_UNREACHABLE); + if (dump_enabled_p ()) + { + location_t loc = gimple_location (stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, + "Resolving virtual function address " + "reference to function %s\n", + targets.length () == 1 + ? targets[0]->name () + : "unreachable function"); + } val = fold_convert (TREE_TYPE (val), fndecl); STRIP_USELESS_TYPE_CONVERSION (val); return val; @@ -1124,9 +1138,18 @@ gimple_fold_call (gimple_stmt_iterator * bool final; vec <cgraph_node *>targets = possible_polymorphic_call_targets (callee, &final); - if (final && targets.length () <= 1) + if (final && targets.length () <= 1 && !dbg_cnt (devirt)) { tree lhs = gimple_call_lhs (stmt); + if (dump_enabled_p ()) + { + location_t loc = gimple_location (stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, + "Folding virtual function call to %s\n", + targets.length () == 1 + ? targets[0]->name () + : "unreachable function"); + } if (targets.length () == 1) { gimple_call_set_fndecl (stmt, targets[0]->decl); Index: cgraphunit.c =================================================================== --- cgraphunit.c (revision 210479) +++ cgraphunit.c (working copy) @@ -210,6 +210,7 @@ along with GCC; see the file COPYING3. #include "pass_manager.h" #include "tree-nested.h" #include "gimplify.h" +#include "dbgcnt.h" /* Queue of cgraph nodes scheduled to be added into cgraph. This is a secondary queue used during optimization to accommodate passes that @@ -888,6 +889,9 @@ walk_polymorphic_call_targets (pointer_s { if (targets.length () <= 1) { + if (!dbg_cnt (devirt)) + return; + cgraph_node *target; if (targets.length () == 1) target = targets[0]; @@ -903,6 +907,14 @@ walk_polymorphic_call_targets (pointer_s edge->call_stmt, 0, TDF_SLIM); } + else if (dump_enabled_p ()) + { + location_t locus = gimple_location (edge->call_stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus, + "Devirtualizing call in %s to %s\n", + edge->caller->name (), target->name ()); + } + cgraph_make_edge_direct (edge, target); cgraph_redirect_edge_call_stmt_to_callee (edge); if (cgraph_dump_file) Index: ipa-devirt.c =================================================================== --- ipa-devirt.c (revision 210479) +++ ipa-devirt.c (working copy) @@ -129,6 +129,7 @@ along with GCC; see the file COPYING3. #include "diagnostic.h" #include "tree-dfa.h" #include "demangle.h" +#include "dbgcnt.h" static bool odr_violation_reported = false; @@ -2069,12 +2070,22 @@ ipa_devirt (void) } else { - if (dump_file) - fprintf (dump_file, - "Speculatively devirtualizing call in %s/%i to %s/%i\n\n", - n->name (), n->order, - likely_target->name (), - likely_target->order); + if (!dbg_cnt (devirt)) + continue; + if (dump_enabled_p ()) + { + location_t locus = gimple_location (e->call_stmt); + if (dump_file) + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus, + "Speculatively devirtualizing call in %s/%i to %s/%i\n\n", + n->name (), n->order, + likely_target->name (), + likely_target->order); + else + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus, + "Speculatively devirtualizing call in %s to %s\n", + n->name (), likely_target->name ()); + } if (!symtab_can_be_discarded (likely_target)) { cgraph_node *alias; Index: ipa.c =================================================================== --- ipa.c (revision 210479) +++ ipa.c (working copy) @@ -37,6 +37,10 @@ along with GCC; see the file COPYING3. #include "tree-inline.h" #include "profile.h" #include "params.h" +#include "internal-fn.h" +#include "tree-ssa-alias.h" +#include "gimple.h" +#include "dbgcnt.h" /* Return true when NODE can not be local. Worker for cgraph_local_node_p. */ @@ -215,6 +219,9 @@ walk_polymorphic_call_targets (pointer_s { if (targets.length () <= 1) { + if (!dbg_cnt (devirt)) + return; + cgraph_node *target, *node = edge->caller; if (targets.length () == 1) target = targets[0]; @@ -222,12 +229,20 @@ walk_polymorphic_call_targets (pointer_s target = cgraph_get_create_node (builtin_decl_implicit (BUILT_IN_UNREACHABLE)); - if (dump_file) - fprintf (dump_file, - "Devirtualizing call in %s/%i to %s/%i\n", - edge->caller->name (), - edge->caller->order, - target->name (), target->order); + if (dump_enabled_p ()) + { + location_t locus = gimple_location (edge->call_stmt); + if (dump_file) + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus, + "Devirtualizing call in %s/%i to %s/%i\n", + edge->caller->name (), edge->caller->order, + target->name (), + target->order); + else + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus, + "Devirtualizing call in %s to %s\n", + edge->caller->name (), target->name ()); + } edge = cgraph_make_edge_direct (edge, target); if (inline_summary_vec) inline_update_overall_summary (node); Index: dbgcnt.def =================================================================== --- dbgcnt.def (revision 210479) +++ dbgcnt.def (working copy) @@ -150,6 +150,7 @@ DEBUG_COUNTER (dce) DEBUG_COUNTER (dce_fast) DEBUG_COUNTER (dce_ud) DEBUG_COUNTER (delete_trivial_dead) +DEBUG_COUNTER (devirt) DEBUG_COUNTER (df_byte_scan) DEBUG_COUNTER (dse) DEBUG_COUNTER (dse1) ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-15 23:55 add dbgcnt and opt-info support for devirtualization Xinliang David Li @ 2014-05-16 11:00 ` Richard Biener 2014-05-16 15:30 ` Xinliang David Li 2014-05-16 16:03 ` Jan Hubicka 1 sibling, 1 reply; 13+ messages in thread From: Richard Biener @ 2014-05-16 11:00 UTC (permalink / raw) To: Xinliang David Li; +Cc: GCC Patches, Jan Hubicka On Fri, May 16, 2014 at 1:54 AM, Xinliang David Li <davidxl@google.com> wrote: > Hi, debugging runtime bugs due to devirtualization can be hard for > very large C++ programs with complicated class hierarchy. This patch > adds the support to report this high level transformation via > -fopt-info (not hidden inside dump file) and the ability the do binary > search with cutoff. > > Ok for trunk after build and test? + else if (dump_enabled_p ()) + { + location_t loc = gimple_location (ie->call_stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, + "Discovered direct call to non-function in %s, " diagnostics start with lower-case. Why not merge this with the dump_file case? The point of all the infrastructure was to _not_ need to distinguish the cases ... (similar for the other cases, and IIRC you miss one case in tree-ssa-pre.c calling ipa_intraprocedural_devirtualization?) Thanks, Richard. > thanks, > > David ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-16 11:00 ` Richard Biener @ 2014-05-16 15:30 ` Xinliang David Li 0 siblings, 0 replies; 13+ messages in thread From: Xinliang David Li @ 2014-05-16 15:30 UTC (permalink / raw) To: Richard Biener; +Cc: GCC Patches, Jan Hubicka On Fri, May 16, 2014 at 4:00 AM, Richard Biener <richard.guenther@gmail.com> wrote: > On Fri, May 16, 2014 at 1:54 AM, Xinliang David Li <davidxl@google.com> wrote: >> Hi, debugging runtime bugs due to devirtualization can be hard for >> very large C++ programs with complicated class hierarchy. This patch >> adds the support to report this high level transformation via >> -fopt-info (not hidden inside dump file) and the ability the do binary >> search with cutoff. >> >> Ok for trunk after build and test? > > + else if (dump_enabled_p ()) > + { > + location_t loc = gimple_location (ie->call_stmt); > + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, > + "Discovered direct call to non-function in %s, " > > diagnostics start with lower-case. Why not merge this with the > dump_file case? The point of all the infrastructure was to _not_ > need to distinguish the cases ... > Right -- however in this case I don't want the node 'order' to leak into the opt report. Should we drop it? > (similar for the other cases, and IIRC you miss one case in > tree-ssa-pre.c calling ipa_intraprocedural_devirtualization?) Good catch. Will add it. thanks, David > > Thanks, > Richard. > > >> thanks, >> >> David ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-15 23:55 add dbgcnt and opt-info support for devirtualization Xinliang David Li 2014-05-16 11:00 ` Richard Biener @ 2014-05-16 16:03 ` Jan Hubicka 2014-05-16 16:14 ` Xinliang David Li 2014-05-16 21:19 ` Xinliang David Li 1 sibling, 2 replies; 13+ messages in thread From: Jan Hubicka @ 2014-05-16 16:03 UTC (permalink / raw) To: Xinliang David Li; +Cc: GCC Patches, Jan Hubicka > Hi, debugging runtime bugs due to devirtualization can be hard for > very large C++ programs with complicated class hierarchy. This patch > adds the support to report this high level transformation via > -fopt-info (not hidden inside dump file) and the ability the do binary > search with cutoff. > > Ok for trunk after build and test? Seems resonable to me. > > thanks, > > David > Index: ChangeLog > =================================================================== > --- ChangeLog (revision 210479) > +++ ChangeLog (working copy) > @@ -1,3 +1,18 @@ > +2014-05-15 Xinliang David Li <davidxl@google.com> > + > + * cgraphunit.c (walk_polymorphic_call_targets): Add > + dbgcnt and fopt-info support. > + 2014-05-15 Xinliang David Li <davidxl@google.com> > + > + * cgraphunit.c (walk_polymorphic_call_targets): Add > + dbgcnt and fopt-info support. > + * ipa-prop.c (ipa_make_edge_direct_to_target): Ditto. > + * ipa-devirt.c (ipa_devirt): Ditto. > + * ipa.c (walk_polymorphic_call_targets): Ditto. > + * gimple-fold.c (fold_gimple_assign): Ditto. > + (gimple_fold_call): Ditto. > + * dbgcnt.def: New counter. > + > 2014-05-15 Martin Jambor <mjambor@suse.cz> > > PR ipa/61085 > Index: ipa-prop.c > =================================================================== > --- ipa-prop.c (revision 210479) > +++ ipa-prop.c (working copy) > @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. > #include "ipa-utils.h" > #include "stringpool.h" > #include "tree-ssanames.h" > +#include "dbgcnt.h" > > /* Intermediate information about a parameter that is only useful during the > run of ipa_analyze_node and is not kept afterwards. */ > @@ -2494,6 +2495,13 @@ ipa_make_edge_direct_to_target (struct c > fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" > " in %s/%i, making it unreachable.\n", > ie->caller->name (), ie->caller->order); > + else if (dump_enabled_p ()) > + { > + location_t loc = gimple_location (ie->call_stmt); > + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, > + "Discovered direct call to non-function in %s, " > + "making it unreachable\n", ie->caller->name ()); Perhaps "turning it to __builtin_unreachable call" and similarly in the other cases we introduce __builtin_unreachable? I think that could be easier for user to work out. What king of problems in devirtualizatoin you are seeing? Honza ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-16 16:03 ` Jan Hubicka @ 2014-05-16 16:14 ` Xinliang David Li 2014-05-16 16:51 ` Jan Hubicka 2014-05-16 21:19 ` Xinliang David Li 1 sibling, 1 reply; 13+ messages in thread From: Xinliang David Li @ 2014-05-16 16:14 UTC (permalink / raw) To: Jan Hubicka; +Cc: GCC Patches On Fri, May 16, 2014 at 9:03 AM, Jan Hubicka <hubicka@ucw.cz> wrote: >> Hi, debugging runtime bugs due to devirtualization can be hard for >> very large C++ programs with complicated class hierarchy. This patch >> adds the support to report this high level transformation via >> -fopt-info (not hidden inside dump file) and the ability the do binary >> search with cutoff. >> >> Ok for trunk after build and test? > > Seems resonable to me. >> >> thanks, >> >> David > >> Index: ChangeLog >> =================================================================== >> --- ChangeLog (revision 210479) >> +++ ChangeLog (working copy) >> @@ -1,3 +1,18 @@ >> +2014-05-15 Xinliang David Li <davidxl@google.com> >> + >> + * cgraphunit.c (walk_polymorphic_call_targets): Add >> + dbgcnt and fopt-info support. >> + 2014-05-15 Xinliang David Li <davidxl@google.com> >> + >> + * cgraphunit.c (walk_polymorphic_call_targets): Add >> + dbgcnt and fopt-info support. >> + * ipa-prop.c (ipa_make_edge_direct_to_target): Ditto. >> + * ipa-devirt.c (ipa_devirt): Ditto. >> + * ipa.c (walk_polymorphic_call_targets): Ditto. >> + * gimple-fold.c (fold_gimple_assign): Ditto. >> + (gimple_fold_call): Ditto. >> + * dbgcnt.def: New counter. >> + >> 2014-05-15 Martin Jambor <mjambor@suse.cz> >> >> PR ipa/61085 >> Index: ipa-prop.c >> =================================================================== >> --- ipa-prop.c (revision 210479) >> +++ ipa-prop.c (working copy) >> @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. >> #include "ipa-utils.h" >> #include "stringpool.h" >> #include "tree-ssanames.h" >> +#include "dbgcnt.h" >> >> /* Intermediate information about a parameter that is only useful during the >> run of ipa_analyze_node and is not kept afterwards. */ >> @@ -2494,6 +2495,13 @@ ipa_make_edge_direct_to_target (struct c >> fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" >> " in %s/%i, making it unreachable.\n", >> ie->caller->name (), ie->caller->order); >> + else if (dump_enabled_p ()) >> + { >> + location_t loc = gimple_location (ie->call_stmt); >> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, >> + "Discovered direct call to non-function in %s, " >> + "making it unreachable\n", ie->caller->name ()); > > Perhaps "turning it to __builtin_unreachable call" and similarly in the other cases > we introduce __builtin_unreachable? I think that could be easier for user to work > out. Ok. > > What king of problems in devirtualizatoin you are seeing? I have been chasing a runtime failure of a very large test built with gcc-4_9. The bad code either calls a pure function or turn a virtual call into __builtin_unreachable (incomplete target set). The indirect info shows the otr type to be !maybe_derived_type, and the outer-type gets cleared during inline update. I isolated a small test case -- but the good news is that gcc-4_9 @head already fixed the problem. I will check in the test case to trunk later. thanks, David > > > Honza ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-16 16:14 ` Xinliang David Li @ 2014-05-16 16:51 ` Jan Hubicka 2014-05-16 17:45 ` Xinliang David Li 0 siblings, 1 reply; 13+ messages in thread From: Jan Hubicka @ 2014-05-16 16:51 UTC (permalink / raw) To: Xinliang David Li; +Cc: Jan Hubicka, GCC Patches > > I have been chasing a runtime failure of a very large test built with > gcc-4_9. The bad code either calls a pure function or turn a virtual > call into __builtin_unreachable (incomplete target set). The indirect > info shows the otr type to be !maybe_derived_type, and the outer-type > gets cleared during inline update. I isolated a small test case -- but > the good news is that gcc-4_9 @head already fixed the problem. > > I will check in the test case to trunk later. Good, testcase would be welcome. I guess it was the fix for placement_new bug. It disables some valid devirtualizations (and I thus may revisit the fix for 4.10), so it would be good to know if your testcase differs from the original PR one. Honza > > thanks, > > David > > > > > > > Honza ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-16 16:51 ` Jan Hubicka @ 2014-05-16 17:45 ` Xinliang David Li 0 siblings, 0 replies; 13+ messages in thread From: Xinliang David Li @ 2014-05-16 17:45 UTC (permalink / raw) To: Jan Hubicka; +Cc: GCC Patches On Fri, May 16, 2014 at 9:51 AM, Jan Hubicka <hubicka@ucw.cz> wrote: >> >> I have been chasing a runtime failure of a very large test built with >> gcc-4_9. The bad code either calls a pure function or turn a virtual >> call into __builtin_unreachable (incomplete target set). The indirect >> info shows the otr type to be !maybe_derived_type, and the outer-type >> gets cleared during inline update. I isolated a small test case -- but >> the good news is that gcc-4_9 @head already fixed the problem. >> >> I will check in the test case to trunk later. > > Good, testcase would be welcome. I guess it was the fix for placement_new bug. > It disables some valid devirtualizations (and I thus may revisit the fix for > 4.10), so it would be good to know if your testcase differs from the original > PR one. I thought so too -- but when I backed out this single change from trunk, the test still passes, so something else is also going on. David > > Honza >> >> thanks, >> >> David >> >> > >> > >> > Honza ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-16 16:03 ` Jan Hubicka 2014-05-16 16:14 ` Xinliang David Li @ 2014-05-16 21:19 ` Xinliang David Li 2014-05-18 21:55 ` Xinliang David Li 2014-05-19 9:21 ` Richard Biener 1 sibling, 2 replies; 13+ messages in thread From: Xinliang David Li @ 2014-05-16 21:19 UTC (permalink / raw) To: Jan Hubicka; +Cc: GCC Patches Modified the patch according to yours and Richard's feedback. PTAL. thanks, David On Fri, May 16, 2014 at 9:03 AM, Jan Hubicka <hubicka@ucw.cz> wrote: >> Hi, debugging runtime bugs due to devirtualization can be hard for >> very large C++ programs with complicated class hierarchy. This patch >> adds the support to report this high level transformation via >> -fopt-info (not hidden inside dump file) and the ability the do binary >> search with cutoff. >> >> Ok for trunk after build and test? > > Seems resonable to me. >> >> thanks, >> >> David > >> Index: ChangeLog >> =================================================================== >> --- ChangeLog (revision 210479) >> +++ ChangeLog (working copy) >> @@ -1,3 +1,18 @@ >> +2014-05-15 Xinliang David Li <davidxl@google.com> >> + >> + * cgraphunit.c (walk_polymorphic_call_targets): Add >> + dbgcnt and fopt-info support. >> + 2014-05-15 Xinliang David Li <davidxl@google.com> >> + >> + * cgraphunit.c (walk_polymorphic_call_targets): Add >> + dbgcnt and fopt-info support. >> + * ipa-prop.c (ipa_make_edge_direct_to_target): Ditto. >> + * ipa-devirt.c (ipa_devirt): Ditto. >> + * ipa.c (walk_polymorphic_call_targets): Ditto. >> + * gimple-fold.c (fold_gimple_assign): Ditto. >> + (gimple_fold_call): Ditto. >> + * dbgcnt.def: New counter. >> + >> 2014-05-15 Martin Jambor <mjambor@suse.cz> >> >> PR ipa/61085 >> Index: ipa-prop.c >> =================================================================== >> --- ipa-prop.c (revision 210479) >> +++ ipa-prop.c (working copy) >> @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. >> #include "ipa-utils.h" >> #include "stringpool.h" >> #include "tree-ssanames.h" >> +#include "dbgcnt.h" >> >> /* Intermediate information about a parameter that is only useful during the >> run of ipa_analyze_node and is not kept afterwards. */ >> @@ -2494,6 +2495,13 @@ ipa_make_edge_direct_to_target (struct c >> fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" >> " in %s/%i, making it unreachable.\n", >> ie->caller->name (), ie->caller->order); >> + else if (dump_enabled_p ()) >> + { >> + location_t loc = gimple_location (ie->call_stmt); >> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, >> + "Discovered direct call to non-function in %s, " >> + "making it unreachable\n", ie->caller->name ()); > > Perhaps "turning it to __builtin_unreachable call" and similarly in the other cases > we introduce __builtin_unreachable? I think that could be easier for user to work > out. > > What king of problems in devirtualizatoin you are seeing? > > > Honza ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-16 21:19 ` Xinliang David Li @ 2014-05-18 21:55 ` Xinliang David Li 2014-05-19 9:21 ` Richard Biener 1 sibling, 0 replies; 13+ messages in thread From: Xinliang David Li @ 2014-05-18 21:55 UTC (permalink / raw) To: Jan Hubicka; +Cc: GCC Patches There is no test regression. Ok with this patch? David On Fri, May 16, 2014 at 2:19 PM, Xinliang David Li <davidxl@google.com> wrote: > Modified the patch according to yours and Richard's feedback. PTAL. > > thanks, > > David > > On Fri, May 16, 2014 at 9:03 AM, Jan Hubicka <hubicka@ucw.cz> wrote: >>> Hi, debugging runtime bugs due to devirtualization can be hard for >>> very large C++ programs with complicated class hierarchy. This patch >>> adds the support to report this high level transformation via >>> -fopt-info (not hidden inside dump file) and the ability the do binary >>> search with cutoff. >>> >>> Ok for trunk after build and test? >> >> Seems resonable to me. >>> >>> thanks, >>> >>> David >> >>> Index: ChangeLog >>> =================================================================== >>> --- ChangeLog (revision 210479) >>> +++ ChangeLog (working copy) >>> @@ -1,3 +1,18 @@ >>> +2014-05-15 Xinliang David Li <davidxl@google.com> >>> + >>> + * cgraphunit.c (walk_polymorphic_call_targets): Add >>> + dbgcnt and fopt-info support. >>> + 2014-05-15 Xinliang David Li <davidxl@google.com> >>> + >>> + * cgraphunit.c (walk_polymorphic_call_targets): Add >>> + dbgcnt and fopt-info support. >>> + * ipa-prop.c (ipa_make_edge_direct_to_target): Ditto. >>> + * ipa-devirt.c (ipa_devirt): Ditto. >>> + * ipa.c (walk_polymorphic_call_targets): Ditto. >>> + * gimple-fold.c (fold_gimple_assign): Ditto. >>> + (gimple_fold_call): Ditto. >>> + * dbgcnt.def: New counter. >>> + >>> 2014-05-15 Martin Jambor <mjambor@suse.cz> >>> >>> PR ipa/61085 >>> Index: ipa-prop.c >>> =================================================================== >>> --- ipa-prop.c (revision 210479) >>> +++ ipa-prop.c (working copy) >>> @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. >>> #include "ipa-utils.h" >>> #include "stringpool.h" >>> #include "tree-ssanames.h" >>> +#include "dbgcnt.h" >>> >>> /* Intermediate information about a parameter that is only useful during the >>> run of ipa_analyze_node and is not kept afterwards. */ >>> @@ -2494,6 +2495,13 @@ ipa_make_edge_direct_to_target (struct c >>> fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" >>> " in %s/%i, making it unreachable.\n", >>> ie->caller->name (), ie->caller->order); >>> + else if (dump_enabled_p ()) >>> + { >>> + location_t loc = gimple_location (ie->call_stmt); >>> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, >>> + "Discovered direct call to non-function in %s, " >>> + "making it unreachable\n", ie->caller->name ()); >> >> Perhaps "turning it to __builtin_unreachable call" and similarly in the other cases >> we introduce __builtin_unreachable? I think that could be easier for user to work >> out. >> >> What king of problems in devirtualizatoin you are seeing? >> >> >> Honza ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-16 21:19 ` Xinliang David Li 2014-05-18 21:55 ` Xinliang David Li @ 2014-05-19 9:21 ` Richard Biener 2014-05-19 15:24 ` Xinliang David Li 1 sibling, 1 reply; 13+ messages in thread From: Richard Biener @ 2014-05-19 9:21 UTC (permalink / raw) To: Xinliang David Li; +Cc: Jan Hubicka, GCC Patches On Fri, May 16, 2014 at 11:19 PM, Xinliang David Li <davidxl@google.com> wrote: > Modified the patch according to yours and Richard's feedback. PTAL. ENOPATCH. Btw, I don't see any issue with leaking node order to opt-report. Richard. > thanks, > > David > > On Fri, May 16, 2014 at 9:03 AM, Jan Hubicka <hubicka@ucw.cz> wrote: >>> Hi, debugging runtime bugs due to devirtualization can be hard for >>> very large C++ programs with complicated class hierarchy. This patch >>> adds the support to report this high level transformation via >>> -fopt-info (not hidden inside dump file) and the ability the do binary >>> search with cutoff. >>> >>> Ok for trunk after build and test? >> >> Seems resonable to me. >>> >>> thanks, >>> >>> David >> >>> Index: ChangeLog >>> =================================================================== >>> --- ChangeLog (revision 210479) >>> +++ ChangeLog (working copy) >>> @@ -1,3 +1,18 @@ >>> +2014-05-15 Xinliang David Li <davidxl@google.com> >>> + >>> + * cgraphunit.c (walk_polymorphic_call_targets): Add >>> + dbgcnt and fopt-info support. >>> + 2014-05-15 Xinliang David Li <davidxl@google.com> >>> + >>> + * cgraphunit.c (walk_polymorphic_call_targets): Add >>> + dbgcnt and fopt-info support. >>> + * ipa-prop.c (ipa_make_edge_direct_to_target): Ditto. >>> + * ipa-devirt.c (ipa_devirt): Ditto. >>> + * ipa.c (walk_polymorphic_call_targets): Ditto. >>> + * gimple-fold.c (fold_gimple_assign): Ditto. >>> + (gimple_fold_call): Ditto. >>> + * dbgcnt.def: New counter. >>> + >>> 2014-05-15 Martin Jambor <mjambor@suse.cz> >>> >>> PR ipa/61085 >>> Index: ipa-prop.c >>> =================================================================== >>> --- ipa-prop.c (revision 210479) >>> +++ ipa-prop.c (working copy) >>> @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. >>> #include "ipa-utils.h" >>> #include "stringpool.h" >>> #include "tree-ssanames.h" >>> +#include "dbgcnt.h" >>> >>> /* Intermediate information about a parameter that is only useful during the >>> run of ipa_analyze_node and is not kept afterwards. */ >>> @@ -2494,6 +2495,13 @@ ipa_make_edge_direct_to_target (struct c >>> fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" >>> " in %s/%i, making it unreachable.\n", >>> ie->caller->name (), ie->caller->order); >>> + else if (dump_enabled_p ()) >>> + { >>> + location_t loc = gimple_location (ie->call_stmt); >>> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, >>> + "Discovered direct call to non-function in %s, " >>> + "making it unreachable\n", ie->caller->name ()); >> >> Perhaps "turning it to __builtin_unreachable call" and similarly in the other cases >> we introduce __builtin_unreachable? I think that could be easier for user to work >> out. >> >> What king of problems in devirtualizatoin you are seeing? >> >> >> Honza ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-19 9:21 ` Richard Biener @ 2014-05-19 15:24 ` Xinliang David Li 2014-05-20 11:33 ` Richard Biener 0 siblings, 1 reply; 13+ messages in thread From: Xinliang David Li @ 2014-05-19 15:24 UTC (permalink / raw) To: Richard Biener; +Cc: Jan Hubicka, GCC Patches [-- Attachment #1: Type: text/plain, Size: 3484 bytes --] Sorry about it. Here is the patch. There is one remaining case where cgraph_dump_file and dump_enable_p are checked separately -- cgraph_dump_file is set up differently from 'dump_file'. David On Mon, May 19, 2014 at 2:21 AM, Richard Biener <richard.guenther@gmail.com> wrote: > On Fri, May 16, 2014 at 11:19 PM, Xinliang David Li <davidxl@google.com> wrote: >> Modified the patch according to yours and Richard's feedback. PTAL. > > ENOPATCH. > > Btw, I don't see any issue with leaking node order to opt-report. > > Richard. > >> thanks, >> >> David >> >> On Fri, May 16, 2014 at 9:03 AM, Jan Hubicka <hubicka@ucw.cz> wrote: >>>> Hi, debugging runtime bugs due to devirtualization can be hard for >>>> very large C++ programs with complicated class hierarchy. This patch >>>> adds the support to report this high level transformation via >>>> -fopt-info (not hidden inside dump file) and the ability the do binary >>>> search with cutoff. >>>> >>>> Ok for trunk after build and test? >>> >>> Seems resonable to me. >>>> >>>> thanks, >>>> >>>> David >>> >>>> Index: ChangeLog >>>> =================================================================== >>>> --- ChangeLog (revision 210479) >>>> +++ ChangeLog (working copy) >>>> @@ -1,3 +1,18 @@ >>>> +2014-05-15 Xinliang David Li <davidxl@google.com> >>>> + >>>> + * cgraphunit.c (walk_polymorphic_call_targets): Add >>>> + dbgcnt and fopt-info support. >>>> + 2014-05-15 Xinliang David Li <davidxl@google.com> >>>> + >>>> + * cgraphunit.c (walk_polymorphic_call_targets): Add >>>> + dbgcnt and fopt-info support. >>>> + * ipa-prop.c (ipa_make_edge_direct_to_target): Ditto. >>>> + * ipa-devirt.c (ipa_devirt): Ditto. >>>> + * ipa.c (walk_polymorphic_call_targets): Ditto. >>>> + * gimple-fold.c (fold_gimple_assign): Ditto. >>>> + (gimple_fold_call): Ditto. >>>> + * dbgcnt.def: New counter. >>>> + >>>> 2014-05-15 Martin Jambor <mjambor@suse.cz> >>>> >>>> PR ipa/61085 >>>> Index: ipa-prop.c >>>> =================================================================== >>>> --- ipa-prop.c (revision 210479) >>>> +++ ipa-prop.c (working copy) >>>> @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. >>>> #include "ipa-utils.h" >>>> #include "stringpool.h" >>>> #include "tree-ssanames.h" >>>> +#include "dbgcnt.h" >>>> >>>> /* Intermediate information about a parameter that is only useful during the >>>> run of ipa_analyze_node and is not kept afterwards. */ >>>> @@ -2494,6 +2495,13 @@ ipa_make_edge_direct_to_target (struct c >>>> fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" >>>> " in %s/%i, making it unreachable.\n", >>>> ie->caller->name (), ie->caller->order); >>>> + else if (dump_enabled_p ()) >>>> + { >>>> + location_t loc = gimple_location (ie->call_stmt); >>>> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, >>>> + "Discovered direct call to non-function in %s, " >>>> + "making it unreachable\n", ie->caller->name ()); >>> >>> Perhaps "turning it to __builtin_unreachable call" and similarly in the other cases >>> we introduce __builtin_unreachable? I think that could be easier for user to work >>> out. >>> >>> What king of problems in devirtualizatoin you are seeing? >>> >>> >>> Honza [-- Attachment #2: devirt_debug_trunk.txt --] [-- Type: text/plain, Size: 10726 bytes --] Index: cgraphunit.c =================================================================== --- cgraphunit.c (revision 210479) +++ cgraphunit.c (working copy) @@ -210,6 +210,7 @@ along with GCC; see the file COPYING3. #include "pass_manager.h" #include "tree-nested.h" #include "gimplify.h" +#include "dbgcnt.h" /* Queue of cgraph nodes scheduled to be added into cgraph. This is a secondary queue used during optimization to accommodate passes that @@ -886,7 +887,7 @@ walk_polymorphic_call_targets (pointer_s make the edge direct. */ if (final) { - if (targets.length () <= 1) + if (targets.length () <= 1 && dbg_cnt (devirt)) { cgraph_node *target; if (targets.length () == 1) @@ -903,6 +904,14 @@ walk_polymorphic_call_targets (pointer_s edge->call_stmt, 0, TDF_SLIM); } + else if (dump_enabled_p ()) + { + location_t locus = gimple_location (edge->call_stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus, + "devirtualizing call in %s to %s\n", + edge->caller->name (), target->name ()); + } + cgraph_make_edge_direct (edge, target); cgraph_redirect_edge_call_stmt_to_callee (edge); if (cgraph_dump_file) Index: ipa-prop.c =================================================================== --- ipa-prop.c (revision 210479) +++ ipa-prop.c (working copy) @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. #include "ipa-utils.h" #include "stringpool.h" #include "tree-ssanames.h" +#include "dbgcnt.h" /* Intermediate information about a parameter that is only useful during the run of ipa_analyze_node and is not kept afterwards. */ @@ -2490,10 +2491,15 @@ ipa_make_edge_direct_to_target (struct c /* Member pointer call that goes through a VMT lookup. */ return NULL; - if (dump_file) - fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" - " in %s/%i, making it unreachable.\n", - ie->caller->name (), ie->caller->order); + if (dump_enabled_p ()) + { + location_t loc = gimple_location (ie->call_stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, + "discovered direct call to non-function in %s/%i, " + "making it __builtin_unreachable\n", + ie->caller->name (), + ie->caller->order); + } target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); callee = cgraph_get_create_node (target); unreachable = true; @@ -2527,6 +2533,10 @@ ipa_make_edge_direct_to_target (struct c } callee = cgraph_get_create_node (target); } + + if (!dbg_cnt (devirt)) + return NULL; + ipa_check_create_node_params (); /* We can not make edges to inline clones. It is bug that someone removed @@ -2547,6 +2557,13 @@ ipa_make_edge_direct_to_target (struct c else fprintf (dump_file, "with uid %i\n", ie->lto_stmt_uid); } + if (dump_enabled_p ()) + { + location_t loc = gimple_location (ie->call_stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, + "converting indirect call in %s to direct call to %s\n", + ie->caller->name (), callee->name ()); + } ie = cgraph_make_edge_direct (ie, callee); es = inline_edge_summary (ie); es->call_stmt_size -= (eni_size_weights.indirect_call_cost Index: ipa.c =================================================================== --- ipa.c (revision 210479) +++ ipa.c (working copy) @@ -37,6 +37,10 @@ along with GCC; see the file COPYING3. #include "tree-inline.h" #include "profile.h" #include "params.h" +#include "internal-fn.h" +#include "tree-ssa-alias.h" +#include "gimple.h" +#include "dbgcnt.h" /* Return true when NODE can not be local. Worker for cgraph_local_node_p. */ @@ -213,7 +217,7 @@ walk_polymorphic_call_targets (pointer_s make the edge direct. */ if (final) { - if (targets.length () <= 1) + if (targets.length () <= 1 && dbg_cnt (devirt)) { cgraph_node *target, *node = edge->caller; if (targets.length () == 1) @@ -222,12 +226,15 @@ walk_polymorphic_call_targets (pointer_s target = cgraph_get_create_node (builtin_decl_implicit (BUILT_IN_UNREACHABLE)); - if (dump_file) - fprintf (dump_file, - "Devirtualizing call in %s/%i to %s/%i\n", - edge->caller->name (), - edge->caller->order, - target->name (), target->order); + if (dump_enabled_p ()) + { + location_t locus = gimple_location (edge->call_stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus, + "devirtualizing call in %s/%i to %s/%i\n", + edge->caller->name (), edge->caller->order, + target->name (), + target->order); + } edge = cgraph_make_edge_direct (edge, target); if (inline_summary_vec) inline_update_overall_summary (node); Index: ipa-devirt.c =================================================================== --- ipa-devirt.c (revision 210479) +++ ipa-devirt.c (working copy) @@ -129,6 +129,7 @@ along with GCC; see the file COPYING3. #include "diagnostic.h" #include "tree-dfa.h" #include "demangle.h" +#include "dbgcnt.h" static bool odr_violation_reported = false; @@ -2067,14 +2068,17 @@ ipa_devirt (void) noverwritable++; continue; } - else + else if (dbg_cnt (devirt)) { - if (dump_file) - fprintf (dump_file, - "Speculatively devirtualizing call in %s/%i to %s/%i\n\n", - n->name (), n->order, - likely_target->name (), - likely_target->order); + if (dump_enabled_p ()) + { + location_t locus = gimple_location (e->call_stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus, + "speculatively devirtualizing call in %s/%i to %s/%i\n", + n->name (), n->order, + likely_target->name (), + likely_target->order); + } if (!symtab_can_be_discarded (likely_target)) { cgraph_node *alias; Index: dbgcnt.def =================================================================== --- dbgcnt.def (revision 210479) +++ dbgcnt.def (working copy) @@ -150,6 +150,7 @@ DEBUG_COUNTER (dce) DEBUG_COUNTER (dce_fast) DEBUG_COUNTER (dce_ud) DEBUG_COUNTER (delete_trivial_dead) +DEBUG_COUNTER (devirt) DEBUG_COUNTER (df_byte_scan) DEBUG_COUNTER (dse) DEBUG_COUNTER (dse1) Index: gimple-fold.c =================================================================== --- gimple-fold.c (revision 210479) +++ gimple-fold.c (working copy) @@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. #include "tree-ssa-address.h" #include "langhooks.h" #include "gimplify-me.h" +#include "dbgcnt.h" /* Return true when DECL can be referenced from current unit. FROM_DECL (if non-null) specify constructor of variable DECL was taken from. @@ -386,13 +387,24 @@ fold_gimple_assign (gimple_stmt_iterator bool final; vec <cgraph_node *>targets = possible_polymorphic_call_targets (val, &final); - if (final && targets.length () <= 1) + if (final && targets.length () <= 1 && dbg_cnt (devirt)) { tree fndecl; + if (targets.length () == 1) fndecl = targets[0]->decl; else fndecl = builtin_decl_implicit (BUILT_IN_UNREACHABLE); + if (dump_enabled_p ()) + { + location_t loc = gimple_location (stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, + "resolving virtual function address " + "reference to function %s\n", + targets.length () == 1 + ? targets[0]->name () + : "__builtin_unreachable"); + } val = fold_convert (TREE_TYPE (val), fndecl); STRIP_USELESS_TYPE_CONVERSION (val); return val; @@ -1124,9 +1136,18 @@ gimple_fold_call (gimple_stmt_iterator * bool final; vec <cgraph_node *>targets = possible_polymorphic_call_targets (callee, &final); - if (final && targets.length () <= 1) + if (final && targets.length () <= 1 && dbg_cnt (devirt)) { tree lhs = gimple_call_lhs (stmt); + if (dump_enabled_p ()) + { + location_t loc = gimple_location (stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, + "folding virtual function call to %s\n", + targets.length () == 1 + ? targets[0]->name () + : "__builtin_unreachable"); + } if (targets.length () == 1) { gimple_call_set_fndecl (stmt, targets[0]->decl); Index: tree-ssa-pre.c =================================================================== --- tree-ssa-pre.c (revision 210479) +++ tree-ssa-pre.c (working copy) @@ -4347,18 +4347,19 @@ eliminate_dom_walker::before_dom_childre continue; if (gimple_call_addr_fndecl (fn) != NULL_TREE && useless_type_conversion_p (TREE_TYPE (orig_fn), - TREE_TYPE (fn))) + TREE_TYPE (fn)) + && dbg_cnt (devirt)) { bool can_make_abnormal_goto = stmt_can_make_abnormal_goto (stmt); bool was_noreturn = gimple_call_noreturn_p (stmt); - if (dump_file && (dump_flags & TDF_DETAILS)) + if (dump_enabled_p ()) { - fprintf (dump_file, "Replacing call target with "); - print_generic_expr (dump_file, fn, 0); - fprintf (dump_file, " in "); - print_gimple_stmt (dump_file, stmt, 0, 0); + location_t loc = gimple_location (stmt); + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, + "converting indirect call to function %s\n", + cgraph_get_node (fn)->name ()); } gimple_call_set_fn (stmt, fn); Index: ChangeLog =================================================================== --- ChangeLog (revision 210479) +++ ChangeLog (working copy) @@ -1,3 +1,20 @@ +2014-05-15 Xinliang David Li <davidxl@google.com> + + * cgraphunit.c (walk_polymorphic_call_targets): Add + dbgcnt and fopt-info support. + 2014-05-15 Xinliang David Li <davidxl@google.com> + + * cgraphunit.c (walk_polymorphic_call_targets): Add + dbgcnt and fopt-info support. + * ipa-prop.c (ipa_make_edge_direct_to_target): Ditto. + * ipa-devirt.c (ipa_devirt): Ditto. + * tree-ssa-pre.c (eliminate_dom_walker::before_dom_children): + Ditto. + * ipa.c (walk_polymorphic_call_targets): Ditto. + * gimple-fold.c (fold_gimple_assign): Ditto. + (gimple_fold_call): Ditto. + * dbgcnt.def: New counter. + 2014-05-15 Martin Jambor <mjambor@suse.cz> PR ipa/61085 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-19 15:24 ` Xinliang David Li @ 2014-05-20 11:33 ` Richard Biener 2014-05-20 20:13 ` Xinliang David Li 0 siblings, 1 reply; 13+ messages in thread From: Richard Biener @ 2014-05-20 11:33 UTC (permalink / raw) To: Xinliang David Li; +Cc: Jan Hubicka, GCC Patches On Mon, May 19, 2014 at 5:24 PM, Xinliang David Li <davidxl@google.com> wrote: > Sorry about it. Here is the patch. There is one remaining case where > cgraph_dump_file and dump_enable_p are checked separately -- > cgraph_dump_file is set up differently from 'dump_file'. But there you check with an else if, so if you do -fdump-ipa-cgraph then suddenly -fopt-info will stop reporting? At least in the cgraphunit.c part of the patch. I'm ok with the rest of the patch. Thanks, Richard. > David > > > > On Mon, May 19, 2014 at 2:21 AM, Richard Biener > <richard.guenther@gmail.com> wrote: >> On Fri, May 16, 2014 at 11:19 PM, Xinliang David Li <davidxl@google.com> wrote: >>> Modified the patch according to yours and Richard's feedback. PTAL. >> >> ENOPATCH. >> >> Btw, I don't see any issue with leaking node order to opt-report. >> >> Richard. >> >>> thanks, >>> >>> David >>> >>> On Fri, May 16, 2014 at 9:03 AM, Jan Hubicka <hubicka@ucw.cz> wrote: >>>>> Hi, debugging runtime bugs due to devirtualization can be hard for >>>>> very large C++ programs with complicated class hierarchy. This patch >>>>> adds the support to report this high level transformation via >>>>> -fopt-info (not hidden inside dump file) and the ability the do binary >>>>> search with cutoff. >>>>> >>>>> Ok for trunk after build and test? >>>> >>>> Seems resonable to me. >>>>> >>>>> thanks, >>>>> >>>>> David >>>> >>>>> Index: ChangeLog >>>>> =================================================================== >>>>> --- ChangeLog (revision 210479) >>>>> +++ ChangeLog (working copy) >>>>> @@ -1,3 +1,18 @@ >>>>> +2014-05-15 Xinliang David Li <davidxl@google.com> >>>>> + >>>>> + * cgraphunit.c (walk_polymorphic_call_targets): Add >>>>> + dbgcnt and fopt-info support. >>>>> + 2014-05-15 Xinliang David Li <davidxl@google.com> >>>>> + >>>>> + * cgraphunit.c (walk_polymorphic_call_targets): Add >>>>> + dbgcnt and fopt-info support. >>>>> + * ipa-prop.c (ipa_make_edge_direct_to_target): Ditto. >>>>> + * ipa-devirt.c (ipa_devirt): Ditto. >>>>> + * ipa.c (walk_polymorphic_call_targets): Ditto. >>>>> + * gimple-fold.c (fold_gimple_assign): Ditto. >>>>> + (gimple_fold_call): Ditto. >>>>> + * dbgcnt.def: New counter. >>>>> + >>>>> 2014-05-15 Martin Jambor <mjambor@suse.cz> >>>>> >>>>> PR ipa/61085 >>>>> Index: ipa-prop.c >>>>> =================================================================== >>>>> --- ipa-prop.c (revision 210479) >>>>> +++ ipa-prop.c (working copy) >>>>> @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. >>>>> #include "ipa-utils.h" >>>>> #include "stringpool.h" >>>>> #include "tree-ssanames.h" >>>>> +#include "dbgcnt.h" >>>>> >>>>> /* Intermediate information about a parameter that is only useful during the >>>>> run of ipa_analyze_node and is not kept afterwards. */ >>>>> @@ -2494,6 +2495,13 @@ ipa_make_edge_direct_to_target (struct c >>>>> fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" >>>>> " in %s/%i, making it unreachable.\n", >>>>> ie->caller->name (), ie->caller->order); >>>>> + else if (dump_enabled_p ()) >>>>> + { >>>>> + location_t loc = gimple_location (ie->call_stmt); >>>>> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, >>>>> + "Discovered direct call to non-function in %s, " >>>>> + "making it unreachable\n", ie->caller->name ()); >>>> >>>> Perhaps "turning it to __builtin_unreachable call" and similarly in the other cases >>>> we introduce __builtin_unreachable? I think that could be easier for user to work >>>> out. >>>> >>>> What king of problems in devirtualizatoin you are seeing? >>>> >>>> >>>> Honza ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add dbgcnt and opt-info support for devirtualization 2014-05-20 11:33 ` Richard Biener @ 2014-05-20 20:13 ` Xinliang David Li 0 siblings, 0 replies; 13+ messages in thread From: Xinliang David Li @ 2014-05-20 20:13 UTC (permalink / raw) To: Richard Biener; +Cc: Jan Hubicka, GCC Patches On Tue, May 20, 2014 at 4:32 AM, Richard Biener <richard.guenther@gmail.com> wrote: > On Mon, May 19, 2014 at 5:24 PM, Xinliang David Li <davidxl@google.com> wrote: >> Sorry about it. Here is the patch. There is one remaining case where >> cgraph_dump_file and dump_enable_p are checked separately -- >> cgraph_dump_file is set up differently from 'dump_file'. > > But there you check with an else if, so if you do -fdump-ipa-cgraph > then suddenly -fopt-info will stop reporting? At least in the cgraphunit.c > part of the patch. Right. Fixed. > > I'm ok with the rest of the patch. I checked in the patch with the addition fix. thanks, David > > Thanks, > Richard. > >> David >> >> >> >> On Mon, May 19, 2014 at 2:21 AM, Richard Biener >> <richard.guenther@gmail.com> wrote: >>> On Fri, May 16, 2014 at 11:19 PM, Xinliang David Li <davidxl@google.com> wrote: >>>> Modified the patch according to yours and Richard's feedback. PTAL. >>> >>> ENOPATCH. >>> >>> Btw, I don't see any issue with leaking node order to opt-report. >>> >>> Richard. >>> >>>> thanks, >>>> >>>> David >>>> >>>> On Fri, May 16, 2014 at 9:03 AM, Jan Hubicka <hubicka@ucw.cz> wrote: >>>>>> Hi, debugging runtime bugs due to devirtualization can be hard for >>>>>> very large C++ programs with complicated class hierarchy. This patch >>>>>> adds the support to report this high level transformation via >>>>>> -fopt-info (not hidden inside dump file) and the ability the do binary >>>>>> search with cutoff. >>>>>> >>>>>> Ok for trunk after build and test? >>>>> >>>>> Seems resonable to me. >>>>>> >>>>>> thanks, >>>>>> >>>>>> David >>>>> >>>>>> Index: ChangeLog >>>>>> =================================================================== >>>>>> --- ChangeLog (revision 210479) >>>>>> +++ ChangeLog (working copy) >>>>>> @@ -1,3 +1,18 @@ >>>>>> +2014-05-15 Xinliang David Li <davidxl@google.com> >>>>>> + >>>>>> + * cgraphunit.c (walk_polymorphic_call_targets): Add >>>>>> + dbgcnt and fopt-info support. >>>>>> + 2014-05-15 Xinliang David Li <davidxl@google.com> >>>>>> + >>>>>> + * cgraphunit.c (walk_polymorphic_call_targets): Add >>>>>> + dbgcnt and fopt-info support. >>>>>> + * ipa-prop.c (ipa_make_edge_direct_to_target): Ditto. >>>>>> + * ipa-devirt.c (ipa_devirt): Ditto. >>>>>> + * ipa.c (walk_polymorphic_call_targets): Ditto. >>>>>> + * gimple-fold.c (fold_gimple_assign): Ditto. >>>>>> + (gimple_fold_call): Ditto. >>>>>> + * dbgcnt.def: New counter. >>>>>> + >>>>>> 2014-05-15 Martin Jambor <mjambor@suse.cz> >>>>>> >>>>>> PR ipa/61085 >>>>>> Index: ipa-prop.c >>>>>> =================================================================== >>>>>> --- ipa-prop.c (revision 210479) >>>>>> +++ ipa-prop.c (working copy) >>>>>> @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. >>>>>> #include "ipa-utils.h" >>>>>> #include "stringpool.h" >>>>>> #include "tree-ssanames.h" >>>>>> +#include "dbgcnt.h" >>>>>> >>>>>> /* Intermediate information about a parameter that is only useful during the >>>>>> run of ipa_analyze_node and is not kept afterwards. */ >>>>>> @@ -2494,6 +2495,13 @@ ipa_make_edge_direct_to_target (struct c >>>>>> fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" >>>>>> " in %s/%i, making it unreachable.\n", >>>>>> ie->caller->name (), ie->caller->order); >>>>>> + else if (dump_enabled_p ()) >>>>>> + { >>>>>> + location_t loc = gimple_location (ie->call_stmt); >>>>>> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, >>>>>> + "Discovered direct call to non-function in %s, " >>>>>> + "making it unreachable\n", ie->caller->name ()); >>>>> >>>>> Perhaps "turning it to __builtin_unreachable call" and similarly in the other cases >>>>> we introduce __builtin_unreachable? I think that could be easier for user to work >>>>> out. >>>>> >>>>> What king of problems in devirtualizatoin you are seeing? >>>>> >>>>> >>>>> Honza ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2014-05-20 20:13 UTC | newest] Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-05-15 23:55 add dbgcnt and opt-info support for devirtualization Xinliang David Li 2014-05-16 11:00 ` Richard Biener 2014-05-16 15:30 ` Xinliang David Li 2014-05-16 16:03 ` Jan Hubicka 2014-05-16 16:14 ` Xinliang David Li 2014-05-16 16:51 ` Jan Hubicka 2014-05-16 17:45 ` Xinliang David Li 2014-05-16 21:19 ` Xinliang David Li 2014-05-18 21:55 ` Xinliang David Li 2014-05-19 9:21 ` Richard Biener 2014-05-19 15:24 ` Xinliang David Li 2014-05-20 11:33 ` Richard Biener 2014-05-20 20:13 ` Xinliang David Li
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).