From 378f8976f26a17a53c5c306f7277971e8e7a6aa7 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 9 Oct 2013 12:59:02 +0000 Subject: [PATCH] re PR middle-end/58570 (wrong code for bitfields at -O2 and above) PR middle-end/58570 * tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p): Return false if both components are bitfields. From-SVN: r203315 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.c-torture/execute/pr58570.c | 22 +++++++++++++++++++ gcc/tree-ssa-alias.c | 5 +++-- 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr58570.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d04904c44082..f78642ae0adb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-10-09 Eric Botcazou + + PR middle-end/58570 + * tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p): Return + false if both components are bitfields. + 2013-10-09 Alex Velenko * config/aarch64/arm_neon.h (vclz_s8, vclz_s16, vclz_s32) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0ece8c065107..4de71eb0f717 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-10-09 Eric Botcazou + + * gcc.c-torture/execute/pr58570.c: New test. + 2013-10-09 Alex Velenko * gcc.target/aarch64/vclz.c: New testcase. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr58570.c b/gcc/testsuite/gcc.c-torture/execute/pr58570.c new file mode 100644 index 000000000000..6d5116d9ea5b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr58570.c @@ -0,0 +1,22 @@ +#pragma pack(1) +struct S +{ + int f0:15; + int f1:29; +}; + +int e = 1, i; +static struct S d[6]; + +int +main (void) +{ + if (e) + { + d[i].f0 = 1; + d[i].f1 = 1; + } + if (d[0].f1 != 1) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 0d3c15c447d3..4aaa98b11ae9 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -803,12 +803,13 @@ nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2) if (type1 != type2 || TREE_CODE (type1) != RECORD_TYPE) goto may_overlap; - /* Different fields of the same record type cannot overlap. */ + /* Different fields of the same record type cannot overlap. + ??? Bitfields can overlap at RTL level so punt on them. */ if (field1 != field2) { component_refs1.release (); component_refs2.release (); - return true; + return !(DECL_BIT_FIELD (field1) && DECL_BIT_FIELD (field2)); } } -- 2.47.2