Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()

2014-12-10 Thread Richard Biener
On Tue, Dec 9, 2014 at 4:52 PM, Martin Liška mli...@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 mli...@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 mli...@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=0x7fffd550, pnew_seq=0x7fffd528) at
 ../../gcc/gimple-iterator.c:429
 #1  0x00b95a2a in gimple_split_block (bb=0x76c41548,
 stmt=0x0)
 at ../../gcc/tree-cfg.c:5707
 #2  0x007563cf in split_block (bb=0x76c41548, i=i@entry=0x0)
 at
 ../../gcc/cfghooks.c:508
 #3  0x00756b44 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  0x0076085a in create_preheader (loop=0x76d56948,
 flags=optimized out) at ../../gcc/cfgloopmanip.c:1563
 #6  0x00760aea in create_preheaders (flags=1) at
 ../../gcc/cfgloopmanip.c:1613
 #7  0x009bc6b0 in apply_loop_flags (flags=15) at
 ../../gcc/loop-init.c:75
 #8  0x009bc7d3 in loop_optimizer_init (flags=15) at
 ../../gcc/loop-init.c:136
 #9  0x00957914 in estimate_function_body_sizes
 (node=0x76c47620,
 early=false) at ../../gcc/ipa-inline-analysis.c:2480
 #10 0x0095948b in compute_inline_parameters (node=0x76c47620,
 early=false) at ../../gcc/ipa-inline-analysis.c:2907
 #11 0x0095bd88 in inline_analyze_function (node=0x76c47620)
 at
 ../../gcc/ipa-inline-analysis.c:3994
 #12 0x0095bed3 in inline_generate_summary () at
 ../../gcc/ipa-inline-analysis.c:4045
 #13 0x00a70b71 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 0x00777a15 in ipa_passes () at ../../gcc/cgraphunit.c:2074
 #15 symbol_table::compile (this=this@entry=0x76c3a000) at
 ../../gcc/cgraphunit.c:2187
 #16 0x00778bcd in symbol_table::finalize_compilation_unit
 (this=0x76c3a000) at ../../gcc/cgraphunit.c:2340
 #17 0x006580ee in c_write_global_declarations () at
 ../../gcc/c/c-decl.c:10777
 #18 0x00b5bb8b in compile_file () at ../../gcc/toplev.c:584
 #19 0x00b5def1 in do_compile () at ../../gcc/toplev.c:2041
 #20 0x00b5e0fa in toplev::main (this=0x7fffdc9f, argc=20,
 argv=0x7fffdd98) at ../../gcc/toplev.c:2138
 #21 0x0063f1d9 in main (argc=20, argv=0x7fffdd98) 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






Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()

2014-12-10 Thread Martin Liška

On 12/10/2014 02:26 PM, Richard Biener wrote:

On Tue, Dec 9, 2014 at 4:52 PM, Martin Liška mli...@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 mli...@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 mli...@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=0x7fffd550, pnew_seq=0x7fffd528) at
../../gcc/gimple-iterator.c:429
#1  0x00b95a2a in gimple_split_block (bb=0x76c41548,
stmt=0x0)
at ../../gcc/tree-cfg.c:5707
#2  0x007563cf in split_block (bb=0x76c41548, i=i@entry=0x0)
at
../../gcc/cfghooks.c:508
#3  0x00756b44 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  0x0076085a in create_preheader (loop=0x76d56948,
flags=optimized out) at ../../gcc/cfgloopmanip.c:1563
#6  0x00760aea in create_preheaders (flags=1) at
../../gcc/cfgloopmanip.c:1613
#7  0x009bc6b0 in apply_loop_flags (flags=15) at
../../gcc/loop-init.c:75
#8  0x009bc7d3 in loop_optimizer_init (flags=15) at
../../gcc/loop-init.c:136
#9  0x00957914 in estimate_function_body_sizes
(node=0x76c47620,
early=false) at ../../gcc/ipa-inline-analysis.c:2480
#10 0x0095948b in compute_inline_parameters (node=0x76c47620,
early=false) at ../../gcc/ipa-inline-analysis.c:2907
#11 0x0095bd88 in inline_analyze_function (node=0x76c47620)
at
../../gcc/ipa-inline-analysis.c:3994
#12 0x0095bed3 in inline_generate_summary () at
../../gcc/ipa-inline-analysis.c:4045
#13 0x00a70b71 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 0x00777a15 in ipa_passes () at ../../gcc/cgraphunit.c:2074
#15 symbol_table::compile (this=this@entry=0x76c3a000) at
../../gcc/cgraphunit.c:2187
#16 0x00778bcd in symbol_table::finalize_compilation_unit
(this=0x76c3a000) at ../../gcc/cgraphunit.c:2340
#17 0x006580ee in c_write_global_declarations () at
../../gcc/c/c-decl.c:10777
#18 0x00b5bb8b in compile_file () at ../../gcc/toplev.c:584
#19 0x00b5def1 in do_compile () at ../../gcc/toplev.c:2041
#20 0x00b5e0fa in toplev::main (this=0x7fffdc9f, argc=20,
argv=0x7fffdd98) at ../../gcc/toplev.c:2138
#21 0x0063f1d9 in main (argc=20, argv=0x7fffdd98) 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










Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()

2014-12-09 Thread Martin Liška

On 11/21/2014 01:23 PM, Richard Biener wrote:

On Fri, Nov 21, 2014 at 12:52 PM, Martin Liška mli...@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 mli...@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=0x7fffd550, pnew_seq=0x7fffd528) at
../../gcc/gimple-iterator.c:429
#1  0x00b95a2a in gimple_split_block (bb=0x76c41548, stmt=0x0)
at ../../gcc/tree-cfg.c:5707
#2  0x007563cf in split_block (bb=0x76c41548, i=i@entry=0x0) at
../../gcc/cfghooks.c:508
#3  0x00756b44 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  0x0076085a in create_preheader (loop=0x76d56948,
flags=optimized out) at ../../gcc/cfgloopmanip.c:1563
#6  0x00760aea in create_preheaders (flags=1) at
../../gcc/cfgloopmanip.c:1613
#7  0x009bc6b0 in apply_loop_flags (flags=15) at
../../gcc/loop-init.c:75
#8  0x009bc7d3 in loop_optimizer_init (flags=15) at
../../gcc/loop-init.c:136
#9  0x00957914 in estimate_function_body_sizes (node=0x76c47620,
early=false) at ../../gcc/ipa-inline-analysis.c:2480
#10 0x0095948b in compute_inline_parameters (node=0x76c47620,
early=false) at ../../gcc/ipa-inline-analysis.c:2907
#11 0x0095bd88 in inline_analyze_function (node=0x76c47620) at
../../gcc/ipa-inline-analysis.c:3994
#12 0x0095bed3 in inline_generate_summary () at
../../gcc/ipa-inline-analysis.c:4045
#13 0x00a70b71 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 0x00777a15 in ipa_passes () at ../../gcc/cgraphunit.c:2074
#15 symbol_table::compile (this=this@entry=0x76c3a000) at
../../gcc/cgraphunit.c:2187
#16 0x00778bcd in symbol_table::finalize_compilation_unit
(this=0x76c3a000) at ../../gcc/cgraphunit.c:2340
#17 0x006580ee in c_write_global_declarations () at
../../gcc/c/c-decl.c:10777
#18 0x00b5bb8b in compile_file () at ../../gcc/toplev.c:584
#19 0x00b5def1 in do_compile () at ../../gcc/toplev.c:2041
#20 0x00b5e0fa in toplev::main (this=0x7fffdc9f, argc=20,
argv=0x7fffdd98) at ../../gcc/toplev.c:2138
#21 0x0063f1d9 in main (argc=20, argv=0x7fffdd98) 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







Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()

2014-11-21 Thread Martin Liška

On 11/20/2014 05:41 PM, Richard Biener wrote:

On Thu, Nov 20, 2014 at 5:30 PM, Martin Liška mli...@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=0x7fffd550, pnew_seq=0x7fffd528) at 
../../gcc/gimple-iterator.c:429
#1  0x00b95a2a in gimple_split_block (bb=0x76c41548, 
stmt=0x0) at ../../gcc/tree-cfg.c:5707
#2  0x007563cf in split_block (bb=0x76c41548, i=i@entry=0x0) 
at ../../gcc/cfghooks.c:508
#3  0x00756b44 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  0x0076085a in create_preheader (loop=0x76d56948, 
flags=optimized out) at ../../gcc/cfgloopmanip.c:1563
#6  0x00760aea in create_preheaders (flags=1) at 
../../gcc/cfgloopmanip.c:1613
#7  0x009bc6b0 in apply_loop_flags (flags=15) at 
../../gcc/loop-init.c:75
#8  0x009bc7d3 in loop_optimizer_init (flags=15) at 
../../gcc/loop-init.c:136
#9  0x00957914 in estimate_function_body_sizes 
(node=0x76c47620, early=false) at ../../gcc/ipa-inline-analysis.c:2480
#10 0x0095948b in compute_inline_parameters 
(node=0x76c47620, early=false) at ../../gcc/ipa-inline-analysis.c:2907
#11 0x0095bd88 in inline_analyze_function (node=0x76c47620) 
at ../../gcc/ipa-inline-analysis.c:3994
#12 0x0095bed3 in inline_generate_summary () at 
../../gcc/ipa-inline-analysis.c:4045
#13 0x00a70b71 in execute_ipa_summary_passes 
(ipa_pass=0x1dcb9e0) at ../../gcc/passes.c:2137

#14 0x00777a15 in ipa_passes () at ../../gcc/cgraphunit.c:2074
#15 symbol_table::compile (this=this@entry=0x76c3a000) at 
../../gcc/cgraphunit.c:2187
#16 0x00778bcd in symbol_table::finalize_compilation_unit 
(this=0x76c3a000) at ../../gcc/cgraphunit.c:2340
#17 0x006580ee in c_write_global_declarations () at 
../../gcc/c/c-decl.c:10777

#18 0x00b5bb8b in compile_file () at ../../gcc/toplev.c:584
#19 0x00b5def1 in do_compile () at ../../gcc/toplev.c:2041
#20 0x00b5e0fa in toplev::main (this=0x7fffdc9f, argc=20, 
argv=0x7fffdd98) at ../../gcc/toplev.c:2138
#21 0x0063f1d9 in main (argc=20, argv=0x7fffdd98) 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 mli...@suse.cz
Date: Thu, 20 Nov 2014 16:28:54 +0100
Subject: [PATCH] Fix and new test.

gcc/ChangeLog:

2014-11-21  Martin Liska  mli...@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  mli...@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)
 

Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()

2014-11-21 Thread Richard Biener
On Fri, Nov 21, 2014 at 12:52 PM, Martin Liška mli...@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 mli...@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=0x7fffd550, pnew_seq=0x7fffd528) at
 ../../gcc/gimple-iterator.c:429
 #1  0x00b95a2a in gimple_split_block (bb=0x76c41548, stmt=0x0)
 at ../../gcc/tree-cfg.c:5707
 #2  0x007563cf in split_block (bb=0x76c41548, i=i@entry=0x0) at
 ../../gcc/cfghooks.c:508
 #3  0x00756b44 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  0x0076085a in create_preheader (loop=0x76d56948,
 flags=optimized out) at ../../gcc/cfgloopmanip.c:1563
 #6  0x00760aea in create_preheaders (flags=1) at
 ../../gcc/cfgloopmanip.c:1613
 #7  0x009bc6b0 in apply_loop_flags (flags=15) at
 ../../gcc/loop-init.c:75
 #8  0x009bc7d3 in loop_optimizer_init (flags=15) at
 ../../gcc/loop-init.c:136
 #9  0x00957914 in estimate_function_body_sizes (node=0x76c47620,
 early=false) at ../../gcc/ipa-inline-analysis.c:2480
 #10 0x0095948b in compute_inline_parameters (node=0x76c47620,
 early=false) at ../../gcc/ipa-inline-analysis.c:2907
 #11 0x0095bd88 in inline_analyze_function (node=0x76c47620) at
 ../../gcc/ipa-inline-analysis.c:3994
 #12 0x0095bed3 in inline_generate_summary () at
 ../../gcc/ipa-inline-analysis.c:4045
 #13 0x00a70b71 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 0x00777a15 in ipa_passes () at ../../gcc/cgraphunit.c:2074
 #15 symbol_table::compile (this=this@entry=0x76c3a000) at
 ../../gcc/cgraphunit.c:2187
 #16 0x00778bcd in symbol_table::finalize_compilation_unit
 (this=0x76c3a000) at ../../gcc/cgraphunit.c:2340
 #17 0x006580ee in c_write_global_declarations () at
 ../../gcc/c/c-decl.c:10777
 #18 0x00b5bb8b in compile_file () at ../../gcc/toplev.c:584
 #19 0x00b5def1 in do_compile () at ../../gcc/toplev.c:2041
 #20 0x00b5e0fa in toplev::main (this=0x7fffdc9f, argc=20,
 argv=0x7fffdd98) at ../../gcc/toplev.c:2138
 #21 0x0063f1d9 in main (argc=20, argv=0x7fffdd98) 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




[PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()

2014-11-20 Thread Martin Liška

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.

Patch can bootstrap on x86_64-linux-pc and no regression has been seen.
Ready for trunk?

Thanks,
Martin
gcc/ChangeLog:

2014-11-20  Martin Liska  mli...@suse.cz

* gimple-iterator.h (gsi_nondebug_stmt_count): New function.
* ipa-icf-gimple.c (func_checker::compare_bb): Number of BB
is recomputed because it can be split.

gcc/testsuite/ChangeLog:

2014-11-20  Martin Liska  mli...@suse.cz

* gcc.dg/ipa/pr63909.c: New test.
diff --git a/gcc/gimple-iterator.h b/gcc/gimple-iterator.h
index fb6cc07..f73b1f6 100644
--- a/gcc/gimple-iterator.h
+++ b/gcc/gimple-iterator.h
@@ -331,4 +331,18 @@ gsi_seq (gimple_stmt_iterator i)
   return *i.seq;
 }
 
+/* Return number of nondebug statements in basic block BB.  */
+
+static inline unsigned
+gsi_nondebug_stmt_count (basic_block bb)
+{
+  unsigned c = 0;
+  for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
+   gsi_next (gsi))
+if (!is_gimple_debug (gsi_stmt (gsi)))
+  c++;
+
+  return c;
+}
+
 #endif /* GCC_GIMPLE_ITERATOR_H */
diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
index 8f2a438..83661ac 100644
--- a/gcc/ipa-icf-gimple.c
+++ b/gcc/ipa-icf-gimple.c
@@ -563,6 +563,9 @@ func_checker::compare_bb (sem_bb *bb1, sem_bb *bb2)
   gimple_stmt_iterator gsi1, gsi2;
   gimple s1, s2;
 
+  bb1-nondbg_stmt_count = gsi_nondebug_stmt_count (bb1-bb);
+  bb2-nondbg_stmt_count = gsi_nondebug_stmt_count (bb2-bb);
+
   if (bb1-nondbg_stmt_count != bb2-nondbg_stmt_count
   || bb1-edge_count != bb2-edge_count)
 return return_false ();
diff --git a/gcc/testsuite/gcc.dg/ipa/pr63909.c b/gcc/testsuite/gcc.dg/ipa/pr63909.c
new file mode 100644
index 000..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;
+}


Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()

2014-11-20 Thread Richard Biener
On Thu, Nov 20, 2014 at 5:30 PM, Martin Liška mli...@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.

As IPA split is run early I don't see how it should affect a real IPA
pass though?

Thanks,
Richard.

 Patch can bootstrap on x86_64-linux-pc and no regression has been seen.
 Ready for trunk?

 Thanks,
 Martin