A simple testcase: void foo (void * DAG_temp117584) { char uA; void* pA; void* pB; void* pC; do { int DAG_temp117585; int DAG_temp117586; void ** __indir_union1 = (void**)DAG_temp117584; DAG_temp117585 = *__indir_union1; DAG_temp117586 = DAG_temp117585; if ( DAG_temp117586 != (int)268435456 ) pA = (void*)&uA; pB = (void*)&pA; pC = pB; union __block_indir0_u { struct { int val; } __indir_struct; } * __indir_union = (union __block_indir0_u*)pC; f(__indir_union->__indir_struct.val);
DAG_temp117584 += 64; } while (1); } ---- CUT --- Compile at -O1, we get the following ICE: gcc/gcc/testsuite/gcc.c-torture/compile/20090206-2.c:19: internal compiler error: in expand_expr_addr_expr_1, at expr.c:6817 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions. If we compile with -O2, we get: gcc/gcc/testsuite/gcc.c-torture/compile/20090206-2.c:1: internal compiler error: in verify_expr, at tree-cfg.c:2876 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions. forwprop1 produces: D.1591_10 = VIEW_CONVERT_EXPR<union __block_indir0_u>(pA).__indir_struct.val; CCP2 produces: D.1591_10 = VIEW_CONVERT_EXPR<union __block_indir0_u>(&uA).__indir_struct.val; And then somewhere we must lose that the address of uA is taken because with -O2 PRE creates: uA.18_15 = uA_11(D); D.2674_1 = uA.18_15; D.2676_8 = D.2674_1; D.2675_7 = &D.2676_8; pretmp.19_13 = VIEW_CONVERT_EXPR<union __block_indir0_u>(D.2675_7).__indir_struct.val; Which is just incorrect. -- Summary: [4.5 Regression] ICE with some code that produces VCE Product: gcc Version: 4.5.0 Status: UNCONFIRMED Keywords: ice-on-valid-code Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: pinskia at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39829