This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/33572] [4.3 Regression] wrong code with -O
- From: "rguenth at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 28 Sep 2007 12:28:09 -0000
- Subject: [Bug tree-optimization/33572] [4.3 Regression] wrong code with -O
- References: <bug-33572-8535@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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