> 
> 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.

Honza

Reply via email to