Message ID | CAFiYyc2b3GBhtGk4=ayRqZj1Y+KfhJHwDhd5GQvaVMz0_4vc=w@mail.gmail.com |
---|---|
State | New |
Headers | show |
On Wed, Mar 25, 2015 at 10:38:56AM +0100, Richard Biener wrote: > --- gcc/passes.c (revision 221633) > +++ gcc/passes.c (working copy) > @@ -156,7 +156,8 @@ void > pass_manager::execute_early_local_passes () > { > execute_pass_list (cfun, pass_build_ssa_passes_1->sub); > - execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub); > + if (flag_check_pointer_bounds) > + execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub); > execute_pass_list (cfun, pass_local_optimization_passes_1->sub); > } > > @@ -424,7 +425,8 @@ public: > virtual bool gate (function *) > { > /* Don't bother doing anything if the program has errors. */ > - return (!seen_error () && !in_lto_p); > + return (flag_check_pointer_bounds > + && !seen_error () && !in_lto_p); > } > > }; // class pass_chkp_instrumentation_passes There is still the wasteful pass_fixup_cfg at the start of: PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes) NEXT_PASS (pass_fixup_cfg); which wasn't there before chkp. Perhaps this should be a different pass with the same execute method, but gate containing flag_check_pointer_bounds? Jakub
2015-03-25 12:50 GMT+03:00 Jakub Jelinek <jakub@redhat.com>: > On Wed, Mar 25, 2015 at 10:38:56AM +0100, Richard Biener wrote: >> --- gcc/passes.c (revision 221633) >> +++ gcc/passes.c (working copy) >> @@ -156,7 +156,8 @@ void >> pass_manager::execute_early_local_passes () >> { >> execute_pass_list (cfun, pass_build_ssa_passes_1->sub); >> - execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub); >> + if (flag_check_pointer_bounds) >> + execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub); >> execute_pass_list (cfun, pass_local_optimization_passes_1->sub); >> } >> >> @@ -424,7 +425,8 @@ public: >> virtual bool gate (function *) >> { >> /* Don't bother doing anything if the program has errors. */ >> - return (!seen_error () && !in_lto_p); >> + return (flag_check_pointer_bounds >> + && !seen_error () && !in_lto_p); >> } >> >> }; // class pass_chkp_instrumentation_passes > > There is still the wasteful pass_fixup_cfg at the start of: > PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes) > NEXT_PASS (pass_fixup_cfg); > which wasn't there before chkp. Perhaps this should be a different > pass with the same execute method, but gate containing > flag_check_pointer_bounds? IIRC the reason for this pass was a different passes split, not instrumentation itself. Previously function processing always started with pass_fixup_cfg. Splitting processing into three stages we got three pass_fixup_cfg passes. Ilya > > Jakub
On Wed, Mar 25, 2015 at 01:06:46PM +0300, Ilya Enkovich wrote: > > There is still the wasteful pass_fixup_cfg at the start of: > > PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes) > > NEXT_PASS (pass_fixup_cfg); > > which wasn't there before chkp. Perhaps this should be a different > > pass with the same execute method, but gate containing > > flag_check_pointer_bounds? > > IIRC the reason for this pass was a different passes split, not > instrumentation itself. Previously function processing always started > with pass_fixup_cfg. Splitting processing into three stages we got > three pass_fixup_cfg passes. Sure, but it would be really nice if for !flag_check_pointer_bounds we really could have just one stage again, rather than 3. When it is a global option, and for LTO ideally ored in from all the TUs, that shouldn't be that hard... Jakub
On Wed, Mar 25, 2015 at 10:50 AM, Jakub Jelinek <jakub@redhat.com> wrote: > On Wed, Mar 25, 2015 at 10:38:56AM +0100, Richard Biener wrote: >> --- gcc/passes.c (revision 221633) >> +++ gcc/passes.c (working copy) >> @@ -156,7 +156,8 @@ void >> pass_manager::execute_early_local_passes () >> { >> execute_pass_list (cfun, pass_build_ssa_passes_1->sub); >> - execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub); >> + if (flag_check_pointer_bounds) >> + execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub); >> execute_pass_list (cfun, pass_local_optimization_passes_1->sub); >> } >> >> @@ -424,7 +425,8 @@ public: >> virtual bool gate (function *) >> { >> /* Don't bother doing anything if the program has errors. */ >> - return (!seen_error () && !in_lto_p); >> + return (flag_check_pointer_bounds >> + && !seen_error () && !in_lto_p); >> } >> >> }; // class pass_chkp_instrumentation_passes > > There is still the wasteful pass_fixup_cfg at the start of: > PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes) > NEXT_PASS (pass_fixup_cfg); > which wasn't there before chkp. Perhaps this should be a different > pass with the same execute method, but gate containing > flag_check_pointer_bounds? That's not wasteful but required due to local_pure_const. The remaining wasteful fixup_cfg is the one in pass_build_ssa_passes. ISTR that pass_ipa_chkp_versioning/early_produce_thunks makes that one required? Or EH / CFG cleanup stuff makes it necessary to not fail IL checking done by into-SSA. Richard. > Jakub
On Wed, Mar 25, 2015 at 11:11 AM, Jakub Jelinek <jakub@redhat.com> wrote: > On Wed, Mar 25, 2015 at 01:06:46PM +0300, Ilya Enkovich wrote: >> > There is still the wasteful pass_fixup_cfg at the start of: >> > PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes) >> > NEXT_PASS (pass_fixup_cfg); >> > which wasn't there before chkp. Perhaps this should be a different >> > pass with the same execute method, but gate containing >> > flag_check_pointer_bounds? >> >> IIRC the reason for this pass was a different passes split, not >> instrumentation itself. Previously function processing always started >> with pass_fixup_cfg. Splitting processing into three stages we got >> three pass_fixup_cfg passes. > > Sure, but it would be really nice if for !flag_check_pointer_bounds > we really could have just one stage again, rather than 3. > When it is a global option, and for LTO ideally ored in from all the TUs, > that shouldn't be that hard... LTO doesn't even run all this stuff at it only runs before LTO streaming. I don't think we want to go back to not going into SSA for all functions before early-opts (esp. early inlining). Which unfortunately won't get the EH cleanup related benefits. Btw, execute_fixup_cfg can be optimized as well - edge purging only needs to be done for the last stmt of a BB. Richard. > Jakub
2015-03-25 13:15 GMT+03:00 Richard Biener <richard.guenther@gmail.com>: > On Wed, Mar 25, 2015 at 10:50 AM, Jakub Jelinek <jakub@redhat.com> wrote: >> On Wed, Mar 25, 2015 at 10:38:56AM +0100, Richard Biener wrote: >>> --- gcc/passes.c (revision 221633) >>> +++ gcc/passes.c (working copy) >>> @@ -156,7 +156,8 @@ void >>> pass_manager::execute_early_local_passes () >>> { >>> execute_pass_list (cfun, pass_build_ssa_passes_1->sub); >>> - execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub); >>> + if (flag_check_pointer_bounds) >>> + execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub); >>> execute_pass_list (cfun, pass_local_optimization_passes_1->sub); >>> } >>> >>> @@ -424,7 +425,8 @@ public: >>> virtual bool gate (function *) >>> { >>> /* Don't bother doing anything if the program has errors. */ >>> - return (!seen_error () && !in_lto_p); >>> + return (flag_check_pointer_bounds >>> + && !seen_error () && !in_lto_p); >>> } >>> >>> }; // class pass_chkp_instrumentation_passes >> >> There is still the wasteful pass_fixup_cfg at the start of: >> PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes) >> NEXT_PASS (pass_fixup_cfg); >> which wasn't there before chkp. Perhaps this should be a different >> pass with the same execute method, but gate containing >> flag_check_pointer_bounds? > > That's not wasteful but required due to local_pure_const. The remaining > wasteful fixup_cfg is the one in pass_build_ssa_passes. ISTR > that pass_ipa_chkp_versioning/early_produce_thunks makes that one > required? Or EH / CFG cleanup stuff makes it necessary to not > fail IL checking done by into-SSA. These two chkp passes don't modify function bodies (mat remove it though). I don't expect them to require following fixup_cfg. Ilya > > Richard. > >> Jakub
Index: gcc/passes.c =================================================================== --- gcc/passes.c (revision 221633) +++ gcc/passes.c (working copy) @@ -156,7 +156,8 @@ void pass_manager::execute_early_local_passes () { execute_pass_list (cfun, pass_build_ssa_passes_1->sub); - execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub); + if (flag_check_pointer_bounds) + execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub); execute_pass_list (cfun, pass_local_optimization_passes_1->sub); } @@ -424,7 +425,8 @@ public: virtual bool gate (function *) { /* Don't bother doing anything if the program has errors. */ - return (!seen_error () && !in_lto_p); + return (flag_check_pointer_bounds + && !seen_error () && !in_lto_p); } }; // class pass_chkp_instrumentation_passes