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