From c352a608031891e677f41df1ec503acd6b3e2c49 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Mon, 9 Jan 2012 19:40:09 +0100 Subject: [PATCH] re PR tree-optimization/51759 (miscompile writes past end of bitfield) 2012-01-09 Martin Jambor PR tree-optimization/51759 Backport from mainline 2010-09-15 Martin Jambor PR middle-end/45644 * tree-sra.c (create_access): Check for bit-fields directly. * testsuite/gcc.dg/ipa/pr45644.c: New test. * testsuite/g++.dg/ipa/pr51759.C: Likewise. From-SVN: r183023 --- gcc/ChangeLog | 9 ++++++++ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/g++.dg/ipa/pr51759.C | 26 ++++++++++++++++++++++ gcc/testsuite/gcc.dg/ipa/pr45644.c | 35 ++++++++++++++++++++++++++++++ gcc/tree-sra.c | 7 +++--- 5 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ipa/pr51759.C create mode 100644 gcc/testsuite/gcc.dg/ipa/pr45644.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 66cf0914da4f..a3752928d7d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-01-09 Martin Jambor + + PR tree-optimization/51759 + Backport from mainline + 2010-09-15 Martin Jambor + + PR middle-end/45644 + * tree-sra.c (create_access): Check for bit-fields directly. + 2012-01-09 Eric Botcazou * config/sparc/sol2-unwind.h (sparc64_is_sighandler): Check that the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4b780419d553..6d23a5afd4bc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-01-09 Martin Jambor + + PR tree-optimization/51759 + * gcc.dg/ipa/pr45644.c: New test. + * g++.dg/ipa/pr51759.C: Likewise. + 2012-01-06 Richard Sandiford PR middle-end/48660 diff --git a/gcc/testsuite/g++.dg/ipa/pr51759.C b/gcc/testsuite/g++.dg/ipa/pr51759.C new file mode 100644 index 000000000000..accfaf2dcc2d --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr51759.C @@ -0,0 +1,26 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +extern "C" void abort (void); +struct S +{ + void __attribute__((noinline)) set(unsigned val) + { + data = val; + if (data != val) + abort (); + } + int pad0; + unsigned pad1 : 8; + unsigned data : 24; + int pad2; +}; +int main() +{ + S s; + s.pad2 = -1; + s.set(0); + if (s.pad2 != -1) + abort (); +} + diff --git a/gcc/testsuite/gcc.dg/ipa/pr45644.c b/gcc/testsuite/gcc.dg/ipa/pr45644.c new file mode 100644 index 000000000000..3f61b8b41273 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pr45644.c @@ -0,0 +1,35 @@ +/* Verify that we do not IPA-SRA bitfields. */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +extern void abort (void); + +struct S +{ + int j : 8; + int i : 24; + int l; +}; + +static int __attribute__((noinline)) foo (struct S *s) +{ + int z = s->i; + if (z != 777) + abort (); + return 0; +} + +int __attribute__((noinline)) bar (struct S *s) +{ + return foo (s); +} + +int main (int argc, char *argv[]) +{ + struct S s; + s.j = 5; + s.i = 777; + s.l = -1; + + return bar (&s); +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 3326582814ab..c48ee62686de 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -771,12 +771,13 @@ create_access (tree expr, gimple stmt, bool write) disqualify_candidate (base, "Encountered a variable sized access."); return NULL; } - if ((offset % BITS_PER_UNIT) != 0 || (size % BITS_PER_UNIT) != 0) + if (TREE_CODE (expr) == COMPONENT_REF + && DECL_BIT_FIELD (TREE_OPERAND (expr, 1))) { - disqualify_candidate (base, - "Encountered an acces not aligned to a byte."); + disqualify_candidate (base, "Encountered a bit-field access."); return NULL; } + gcc_assert ((offset % BITS_PER_UNIT) == 0); if (ptr) mark_parm_dereference (base, offset + size, stmt); -- 2.47.2