https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87906

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org
     Ever confirmed|0                           |1

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ah, so the assert is somewhat bogus if it triggers:

12324         gcc_checking_assert ((DECL_P (origin)
12325                               && DECL_ORIGIN (origin) == origin)
12326                              || BLOCK_ORIGIN (origin) == origin);

when it's a DECL_P but DECL_ORIGIN is wrecked then we access a DECL as BLOCK.

(gdb) p origin
$3 = <function_decl 0x7ffff6a74f00 __dt_base >
(gdb) p origin->decl_common.abstract_origin 
$4 = <function_decl 0x7ffff6a74e00 __dt >

what this means is that when we do tree/decl merging we end up merging
sth with DECL_ORIGIN (x) == x to a prevailing node which does not
honor this property.  This makes

      BLOCK_ABSTRACT_ORIGIN (id->block) = DECL_ORIGIN (fn);

as set by the inliner not the ultimate origin and thus we ICE.

Indeed.

(gdb) commands 8
Type commands for breakpoint(s) 8, one per line.
End with a line saying just "end".
>p decl->decl_common.abstract_origin
>p prevailing->decl_common.abstract_origin
>end

Breakpoint 8, lto_symtab_prevail_decl (
    prevailing=<function_decl 0x7ffff6a74c00 __dt_base >, 
    decl=<function_decl 0x7ffff667a600 __dt_base >)
    at /space/rguenther/src/gcc-slpcost/gcc/lto/lto-symtab.h:34
34        gcc_checking_assert (! DECL_LANG_FLAG_0 (decl));
$3 = <tree 0x0>
$4 = <function_decl 0x7ffff6a74b00 __dt >

And that probably happens because of the ODR violation.

Reply via email to