[Bug c++/70267] ICE on valid code at -O1 and above on x86_64-linux-gnu in propagate_necessity, at tree-ssa-dce.c:924

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Mar 17 09:39:00 GMT 2016


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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|tree-optimization           |c++

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
(gdb) p debug_gimple_stmt (stmt)
# VUSE <.MEM_3>
f.0_4 = (struct Foo *) D.2296;

is not valid gimple (but we fail to diagnose this).  It converts

 <var_decl 0x7ffff7fefea0 D.2296
    type <record_type 0x7ffff69dfb28 Foo type_3 type_5 type_6 QI
        size <integer_cst 0x7ffff6887f48 constant 8>
        unit size <integer_cst 0x7ffff6887f60 constant 1>
        align 8 symtab 0 alias set -1 canonical type 0x7ffff69dfb28
        fields <var_decl 0x7ffff7fefc60 class$ type <record_type 0x7ffff69df7e0
Class>
            public static external nonlocal decl_3 decl_5 decl_6 VOID file t.C
line 24 col 34
            align 8 context <record_type 0x7ffff69dfb28 Foo>
            chain <type_decl 0x7ffff69e0d10 Foo>> context <namespace_decl
0x7ffff69e0428 lang>
        full-name "class java::lang::Foo"
        X() n_parents=1 use_template=0 interface-unknown
        pointer_to_this <pointer_type 0x7ffff69f37e0> chain <type_decl
0x7ffff69e0a18 Foo>>
    ignored QI file t.C line 33 col 29 size <integer_cst 0x7ffff6887f48 8> unit
size <integer_cst 0x7ffff6887f60 1>
    align 8 context <function_decl 0x7ffff69e2ee0 Bar4> chain <var_decl
0x7ffff69f9090 f.0>>

to (struct Foo *).

  (void) (f = (struct Foo *) TARGET_EXPR <D.2296, _Jv_AllocObject
(&_ZN4java4lang3Foo6class$E)>)

maybe a ADDR_EXPR is missing around the TARGET_EXPR?

Frontend issue.  At -O0 we end up with

  <bb 2>:
  _Jv_AllocObject (&_ZN4java4lang3Foo6class$E);
  f.0_4 = (struct Foo *) D.2296;
  f = f.0_4;
  f.1_6 = f;
  _Jv_Throw (f.1_6);

which obviously is bullshit.


More information about the Gcc-bugs mailing list