This testcase generates some kind of initalization of uninitialized part of the
structure:

--cut here--
struct ret_struct
{
  int long_buf[10];
};

struct ret_struct
strc_test (int i)
{
  struct ret_struct ret;
  ret.long_buf[0] = i;
  ret.long_buf[1] = 0x2;
  ret.long_buf[2] = 0x3;
  ret.long_buf[3] = 0x4;
  ret.long_buf[4] = 0x5;
  ret.long_buf[5] = 0x6;
  return ret;
}
--cut here--

gcc -O2 -fverbose-asm -fomit-frame-pointer:

--cut here--
strc_test:
        movl    4(%esp), %eax   # D.1563, D.1563
        movl    8(%esp), %edx   # i, i
        movl    %eax, 36(%eax)  # ret$long_buf$9, <result>.long_buf  << !!
        movl    %eax, 32(%eax)  # ret$long_buf$8, <result>.long_buf  << !!
        movl    %eax, 28(%eax)  # ret$long_buf$7, <result>.long_buf  << !!
        movl    %eax, 24(%eax)  # ret$long_buf$6, <result>.long_buf  << !!
        movl    $6, 20(%eax)    #, <result>.long_buf
        movl    $5, 16(%eax)    #, <result>.long_buf
        movl    $4, 12(%eax)    #, <result>.long_buf
        movl    $3, 8(%eax)     #, <result>.long_buf
        movl    $2, 4(%eax)     #, <result>.long_buf
        movl    %edx, (%eax)    # i, <result>.long_buf
        ret     $4      #
--cut here--

These extra variables can be seen in the _.optimized tree dump:

--cut here--
;; Function strc_test (strc_test)

Analyzing Edge Insertions.
strc_test (i)
{
  int ret$long_buf$9;
  int ret$long_buf$8;
  int ret$long_buf$7;
  int ret$long_buf$6;

<bb 2>:
  <retval>.long_buf[9] = ret$long_buf$9;
  <retval>.long_buf[8] = ret$long_buf$8;
  <retval>.long_buf[7] = ret$long_buf$7;
  <retval>.long_buf[6] = ret$long_buf$6;
  <retval>.long_buf[5] = 6;
  <retval>.long_buf[4] = 5;
  <retval>.long_buf[3] = 4;
  <retval>.long_buf[2] = 3;
  <retval>.long_buf[1] = 2;
  <retval>.long_buf[0] = i;
  return <retval>;

}
--cut here--

Using -Wall, gcc correctly warns about uninitialized part
(why extra 'u' in index?):

t.c:16: warning: 'ret.long_buf[9u]' is used uninitialized in this function
t.c:16: warning: 'ret.long_buf[8u]' is used uninitialized in this function
t.c:16: warning: 'ret.long_buf[7u]' is used uninitialized in this function
t.c:16: warning: 'ret.long_buf[6u]' is used uninitialized in this function

IMO emitting some sort of initialization in this case is not needed.


-- 
           Summary: Strange initialization of uninitialized structure part
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: uros at kss-loka dot si
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


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

Reply via email to