This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/27638] Strange initialization of uninitialized structure part
- 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: 17 May 2006 08:35:02 -0000
- Subject: [Bug tree-optimization/27638] Strange initialization of uninitialized structure part
- References: <bug-27638-1649@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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