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

            Bug ID: 88739
           Summary: union bug on ARM64
           Product: gcc
           Version: 7.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dongjianqiang2 at huawei dot com
  Target Milestone: ---

Created attachment 45364
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=45364&action=edit
demo code to recur error

#include<stdio.h>
typedef  unsigned int U32;
typedef  unsigned short  U16;
typedef  unsigned char U8;

typedef struct MEM_HEAD_4DW
{
    /* first word */
    U32 b11               : 1;
    U32 b12               : 3;
    U32 b13               : 3;
    U32 b14               : 1;
    U32 b15               : 16;
    U32 b16               : 8;

    /* second word */
    U32 b21               : 16;
    U32 b22               : 1;
    U32 b23               : 4;
    U32 b24               : 11;

    /* third word */
    U32 b31               : 32;

    /* fourth word */
    U32 b30AddrL          : 30;
    U32 b2AddrType        : 2;
}MEM_REQ_HEAD_4DW;

typedef union HEAD_DW4_UNION
{
    MEM_REQ_HEAD_4DW strMemHead;
    U32 aulValue[4];
    U16 ausValue[8];
            U8  aucValue[16];
}HEAD_REQ_DW4_UNION;



U32 Test_func(U32 ulAddr)
{
    HEAD_REQ_DW4_UNION unData;

    unData.strMemHead.b30AddrL        = ulAddr >> 2;
    unData.strMemHead.b2AddrType      = 0;
    printf("unData.strMemHead.b30AddrL=0x%x\r\n",unData.strMemHead.b30AddrL);
   
printf("unData.strMemHead.b2AddrType=0x%x\r\n",unData.strMemHead.b2AddrType);
    printf("unData.aulValue[3]=0x%x\r\n",unData.aulValue[3]);       // 0000
0000 0000 0001 0000 0010 0010 0100
    printf("unData.ausValue[6]=0x%x\r\n",unData.ausValue[6]);       // why get
0x0 instead of 0x1 ?
    printf("unData.ausValue[7]=0x%x\r\n",unData.ausValue[7]);

    return 0;
}

int main()

{
  Test_func(0x10224);
  return 0;
}

Hi,

For ARM64 big-endian, when compiled above code with -O0, the output of
ausValue[6] is 0x1 which is correct, but when I try to compile with -O1 or -O2,
the output of ausValue[6] is 0x0 which is wrong. Will appreciate if you can
help me look into this issue? is this gcc bug?

Reply via email to