On Wed, May 18, 2011 at 7:20 PM, Jan Hubicka <hubi...@ucw.cz> wrote:
>>
>> We can end up with an infinite recursion as gimple_register_type
>> tries to register TYPE_MAIN_VARIANT first.  This is because we
>> are being called from the LTO type-fixup code which walks the
>> type graph and adjusts types to their leaders.  So we can
>> be called for type SCCs that are only partially fixed up yet
>> which means TYPE_MAIN_VARIANT might temporarily not honor
>> the invariant that the main variant of a main variant is itself.
>> Thus, simply avoid recursing more than once - we are sure that
>> we will be reaching at most type duplicates in further recursion.
>>
>> Bootstrap & regtest pending on x86_64-unknown-linux-gnu.
>
> With this funcion WPA stage passes with some improvements I repported to 
> mozilla metabug.
>
> We now get ICE in ltrans:
> #0  gimple_register_type (t=0x0) at ../../gcc/gimple.c:4616
> #1  0x00000000005a0fc9 in gimple_register_canonical_type (t=0x7fffe851f498) 
> at ../../gcc/gimple.c:4890
> #2  0x000000000048f14d in lto_ft_type (t=0x7fffe851f498) at 
> ../../gcc/lto/lto.c:401
> #3  lto_fixup_types (t=0x7fffe851f498) at ../../gcc/lto/lto.c:581
> #4  0x000000000048f4a0 in uniquify_nodes (node=Unhandled dwarf expression 
> opcode 0xf3
>
> TYPE_MAIN_VARIANT is NULL.
> (gdb) up
> #1  0x00000000005a0fc9 in gimple_register_canonical_type (t=0x7fffe851f498) 
> at ../../gcc/gimple.c:4890
> 4890      t = gimple_register_type (TYPE_MAIN_VARIANT (t));
> (gdb) p debug_generic_stmt (t)
> struct _ffi_type
>
> $1 = void
> (gdb) p debug_tree (t)
>  <record_type 0x7fffe851f498 _ffi_type BLK
>    size <integer_cst 0x7ffff7ecf680 type <integer_type 0x7ffff7eca0a8 
> bit_size_type> constant 192>
>    unit size <integer_cst 0x7ffff7ecf640 type <integer_type 0x7ffff7eca000> 
> constant 24>
>    align 64 symtab 0 alias set -1 structural equality
>    fields <field_decl 0x7fffe87684c0 size
>        type <integer_type 0x7ffff7eca690 long unsigned int public unsigned DI
>            size <integer_cst 0x7ffff7ecf1e0 constant 64>
>            unit size <integer_cst 0x7ffff7ecf200 constant 8>
>            align 64 symtab 0 alias set -1 canonical type 0x7ffff7eca690 
> precision 64 min <integer_cst 0x7ffff7ecf220 0> max <integer_cst 
> 0x7ffff7ecf1c0 18446744073709551615>
>            pointer_to_this <pointer_type 0x7ffff5336150> reference_to_this 
> <reference_type 0x7ffff0aba000>>
>        used unsigned nonlocal DI file ctypes/libffi/include/ffi.h line 109 
> col 0 size <integer_cst 0x7ffff7ecf1e0 64> unit size <integer_cst 
> 0x7ffff7ecf200 8>
>        align 64 offset_align 128
>        offset <integer_cst 0x7ffff7ebaf00 constant 0>
>        bit offset <integer_cst 0x7ffff7ecf420 constant 0> context 
> <record_type 0x7fffe851f2a0 _ffi_type>
>        chain <field_decl 0x7fffe8768558 alignment type <integer_type 
> 0x7ffff7eca3f0 short unsigned int>
>            used unsigned nonlocal HI file ctypes/libffi/include/ffi.h line 
> 110 col 0
>            size <integer_cst 0x7ffff7ecf080 constant 16>
>            unit size <integer_cst 0x7ffff7ecf0a0 constant 2>
>            align 16 offset_align 128 offset <integer_cst 0x7ffff7ebaf00 0> 
> bit offset <integer_cst 0x7ffff7ecf1e0 64> context <record_type 
> 0x7fffe851f2a0 _ffi_type> chain <field_decl 0x7fffe87685f0 type>>>
>    chain <type_decl 0x7fffe8966ac8 _ffi_type>>
> $2 = void
>
> Let me know if there is anything easy I could work out ;)
> I think the bug may be in the recursion guard.  When you have cycle of length
> greater than 2 of MVs, you won't walk them all.

That doesn't matter.  MVs are acyclic initially (in fact the chain has
length 1), only during
fixup we can temporarily create larger chains or cycles.  MVs also
never are NULL, so it
would be interesting to see what clears it ...

Richard.

> Honza
>

Reply via email to