diff --git a/gcc/ChangeLog b/gcc/ChangeLog index efe553bd04b71418909b52c9a950d13746b63e88..cb85e0bee36f6d86e6bb50c000606a5409a7612b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-01-15 Richard Biener <rguenther@suse.de> + + PR middle-end/55882 + * emit-rtl.c (set_mem_attributes_minus_bitpos): Correctly + account for bitpos when computing alignment. + 2013-01-15 Vladimir Yakovlev <vladimir.b.yakovlev@intel.com> * config/i386/i386-c.c (ix86_target_macros_internal): New case. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index e7e904a040ba2a63b168951fac86621a85eb7687..2987bc9bb8838940f7fe2ff6ae4f2078af4381d3 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1839,7 +1839,12 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp, if (!align_computed) { - unsigned int obj_align = get_object_alignment (t); + unsigned int obj_align; + unsigned HOST_WIDE_INT obj_bitpos; + get_object_alignment_1 (t, &obj_align, &obj_bitpos); + obj_bitpos = (obj_bitpos - bitpos) & (obj_align - 1); + if (obj_bitpos != 0) + obj_align = (obj_bitpos & -obj_bitpos); attrs.align = MAX (attrs.align, obj_align); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a80f16bd85625b8aac9e3628885828e8d6e8277e..c286a87f06261373938e659eb715d9bcc966a6ec 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-01-15 Richard Biener <rguenther@suse.de> + + PR middle-end/55882 + * gcc.dg/torture/pr55882.c: New testcase. + 2013-01-15 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/55955 diff --git a/gcc/testsuite/gcc.dg/torture/pr55882.c b/gcc/testsuite/gcc.dg/torture/pr55882.c new file mode 100644 index 0000000000000000000000000000000000000000..fd2276e7f531b3fd561dc454545658f9b614d8c7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr55882.c @@ -0,0 +1,94 @@ +/* { dg-do run } */ + +typedef enum +{ + PVT_A = 0, + PVT_B = 1, + PVT_CONFIG = 2, + PVT_RESERVED3 = 3, +} T_CR_SELECT; + +typedef enum +{ + STD_ULOGIC_0 = 0, + STD_ULOGIC_1 = 1, +} STD_ULOGIC; + +typedef struct +{ + unsigned char rtp : 3; + unsigned char rtn : 3; +} C; + +typedef struct +{ + unsigned char nd; + unsigned char pd; + unsigned char rtn; + unsigned char rtp; +} A; + +typedef struct +{ + unsigned short reserved : 14; + unsigned char Z_rx_enable : 2; + A pvt; +} B; + +typedef struct +{ + B cr_dsclk_q3; + B cr_data_q3; + B cr_addr_q3; + B cr_cmd_q3; + B cr_pres_q3; + C cr_vref_q3[6]; + unsigned char pres_disable; + unsigned char pres_drive_high; + unsigned char c_enab_120; + STD_ULOGIC clk_tximp; + STD_ULOGIC dqs_tximp; + STD_ULOGIC cmd_tximp; + STD_ULOGIC data_tximp; + STD_ULOGIC dqs_rxterm; + STD_ULOGIC data_rxterm; + T_CR_SELECT cr_clk_sel; + unsigned char cr_clk : 5; + T_CR_SELECT cr_dsclk_odd_sel; + unsigned char cr_dsclk_odd : 5; + T_CR_SELECT cr_dsclk_even_sel; + unsigned char cr_dsclk_even : 5; + T_CR_SELECT cr_data_sel; + unsigned char cr_data : 5; + T_CR_SELECT cr_vref_sel; + unsigned char cr_vref : 5; + T_CR_SELECT cr_others_sel; + unsigned char cr_others : 5; +} CONFIG; + +typedef struct +{ + unsigned char enable_monitor; + unsigned short step_out_pointer : 12; + unsigned short hold_out_pointer : 12; + unsigned short enable_wr_dqs : 12; + unsigned short use_alt_rd_dqs : 12; + CONFIG io_buf; +} mystruct; + +unsigned short __attribute__((noinline,noclone)) +testfunction(unsigned i) +{ + mystruct dmfe[8]; + dmfe[0].use_alt_rd_dqs = 1; + dmfe[i].use_alt_rd_dqs = 0; + return dmfe[0].use_alt_rd_dqs; +} + +extern void abort (void); +int main () +{ + if (testfunction(0) != 0) + abort (); + return 0; +}