This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Optimize lto location stremaing


> On Sun, Mar 29, 2015 at 07:47:18AM +0200, Jan Hubicka wrote:
> > Hi,
> > I actually got idea how to make partitioning safe for named labels w/o going the difficult
> > route of makeing them part of symbol table.  Will look into that tonight or tomorrow.
> > > Also there's a juicy ICE with that worked around:
> > > 
> > > /home/andi/lsrc/linux/drivers/scsi/bfa/bfa_ioc.c: In function 'bfa_ioc_download_fw.constprop':
> > > /home/andi/lsrc/linux/drivers/scsi/bfa/bfa_ioc.c:1871:0: internal compiler error: Segmentation fault
> > >  bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type,
> > >  ^
> > > 0x9753a7 crash_signal
> > >         ../../gcc/gcc/toplev.c:383
> > > 0x76d7f2 maybe_remove_unused_call_args(function*, gimple_statement_base*)
> > >         ../../gcc/gcc/gimple.c:2963
> > > 0x677bde cgraph_edge::redirect_call_stmt_to_callee()
> > >         ../../gcc/gcc/cgraph.c:1478
> > > 0xedac5c inline_transform(cgraph_node*)
> > >         ../../gcc/gcc/ipa-inline-transform.c:533
> > 
> > This one looks odd though. Can you possibly looks for reason of the segfault? I suppose
> > one of the pointers is NULL but don't quite see which one.
> > Is the call statemnt indirect? (try debug_gimple_stmt (stmt) and debug_tree (decl))
> 
> I only have a core dump. It is hard to catch LTO processes in a debugger.

Well, for small testcases easy way is to use --save-temps --verbose
and then restart the failing lto1 invocation with gdb --args

For long compilations one can also use gdb's attach but then all the stderr is going
into the buffer (I hope we will eventually fix that - now it is not only anoying
but it also makes warnings to come out without highlighting)
> 
> stmt seems to be an error node:
> 
> $3 = {code = GIMPLE_ERROR_MARK, no_warning = 0, visited = 0, nontemporal_move = 0, plf = 0, 
>   modified = 0, has_volatile_ops = 0, pad = 0, subcode = 0, uid = 0, location = 2389971584, 
>   num_ops = 11155, bb = 0x2b92fed33c30, next = 0x2b92fed36cb8, prev = 0x2b92fed36d10}

Hmm, this indeed looks bogus.  My guess is that the statement is removed?
If you run it in gdb, you can probably easy watchpoint to see who drops it to GIMPLE_ERROR_MARK.
I believe it is just a conicidence it is error mark, because it is gimple code 0.
> 
> decl appears NULL, not surprising for an error node:
> 
> (gdb) p *(tree *)$rbx
> $6 = (tree) 0x0
> 
> 
> Also the compiler thinks the code is unreachable:
> 
>    0x000000000076d7e2 <+114>:   nopw   0x0(%rax,%rax,1)
>    0x000000000076d7e8 <+120>:   mov    0x18(%rbx),%rax
>    0x000000000076d7ec <+124>:   cmpw   $0x7d,(%rax)	<--- I think that's the check for void_type_node
>    0x000000000076d7f0 <+128>:   je     0x76d830 <maybe_remove_unused_call_args(function*, gimple_statement_base*)+192>
> => 0x000000000076d7f2 <+130>:   mov    0x8,%rax        <------- segfault on this
>    0x000000000076d7fa <+138>:   ud2    
> 
> There was no earlier error printed though:

Hmm, it should not...
> (BTW it would be good to clean up the variable names in redirect_call_stmt_to_callee,
> there are two shadowing definitions of "new_stmt")
> 
> p *e->call_stmt
> $9 = {<gimple_statement_with_memory_ops_base> = {<gimple_statement_with_ops_base> = {<gimple_statement_base> = {code = GIMPLE_ERROR_MARK, no_warning = 0, visited = 0, nontemporal_move = 0, 
>         plf = 0, modified = 0, has_volatile_ops = 0, pad = 0, subcode = 0, uid = 0, 
>         location = 2389971584, num_ops = 11155, bb = 0x2b92fed33c30, next = 0x2b92fed36cb8, 
>         prev = 0x2b92fed36d10}, use_ops = 0x0}, vdef = 0x0, vuse = 0x0}, call_used = {
>     anything = 0, nonlocal = 0, escaped = 0, ipa_escaped = 0, null = 0, 
>     vars_contains_nonlocal = 1, vars_contains_escaped = 1, vars_contains_escaped_heap = 1, 
>     vars = 0x2b935340f690}, call_clobbered = {anything = 0, nonlocal = 1, escaped = 1, 
>     ipa_escaped = 0, null = 0, vars_contains_nonlocal = 0, vars_contains_escaped = 0, 
>     vars_contains_escaped_heap = 0, vars = 0x280013bba}, u = {fntype = 0x2b92fed33d68, 
>     internal_fn = 4275256680}, op = {0x2b92fed3a1b8}}
> 
> Wasn't able to find out how the error mark got into the cgraph without an error.

Yep, it looks like someone frogto to update call edge after replacing the statement....
Putting the watchpoint will probably let us know who.

Honza


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]