* [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()
@ 2014-11-20 16:41 Martin Liška
2014-11-20 16:43 ` Richard Biener
0 siblings, 1 reply; 7+ messages in thread
From: Martin Liška @ 2014-11-20 16:41 UTC (permalink / raw)
To: GCC Patches, zsojka
[-- Attachment #1: Type: text/plain, Size: 282 bytes --]
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
[-- Attachment #2: PR63909.changelog --]
[-- Type: text/plain, Size: 329 bytes --]
gcc/ChangeLog:
2014-11-20 Martin Liska <mliska@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 <mliska@suse.cz>
* gcc.dg/ipa/pr63909.c: New test.
[-- Attachment #3: PR63909.patch --]
[-- Type: text/x-patch, Size: 1619 bytes --]
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 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;
+}
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()
2014-11-20 16:41 [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb() Martin Liška
@ 2014-11-20 16:43 ` Richard Biener
2014-11-21 12:11 ` Martin Liška
0 siblings, 1 reply; 7+ messages in thread
From: Richard Biener @ 2014-11-20 16:43 UTC (permalink / raw)
To: Martin Liška; +Cc: GCC Patches, zsojka
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.
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
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()
2014-11-20 16:43 ` Richard Biener
@ 2014-11-21 12:11 ` Martin Liška
2014-11-21 12:31 ` Richard Biener
0 siblings, 1 reply; 7+ messages in thread
From: Martin Liška @ 2014-11-21 12:11 UTC (permalink / raw)
To: Richard Biener; +Cc: GCC Patches, zsojka
[-- Attachment #1: Type: text/plain, Size: 3354 bytes --]
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 ../../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
[-- Attachment #2: 0001-Fix-and-new-test.patch --]
[-- Type: text/x-patch, Size: 3343 bytes --]
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
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()
2014-11-21 12:11 ` Martin Liška
@ 2014-11-21 12:31 ` Richard Biener
2014-12-09 15:52 ` Martin Liška
0 siblings, 1 reply; 7+ messages in thread
From: Richard Biener @ 2014-11-21 12:31 UTC (permalink / raw)
To: Martin Liška, Jan Hubicka; +Cc: GCC Patches, zsojka
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
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()
2014-11-21 12:31 ` Richard Biener
@ 2014-12-09 15:52 ` Martin Liška
2014-12-10 13:26 ` Richard Biener
0 siblings, 1 reply; 7+ messages in thread
From: Martin Liška @ 2014-12-09 15:52 UTC (permalink / raw)
To: gcc-patches
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
>>
>>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()
2014-12-09 15:52 ` Martin Liška
@ 2014-12-10 13:26 ` Richard Biener
2014-12-10 13:57 ` Martin Liška
0 siblings, 1 reply; 7+ messages in thread
From: Richard Biener @ 2014-12-10 13:26 UTC (permalink / raw)
To: Martin Liška; +Cc: GCC Patches
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
>>>
>>>
>>>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb()
2014-12-10 13:26 ` Richard Biener
@ 2014-12-10 13:57 ` Martin Liška
0 siblings, 0 replies; 7+ messages in thread
From: Martin Liška @ 2014-12-10 13:57 UTC (permalink / raw)
To: gcc-patches
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
>>>>
>>>>
>>>>
>>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-12-10 13:57 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-20 16:41 [PATCH] PR ipa/63909 ICE: SIGSEGV in ipa_icf_gimple::func_checker::compare_bb() Martin Liška
2014-11-20 16:43 ` Richard Biener
2014-11-21 12:11 ` Martin Liška
2014-11-21 12:31 ` Richard Biener
2014-12-09 15:52 ` Martin Liška
2014-12-10 13:26 ` Richard Biener
2014-12-10 13:57 ` Martin Liška
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).