Message ID | 546F278D.6080308@suse.cz |
---|---|
State | New |
Headers | show |
On Fri, Nov 21, 2014 at 12:52 PM, Martin Liška <mliska@suse.cz> wrote: > On 11/20/2014 05:41 PM, Richard Biener wrote: >> >> On Thu, Nov 20, 2014 at 5:30 PM, Martin Liška <mliska@suse.cz> wrote: >>> >>> Hello. >>> >>> Following patch fixes ICE in IPA ICF. Problem was that number of >>> non-debug >>> statements in a BB can >>> change (for instance by IPA split), so that the number is recomputed. >> >> >> Huh, so can it get different for both candidates? I think the stmt >> compare >> loop should be terminated on gsi_end_p of either iterator and return >> false for any remaining non-debug-stmts on the other. >> >> Thus, not walk all stmts twice here. > > > Hello. > > Sorry for the previous patch, you are right it can be fixed in purer way. > Please take a look at attached patch. > >> >> As IPA split is run early I don't see how it should affect a real IPA >> pass though? > > > > > Sorry for non precise information, the problematic BB is changed here: > #0 gsi_split_seq_before (i=0x7fffffffd550, pnew_seq=0x7fffffffd528) at > ../../gcc/gimple-iterator.c:429 > #1 0x0000000000b95a2a in gimple_split_block (bb=0x7ffff6c41548, stmt=0x0) > at ../../gcc/tree-cfg.c:5707 > #2 0x00000000007563cf in split_block (bb=0x7ffff6c41548, i=i@entry=0x0) at > ../../gcc/cfghooks.c:508 > #3 0x0000000000756b44 in split_block_after_labels (bb=<optimized out>) at > ../../gcc/cfghooks.c:549 > #4 make_forwarder_block (bb=<optimized out>, > redirect_edge_p=redirect_edge_p@entry=0x75d4e0 <mfb_keep_just(edge_def*)>, > new_bb_cbk=new_bb_cbk@entry=0x0) at ../../gcc/cfghooks.c:842 > #5 0x000000000076085a in create_preheader (loop=0x7ffff6d56948, > flags=<optimized out>) at ../../gcc/cfgloopmanip.c:1563 > #6 0x0000000000760aea in create_preheaders (flags=1) at > ../../gcc/cfgloopmanip.c:1613 > #7 0x00000000009bc6b0 in apply_loop_flags (flags=15) at > ../../gcc/loop-init.c:75 > #8 0x00000000009bc7d3 in loop_optimizer_init (flags=15) at > ../../gcc/loop-init.c:136 > #9 0x0000000000957914 in estimate_function_body_sizes (node=0x7ffff6c47620, > early=false) at ../../gcc/ipa-inline-analysis.c:2480 > #10 0x000000000095948b in compute_inline_parameters (node=0x7ffff6c47620, > early=false) at ../../gcc/ipa-inline-analysis.c:2907 > #11 0x000000000095bd88 in inline_analyze_function (node=0x7ffff6c47620) at > ../../gcc/ipa-inline-analysis.c:3994 > #12 0x000000000095bed3 in inline_generate_summary () at > ../../gcc/ipa-inline-analysis.c:4045 > #13 0x0000000000a70b71 in execute_ipa_summary_passes (ipa_pass=0x1dcb9e0) at So inline_summary is generated after IPA-ICF does its job? But the bug is obviously that an IPA analysis phase does a code transform (here initializes loops without AVOID_CFG_MANIPULATIONS). Honza - if that is really needed then I think we should make sure loops are initialized at the start of the IPA analysis phase, not randomly inbetween. Thanks, Richard. > ../../gcc/passes.c:2137 > #14 0x0000000000777a15 in ipa_passes () at ../../gcc/cgraphunit.c:2074 > #15 symbol_table::compile (this=this@entry=0x7ffff6c3a000) at > ../../gcc/cgraphunit.c:2187 > #16 0x0000000000778bcd in symbol_table::finalize_compilation_unit > (this=0x7ffff6c3a000) at ../../gcc/cgraphunit.c:2340 > #17 0x00000000006580ee in c_write_global_declarations () at > ../../gcc/c/c-decl.c:10777 > #18 0x0000000000b5bb8b in compile_file () at ../../gcc/toplev.c:584 > #19 0x0000000000b5def1 in do_compile () at ../../gcc/toplev.c:2041 > #20 0x0000000000b5e0fa in toplev::main (this=0x7fffffffdc9f, argc=20, > argv=0x7fffffffdd98) at ../../gcc/toplev.c:2138 > #21 0x000000000063f1d9 in main (argc=20, argv=0x7fffffffdd98) at > ../../gcc/main.c:38 > > > Patch can bootstrap on x86_64-linux-pc and no regression has been seen. > Ready for trunk? > > > Thanks, > Martin > >> >> Thanks, >> Richard. >> >>> Patch can bootstrap on x86_64-linux-pc and no regression has been seen. >>> Ready for trunk? >>> >>> Thanks, >>> Martin > >
On 11/21/2014 01:23 PM, Richard Biener wrote: > On Fri, Nov 21, 2014 at 12:52 PM, Martin Liška <mliska@suse.cz> wrote: >> On 11/20/2014 05:41 PM, Richard Biener wrote: >>> >>> On Thu, Nov 20, 2014 at 5:30 PM, Martin Liška <mliska@suse.cz> wrote: >>>> >>>> Hello. >>>> >>>> Following patch fixes ICE in IPA ICF. Problem was that number of >>>> non-debug >>>> statements in a BB can >>>> change (for instance by IPA split), so that the number is recomputed. >>> >>> >>> Huh, so can it get different for both candidates? I think the stmt >>> compare >>> loop should be terminated on gsi_end_p of either iterator and return >>> false for any remaining non-debug-stmts on the other. >>> >>> Thus, not walk all stmts twice here. >> >> >> Hello. >> >> Sorry for the previous patch, you are right it can be fixed in purer way. >> Please take a look at attached patch. >> >>> >>> As IPA split is run early I don't see how it should affect a real IPA >>> pass though? >> >> >> >> >> Sorry for non precise information, the problematic BB is changed here: >> #0 gsi_split_seq_before (i=0x7fffffffd550, pnew_seq=0x7fffffffd528) at >> ../../gcc/gimple-iterator.c:429 >> #1 0x0000000000b95a2a in gimple_split_block (bb=0x7ffff6c41548, stmt=0x0) >> at ../../gcc/tree-cfg.c:5707 >> #2 0x00000000007563cf in split_block (bb=0x7ffff6c41548, i=i@entry=0x0) at >> ../../gcc/cfghooks.c:508 >> #3 0x0000000000756b44 in split_block_after_labels (bb=<optimized out>) at >> ../../gcc/cfghooks.c:549 >> #4 make_forwarder_block (bb=<optimized out>, >> redirect_edge_p=redirect_edge_p@entry=0x75d4e0 <mfb_keep_just(edge_def*)>, >> new_bb_cbk=new_bb_cbk@entry=0x0) at ../../gcc/cfghooks.c:842 >> #5 0x000000000076085a in create_preheader (loop=0x7ffff6d56948, >> flags=<optimized out>) at ../../gcc/cfgloopmanip.c:1563 >> #6 0x0000000000760aea in create_preheaders (flags=1) at >> ../../gcc/cfgloopmanip.c:1613 >> #7 0x00000000009bc6b0 in apply_loop_flags (flags=15) at >> ../../gcc/loop-init.c:75 >> #8 0x00000000009bc7d3 in loop_optimizer_init (flags=15) at >> ../../gcc/loop-init.c:136 >> #9 0x0000000000957914 in estimate_function_body_sizes (node=0x7ffff6c47620, >> early=false) at ../../gcc/ipa-inline-analysis.c:2480 >> #10 0x000000000095948b in compute_inline_parameters (node=0x7ffff6c47620, >> early=false) at ../../gcc/ipa-inline-analysis.c:2907 >> #11 0x000000000095bd88 in inline_analyze_function (node=0x7ffff6c47620) at >> ../../gcc/ipa-inline-analysis.c:3994 >> #12 0x000000000095bed3 in inline_generate_summary () at >> ../../gcc/ipa-inline-analysis.c:4045 >> #13 0x0000000000a70b71 in execute_ipa_summary_passes (ipa_pass=0x1dcb9e0) at > > So inline_summary is generated after IPA-ICF does its job? > > But the bug is obviously that an IPA analysis phase does a code transform > (here initializes loops without AVOID_CFG_MANIPULATIONS). > Honza - if that is really needed then I think we should make sure > loops are initialized at the start of the IPA analysis phase, not randomly > inbetween. > > Thanks, > Richard. Hello. Even thought the root of problem is hidden somewhere in loop creation, I would like to apply the patch which makes iteration of non-debug gimple statement more clearly? What do you think Richard? Thanks, Martin > >> ../../gcc/passes.c:2137 >> #14 0x0000000000777a15 in ipa_passes () at ../../gcc/cgraphunit.c:2074 >> #15 symbol_table::compile (this=this@entry=0x7ffff6c3a000) at >> ../../gcc/cgraphunit.c:2187 >> #16 0x0000000000778bcd in symbol_table::finalize_compilation_unit >> (this=0x7ffff6c3a000) at ../../gcc/cgraphunit.c:2340 >> #17 0x00000000006580ee in c_write_global_declarations () at >> ../../gcc/c/c-decl.c:10777 >> #18 0x0000000000b5bb8b in compile_file () at ../../gcc/toplev.c:584 >> #19 0x0000000000b5def1 in do_compile () at ../../gcc/toplev.c:2041 >> #20 0x0000000000b5e0fa in toplev::main (this=0x7fffffffdc9f, argc=20, >> argv=0x7fffffffdd98) at ../../gcc/toplev.c:2138 >> #21 0x000000000063f1d9 in main (argc=20, argv=0x7fffffffdd98) at >> ../../gcc/main.c:38 >> >> >> Patch can bootstrap on x86_64-linux-pc and no regression has been seen. >> Ready for trunk? >> >> >> Thanks, >> Martin >> >>> >>> Thanks, >>> Richard. >>> >>>> Patch can bootstrap on x86_64-linux-pc and no regression has been seen. >>>> Ready for trunk? >>>> >>>> Thanks, >>>> Martin >> >>
On Tue, Dec 9, 2014 at 4:52 PM, Martin Liška <mliska@suse.cz> wrote: > On 11/21/2014 01:23 PM, Richard Biener wrote: >> >> On Fri, Nov 21, 2014 at 12:52 PM, Martin Liška <mliska@suse.cz> wrote: >>> >>> On 11/20/2014 05:41 PM, Richard Biener wrote: >>>> >>>> >>>> On Thu, Nov 20, 2014 at 5:30 PM, Martin Liška <mliska@suse.cz> wrote: >>>>> >>>>> >>>>> Hello. >>>>> >>>>> Following patch fixes ICE in IPA ICF. Problem was that number of >>>>> non-debug >>>>> statements in a BB can >>>>> change (for instance by IPA split), so that the number is recomputed. >>>> >>>> >>>> >>>> Huh, so can it get different for both candidates? I think the stmt >>>> compare >>>> loop should be terminated on gsi_end_p of either iterator and return >>>> false for any remaining non-debug-stmts on the other. >>>> >>>> Thus, not walk all stmts twice here. >>> >>> >>> >>> Hello. >>> >>> Sorry for the previous patch, you are right it can be fixed in purer way. >>> Please take a look at attached patch. >>> >>>> >>>> As IPA split is run early I don't see how it should affect a real IPA >>>> pass though? >>> >>> >>> >>> >>> >>> Sorry for non precise information, the problematic BB is changed here: >>> #0 gsi_split_seq_before (i=0x7fffffffd550, pnew_seq=0x7fffffffd528) at >>> ../../gcc/gimple-iterator.c:429 >>> #1 0x0000000000b95a2a in gimple_split_block (bb=0x7ffff6c41548, >>> stmt=0x0) >>> at ../../gcc/tree-cfg.c:5707 >>> #2 0x00000000007563cf in split_block (bb=0x7ffff6c41548, i=i@entry=0x0) >>> at >>> ../../gcc/cfghooks.c:508 >>> #3 0x0000000000756b44 in split_block_after_labels (bb=<optimized out>) >>> at >>> ../../gcc/cfghooks.c:549 >>> #4 make_forwarder_block (bb=<optimized out>, >>> redirect_edge_p=redirect_edge_p@entry=0x75d4e0 >>> <mfb_keep_just(edge_def*)>, >>> new_bb_cbk=new_bb_cbk@entry=0x0) at ../../gcc/cfghooks.c:842 >>> #5 0x000000000076085a in create_preheader (loop=0x7ffff6d56948, >>> flags=<optimized out>) at ../../gcc/cfgloopmanip.c:1563 >>> #6 0x0000000000760aea in create_preheaders (flags=1) at >>> ../../gcc/cfgloopmanip.c:1613 >>> #7 0x00000000009bc6b0 in apply_loop_flags (flags=15) at >>> ../../gcc/loop-init.c:75 >>> #8 0x00000000009bc7d3 in loop_optimizer_init (flags=15) at >>> ../../gcc/loop-init.c:136 >>> #9 0x0000000000957914 in estimate_function_body_sizes >>> (node=0x7ffff6c47620, >>> early=false) at ../../gcc/ipa-inline-analysis.c:2480 >>> #10 0x000000000095948b in compute_inline_parameters (node=0x7ffff6c47620, >>> early=false) at ../../gcc/ipa-inline-analysis.c:2907 >>> #11 0x000000000095bd88 in inline_analyze_function (node=0x7ffff6c47620) >>> at >>> ../../gcc/ipa-inline-analysis.c:3994 >>> #12 0x000000000095bed3 in inline_generate_summary () at >>> ../../gcc/ipa-inline-analysis.c:4045 >>> #13 0x0000000000a70b71 in execute_ipa_summary_passes (ipa_pass=0x1dcb9e0) >>> at >> >> >> So inline_summary is generated after IPA-ICF does its job? >> >> But the bug is obviously that an IPA analysis phase does a code transform >> (here initializes loops without AVOID_CFG_MANIPULATIONS). >> Honza - if that is really needed then I think we should make sure >> loops are initialized at the start of the IPA analysis phase, not randomly >> inbetween. >> >> Thanks, >> Richard. > > > Hello. > > Even thought the root of problem is hidden somewhere in loop creation, I > would > like to apply the patch which makes iteration of non-debug gimple statement > more clearly? > > What do you think Richard? Works for me - but we have to address the underlying issue. Richard. > Thanks, > Martin > > >> >>> ../../gcc/passes.c:2137 >>> #14 0x0000000000777a15 in ipa_passes () at ../../gcc/cgraphunit.c:2074 >>> #15 symbol_table::compile (this=this@entry=0x7ffff6c3a000) at >>> ../../gcc/cgraphunit.c:2187 >>> #16 0x0000000000778bcd in symbol_table::finalize_compilation_unit >>> (this=0x7ffff6c3a000) at ../../gcc/cgraphunit.c:2340 >>> #17 0x00000000006580ee in c_write_global_declarations () at >>> ../../gcc/c/c-decl.c:10777 >>> #18 0x0000000000b5bb8b in compile_file () at ../../gcc/toplev.c:584 >>> #19 0x0000000000b5def1 in do_compile () at ../../gcc/toplev.c:2041 >>> #20 0x0000000000b5e0fa in toplev::main (this=0x7fffffffdc9f, argc=20, >>> argv=0x7fffffffdd98) at ../../gcc/toplev.c:2138 >>> #21 0x000000000063f1d9 in main (argc=20, argv=0x7fffffffdd98) at >>> ../../gcc/main.c:38 >>> >>> >>> Patch can bootstrap on x86_64-linux-pc and no regression has been seen. >>> Ready for trunk? >>> >>> >>> Thanks, >>> Martin >>> >>>> >>>> Thanks, >>>> Richard. >>>> >>>>> Patch can bootstrap on x86_64-linux-pc and no regression has been seen. >>>>> Ready for trunk? >>>>> >>>>> Thanks, >>>>> Martin >>> >>> >>> >
On 12/10/2014 02:26 PM, Richard Biener wrote: > On Tue, Dec 9, 2014 at 4:52 PM, Martin Liška <mliska@suse.cz> wrote: >> On 11/21/2014 01:23 PM, Richard Biener wrote: >>> >>> On Fri, Nov 21, 2014 at 12:52 PM, Martin Liška <mliska@suse.cz> wrote: >>>> >>>> On 11/20/2014 05:41 PM, Richard Biener wrote: >>>>> >>>>> >>>>> On Thu, Nov 20, 2014 at 5:30 PM, Martin Liška <mliska@suse.cz> wrote: >>>>>> >>>>>> >>>>>> Hello. >>>>>> >>>>>> Following patch fixes ICE in IPA ICF. Problem was that number of >>>>>> non-debug >>>>>> statements in a BB can >>>>>> change (for instance by IPA split), so that the number is recomputed. >>>>> >>>>> >>>>> >>>>> Huh, so can it get different for both candidates? I think the stmt >>>>> compare >>>>> loop should be terminated on gsi_end_p of either iterator and return >>>>> false for any remaining non-debug-stmts on the other. >>>>> >>>>> Thus, not walk all stmts twice here. >>>> >>>> >>>> >>>> Hello. >>>> >>>> Sorry for the previous patch, you are right it can be fixed in purer way. >>>> Please take a look at attached patch. >>>> >>>>> >>>>> As IPA split is run early I don't see how it should affect a real IPA >>>>> pass though? >>>> >>>> >>>> >>>> >>>> >>>> Sorry for non precise information, the problematic BB is changed here: >>>> #0 gsi_split_seq_before (i=0x7fffffffd550, pnew_seq=0x7fffffffd528) at >>>> ../../gcc/gimple-iterator.c:429 >>>> #1 0x0000000000b95a2a in gimple_split_block (bb=0x7ffff6c41548, >>>> stmt=0x0) >>>> at ../../gcc/tree-cfg.c:5707 >>>> #2 0x00000000007563cf in split_block (bb=0x7ffff6c41548, i=i@entry=0x0) >>>> at >>>> ../../gcc/cfghooks.c:508 >>>> #3 0x0000000000756b44 in split_block_after_labels (bb=<optimized out>) >>>> at >>>> ../../gcc/cfghooks.c:549 >>>> #4 make_forwarder_block (bb=<optimized out>, >>>> redirect_edge_p=redirect_edge_p@entry=0x75d4e0 >>>> <mfb_keep_just(edge_def*)>, >>>> new_bb_cbk=new_bb_cbk@entry=0x0) at ../../gcc/cfghooks.c:842 >>>> #5 0x000000000076085a in create_preheader (loop=0x7ffff6d56948, >>>> flags=<optimized out>) at ../../gcc/cfgloopmanip.c:1563 >>>> #6 0x0000000000760aea in create_preheaders (flags=1) at >>>> ../../gcc/cfgloopmanip.c:1613 >>>> #7 0x00000000009bc6b0 in apply_loop_flags (flags=15) at >>>> ../../gcc/loop-init.c:75 >>>> #8 0x00000000009bc7d3 in loop_optimizer_init (flags=15) at >>>> ../../gcc/loop-init.c:136 >>>> #9 0x0000000000957914 in estimate_function_body_sizes >>>> (node=0x7ffff6c47620, >>>> early=false) at ../../gcc/ipa-inline-analysis.c:2480 >>>> #10 0x000000000095948b in compute_inline_parameters (node=0x7ffff6c47620, >>>> early=false) at ../../gcc/ipa-inline-analysis.c:2907 >>>> #11 0x000000000095bd88 in inline_analyze_function (node=0x7ffff6c47620) >>>> at >>>> ../../gcc/ipa-inline-analysis.c:3994 >>>> #12 0x000000000095bed3 in inline_generate_summary () at >>>> ../../gcc/ipa-inline-analysis.c:4045 >>>> #13 0x0000000000a70b71 in execute_ipa_summary_passes (ipa_pass=0x1dcb9e0) >>>> at >>> >>> >>> So inline_summary is generated after IPA-ICF does its job? >>> >>> But the bug is obviously that an IPA analysis phase does a code transform >>> (here initializes loops without AVOID_CFG_MANIPULATIONS). >>> Honza - if that is really needed then I think we should make sure >>> loops are initialized at the start of the IPA analysis phase, not randomly >>> inbetween. >>> >>> Thanks, >>> Richard. >> >> >> Hello. >> >> Even thought the root of problem is hidden somewhere in loop creation, I >> would >> like to apply the patch which makes iteration of non-debug gimple statement >> more clearly? >> >> What do you think Richard? > > Works for me - but we have to address the underlying issue. > > Richard. Thank you, I've just create another issue that is related to inliner analysis, where the transformation occurs: PR64253. Thanks, Martin > >> Thanks, >> Martin >> >> >>> >>>> ../../gcc/passes.c:2137 >>>> #14 0x0000000000777a15 in ipa_passes () at ../../gcc/cgraphunit.c:2074 >>>> #15 symbol_table::compile (this=this@entry=0x7ffff6c3a000) at >>>> ../../gcc/cgraphunit.c:2187 >>>> #16 0x0000000000778bcd in symbol_table::finalize_compilation_unit >>>> (this=0x7ffff6c3a000) at ../../gcc/cgraphunit.c:2340 >>>> #17 0x00000000006580ee in c_write_global_declarations () at >>>> ../../gcc/c/c-decl.c:10777 >>>> #18 0x0000000000b5bb8b in compile_file () at ../../gcc/toplev.c:584 >>>> #19 0x0000000000b5def1 in do_compile () at ../../gcc/toplev.c:2041 >>>> #20 0x0000000000b5e0fa in toplev::main (this=0x7fffffffdc9f, argc=20, >>>> argv=0x7fffffffdd98) at ../../gcc/toplev.c:2138 >>>> #21 0x000000000063f1d9 in main (argc=20, argv=0x7fffffffdd98) at >>>> ../../gcc/main.c:38 >>>> >>>> >>>> Patch can bootstrap on x86_64-linux-pc and no regression has been seen. >>>> Ready for trunk? >>>> >>>> >>>> Thanks, >>>> Martin >>>> >>>>> >>>>> Thanks, >>>>> Richard. >>>>> >>>>>> Patch can bootstrap on x86_64-linux-pc and no regression has been seen. >>>>>> Ready for trunk? >>>>>> >>>>>> Thanks, >>>>>> Martin >>>> >>>> >>>> >>
From 09b90f6a5ec1e49464f57c333af43574ad8c1375 Mon Sep 17 00:00:00 2001 From: mliska <mliska@suse.cz> Date: Thu, 20 Nov 2014 16:28:54 +0100 Subject: [PATCH] Fix and new test. gcc/ChangeLog: 2014-11-21 Martin Liska <mliska@suse.cz> * gimple-iterator.h (gsi_start_bb_nondebug): New function. * ipa-icf-gimple.c (func_checker::compare_bb): Correct iteration replaces loop based on precomputed number of non-debug statements. gcc/testsuite/ChangeLog: 2014-11-21 Martin Liska <mliska@suse.cz> * gcc.dg/ipa/pr63909.c: New test. --- gcc/gimple-iterator.h | 13 +++++++++++++ gcc/ipa-icf-gimple.c | 25 ++++++++++--------------- gcc/testsuite/gcc.dg/ipa/pr63909.c | 27 +++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/ipa/pr63909.c diff --git a/gcc/gimple-iterator.h b/gcc/gimple-iterator.h index fb6cc07..e9602b3 100644 --- a/gcc/gimple-iterator.h +++ b/gcc/gimple-iterator.h @@ -211,6 +211,19 @@ gsi_stmt (gimple_stmt_iterator i) return i.ptr; } +/* Return a new iterator pointing to the first non-debug statement + in basic block BB. */ + +static inline gimple_stmt_iterator +gsi_start_bb_nondebug (basic_block bb) +{ + gimple_stmt_iterator gsi = gsi_start_bb (bb); + while (!gsi_end_p (gsi) && is_gimple_debug (gsi_stmt (gsi))) + gsi_next (&gsi); + + return gsi; +} + /* Return a block statement iterator that points to the first non-label statement in block BB. */ diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c index 8f2a438..ec0290a 100644 --- a/gcc/ipa-icf-gimple.c +++ b/gcc/ipa-icf-gimple.c @@ -559,24 +559,16 @@ func_checker::parse_labels (sem_bb *bb) bool func_checker::compare_bb (sem_bb *bb1, sem_bb *bb2) { - unsigned i; gimple_stmt_iterator gsi1, gsi2; gimple s1, s2; - if (bb1->nondbg_stmt_count != bb2->nondbg_stmt_count - || bb1->edge_count != bb2->edge_count) - return return_false (); - - gsi1 = gsi_start_bb (bb1->bb); - gsi2 = gsi_start_bb (bb2->bb); + gsi1 = gsi_start_bb_nondebug (bb1->bb); + gsi2 = gsi_start_bb_nondebug (bb2->bb); - for (i = 0; i < bb1->nondbg_stmt_count; i++) + while (!gsi_end_p (gsi1)) { - if (is_gimple_debug (gsi_stmt (gsi1))) - gsi_next_nondebug (&gsi1); - - if (is_gimple_debug (gsi_stmt (gsi2))) - gsi_next_nondebug (&gsi2); + if (gsi_end_p (gsi2)) + return return_false (); s1 = gsi_stmt (gsi1); s2 = gsi_stmt (gsi2); @@ -646,10 +638,13 @@ func_checker::compare_bb (sem_bb *bb1, sem_bb *bb2) return return_false_with_msg ("Unknown GIMPLE code reached"); } - gsi_next (&gsi1); - gsi_next (&gsi2); + gsi_next_nondebug (&gsi1); + gsi_next_nondebug (&gsi2); } + if (!gsi_end_p (gsi2)) + return return_false (); + return true; } diff --git a/gcc/testsuite/gcc.dg/ipa/pr63909.c b/gcc/testsuite/gcc.dg/ipa/pr63909.c new file mode 100644 index 0000000..8538e21 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pr63909.c @@ -0,0 +1,27 @@ +/* { dg-options "-O2 -fno-guess-branch-probability" } */ + +int z; + +__attribute__((noinline)) +void g () +{ + if (++z) + __builtin_exit (0); + g (); +} + +__attribute__((noinline)) +void f () +{ + if (++z) + __builtin_exit (0); + f (); +} + +int main() +{ + f (); + g (); + + return 0; +} -- 2.1.2