------- 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

Reply via email to