[Bug tree-optimization/63411] New: [4.9/5 regression] ivopt produces wrong struct offset

olegendo at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Sep 29 21:40:00 GMT 2014


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63411

            Bug ID: 63411
           Summary: [4.9/5 regression] ivopt produces wrong struct offset
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: critical
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: olegendo at gcc dot gnu.org
              Host: i686-linux-gnu
            Target: sh*-*-*

Compiling the following as C or C++:

typedef struct
{
  unsigned char sprindex;
  unsigned char y;
  unsigned char index;
  unsigned char attr;
  unsigned char x;
  unsigned short pattern;
} oam;

extern oam OAM3[8];

int test2 (unsigned c, int r)
{
  for (unsigned i = 0; i < c; ++i)
  {
    oam* s = &(OAM3[i]);
    if (s->attr & 0x40)
      r += s->pattern;
  }
  return r;
}

on SH (big or little endian, any CPU type) with -O2 results in the following
wrong code:

_test2:
        tst     r4,r4
        bt      .L12
        mov.l   .L14,r1
        .align 2
.L4:
        mov.b   @r1,r0
        tst     #64,r0
        bt/s    .L3
        mov     r1,r2
        add     #3,r2     <<< wrong struct offset '3'
        mov.w   @r2,r2    <<< should be '3*2', i.e. '6'.
        extu.w  r2,r2
        add     r2,r5
.L3:
        dt      r4
        bf/s    .L4
        add     #8,r1
.L12:
        rts
        mov     r5,r0
.L15:
        .align 2
.L14:
        .long   _OAM3+3
        .size   _test2, .-_test2
        .ident  "GCC: (GNU) 4.9.2 20140929 (prerelease)"


Disabling ivopt with '-fno-ivopts' produces correct code:

_test2:
        tst     r4,r4
        bt      .L12
        mov     #0,r2
        mov.l   .L14,r3
        .align 2
.L4:
        mov     r2,r1
        shll2   r1
        add     r1,r1
        add     r3,r1
        mov.b   @(3,r1),r0
        tst     #64,r0
        bt      .L3
        mov.w   @(6,r1),r0    <<< correct struct offset '6'
        extu.w  r0,r1
        add     r1,r5
.L3:
        dt      r4
        bf/s    .L4
        add     #1,r2
.L12:
        rts
        mov     r5,r0
.L15:
        .align 2
.L14:
        .long   _OAM3
        .size   _test2, .-_test2
        .ident  "GCC: (GNU) 4.9.2 20140929 (prerelease)"


I haven't checked whether this happens on other targets, but I guess this is
not SH specific.

This happens on the current 4.9 branch and trunk.  4.8 branch is not affected.



More information about the Gcc-bugs mailing list