------- Comment #7 from rguenth at gcc dot gnu dot org 2007-09-28 12:28 ------- After inlining deallocate into main we end up with:
int main(int, char**) (argc, D.2111) { static struct __pool pool; static struct __pool pool; int * p; struct Foo * foo$ptr; struct Foo * D.2185; struct Foo * D.2182; int save_filt.2; void * save_eptr.1; struct vector v; int (*__vtbl_ptr_type) (void) D.2148; int (*__vtbl_ptr_type) (void) * D.2147; void * D.2145; struct Foo * D.2124; <bb 2>: foo$ptr_18(ab) = 0B; if (argc_1(D) != 0) goto <bb 3>; else goto <bb 5>; <bb 3>: D.2145_2 = operator new (8); <bb 4>: D.2124_3 = (struct Foo *) D.2145_2; D.2124_3->_vptr.Foo ={v} &_ZTV3Foo[2]; goto <bb 10>; <bb 5>: <bb 6>: if (0) goto <bb 7>; else goto <bb 8>; <bb 7>: _M_reclaim_block (&pool, 0B, 0); <bb 8>: <bb 9>: <bb 10>: # foo$ptr_16 = PHI <foo$ptr_18(ab)(9), D.2124_3(4)> foo$ptr_19(ab) = 0B; D.2147_6 = foo$ptr_16->_vptr.Foo; D.2148_7 = *D.2147_6; OBJ_TYPE_REF(D.2148_7;foo$ptr_16->0) (foo$ptr_16); goto <bb 12>; # foo$ptr_17(ab) = PHI <foo$ptr_18(ab)(3), (7), foo$ptr_19(ab)(10)> <L3>:; save_filt.2_10 = <<<filter object>>>; save_eptr.1_11 = <<<exception object>>>; D.2182_13 = foo$ptr_17(ab); operator delete (D.2182_13); <<<exception object>>> = save_eptr.1_11; <<<filter object>>> = save_filt.2_10; resx 1; <bb 12>: D.2185_14 = foo$ptr_19(ab); operator delete (D.2185_14); return 0; } after cleanup_cfg it still looks sane: int main(int, char**) (argc, D.2111) { static struct __pool pool; static struct __pool pool; int * p; struct Foo * foo$ptr; struct Foo * D.2185; struct Foo * D.2182; int save_filt.2; void * save_eptr.1; struct vector v; int (*__vtbl_ptr_type) (void) D.2148; int (*__vtbl_ptr_type) (void) * D.2147; void * D.2145; struct Foo * D.2124; <bb 2>: foo$ptr_18(ab) = 0B; if (argc_1(D) != 0) goto <bb 3>; else goto <bb 5>; <bb 3>: D.2145_2 = operator new (8); <bb 4>: D.2124_3 = (struct Foo *) D.2145_2; D.2124_3->_vptr.Foo ={v} &_ZTV3Foo[2]; <bb 5>: # foo$ptr_16 = PHI <foo$ptr_18(ab)(2), D.2124_3(4)> foo$ptr_19(ab) = 0B; D.2147_6 = foo$ptr_16->_vptr.Foo; D.2148_7 = *D.2147_6; OBJ_TYPE_REF(D.2148_7;foo$ptr_16->0) (foo$ptr_16); goto <bb 7>; # foo$ptr_17(ab) = PHI <foo$ptr_18(ab)(3), foo$ptr_19(ab)(5)> <L3>:; save_filt.2_10 = <<<filter object>>>; save_eptr.1_11 = <<<exception object>>>; D.2182_13 = foo$ptr_17(ab); operator delete (D.2182_13); <<<exception object>>> = save_eptr.1_11; <<<filter object>>> = save_filt.2_10; resx 1; <bb 7>: D.2185_14 = foo$ptr_19(ab); operator delete (D.2185_14); return 0; } the update_ssa (2048) call makes a mess out of it: int main(int, char**) (argc, D.2111) { static struct __pool pool; static struct __pool pool; int * p; struct Foo * foo$ptr; struct Foo * D.2185; struct Foo * D.2182; int save_filt.2; void * save_eptr.1; struct vector v; int (*__vtbl_ptr_type) (void) D.2148; int (*__vtbl_ptr_type) (void) * D.2147; void * D.2145; struct Foo * D.2124; <bb 2>: foo$ptr_18(ab) = 0B; if (argc_1(D) != 0) goto <bb 3>; else goto <bb 5>; <bb 3>: D.2145_2 = operator new (8); <bb 4>: D.2124_3 = (struct Foo *) D.2145_2; D.2124_3->_vptr.Foo ={v} &_ZTV3Foo[2]; <bb 5>: # foo$ptr_16 = PHI <foo$ptr_18(ab)(2), D.2124_3(4)> foo$ptr_19(ab) = 0B; D.2147_6 = foo$ptr_19(ab)->_vptr.Foo; D.2148_7 = *D.2147_6; OBJ_TYPE_REF(D.2148_7;foo$ptr_19(ab)->0) (foo$ptr_19(ab)); goto <bb 7>; # foo$ptr_17(ab) = PHI <foo$ptr_18(ab)(3), foo$ptr_19(ab)(5)> <L3>:; save_filt.2_10 = <<<filter object>>>; save_eptr.1_11 = <<<exception object>>>; D.2182_13 = foo$ptr_17(ab); operator delete (D.2182_13); <<<exception object>>> = save_eptr.1_11; <<<filter object>>> = save_filt.2_10; resx 1; <bb 7>: D.2185_14 = foo$ptr_19(ab); operator delete (D.2185_14); return 0; } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33572