This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug tree-optimization/27638] Strange initialization of uninitialized structure part



------- Comment #1 from rguenth at gcc dot gnu dot org  2006-05-17 08:35 -------
SRA decomposes structure assignment <retval> = ret

strc_test (i)
{
  struct ret_struct ret;

<bb 2>:
  ret.long_buf[0] = i_1;
  ret.long_buf[1] = 2;
  ret.long_buf[2] = 3;
  ret.long_buf[3] = 4;
  ret.long_buf[4] = 5;
  ret.long_buf[5] = 6;
  <retval> = ret;
  return <retval>;

}

to element-wise copy, which introduces use of uninitialized parts.

strc_test (i)
{ 
  int ret$long_buf$9;
  int ret$long_buf$8;
  int ret$long_buf$7;
  int ret$long_buf$6;
  int ret$long_buf$0;
  int ret$long_buf$1;
  int ret$long_buf$2;
  int ret$long_buf$3;
  int ret$long_buf$4;
  int ret$long_buf$5;
  struct ret_struct ret;

<bb 2>:
  ret$long_buf$0_11 = i_1;
  ret$long_buf$1_12 = 2;
  ret$long_buf$2_13 = 3;
  ret$long_buf$3_14 = 4;
  ret$long_buf$4_15 = 5;
  ret$long_buf$5_16 = 6;
  <retval>.long_buf[9] = ret$long_buf$9_17;
  <retval>.long_buf[8] = ret$long_buf$8_19;
  <retval>.long_buf[7] = ret$long_buf$7_21;
  <retval>.long_buf[6] = ret$long_buf$6_23;
  <retval>.long_buf[5] = ret$long_buf$5_16;
  <retval>.long_buf[4] = ret$long_buf$4_15;
  <retval>.long_buf[3] = ret$long_buf$3_14;
  <retval>.long_buf[2] = ret$long_buf$2_13;
  <retval>.long_buf[1] = ret$long_buf$1_12;
  <retval>.long_buf[0] = ret$long_buf$0_11;
  return <retval>;

}

the array long_buf of <retval> is too large that it is not decomposed by
aliasing and so DCE cannot remove the stores from uninitialized values:

<bb 2>:
  #   <retval>_18 = V_MAY_DEF <<retval>_9>;
  <retval>.long_buf[9] = ret$long_buf$9_17;
  #   <retval>_20 = V_MAY_DEF <<retval>_18>;
  <retval>.long_buf[8] = ret$long_buf$8_19;
  #   <retval>_22 = V_MAY_DEF <<retval>_20>;
  <retval>.long_buf[7] = ret$long_buf$7_21;
  #   <retval>_24 = V_MAY_DEF <<retval>_22>;
  <retval>.long_buf[6] = ret$long_buf$6_23;
  #   <retval>_25 = V_MAY_DEF <<retval>_24>;
  <retval>.long_buf[5] = 6;
...

SRA should avoid to emit copies of uninitialized parts, as it seems to
instantiate the sources only at SRA structure copy time:

Initial instantiation for ret
  ret.long_buf[5] -> ret$long_buf$5
  ret.long_buf[4] -> ret$long_buf$4
  ret.long_buf[3] -> ret$long_buf$3
  ret.long_buf[2] -> ret$long_buf$2
  ret.long_buf[1] -> ret$long_buf$1
  ret.long_buf[0] -> ret$long_buf$0
Using element-copy for ret
  ret.long_buf[6] -> ret$long_buf$6
  ret.long_buf[7] -> ret$long_buf$7
  ret.long_buf[8] -> ret$long_buf$8
  ret.long_buf[9] -> ret$long_buf$9


-- 

rguenth at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|0                           |1
           Keywords|                            |missed-optimization
   Last reconfirmed|0000-00-00 00:00:00         |2006-05-17 08:35:02
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27638


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]