diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2a45134e7d0..cd0671ade09 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-01-26 Jakub Jelinek + + PR middle-end/51895 + * expr.c (expand_expr_real_1): Handle BLKmode MEM_REF of + non-addressable non-BLKmode base correctly. + 2012-01-26 Michael Matz PR tree-optimization/48794 diff --git a/gcc/expr.c b/gcc/expr.c index bd2f6b18f7c..8698f18e1e6 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -9327,6 +9327,16 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, bftype = TREE_TYPE (base); if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode) bftype = TREE_TYPE (exp); + else + { + temp = assign_stack_temp (DECL_MODE (base), + GET_MODE_SIZE (DECL_MODE (base)), + 0); + store_expr (base, temp, 0, false); + temp = adjust_address (temp, BLKmode, offset); + set_mem_size (temp, int_size_in_bytes (TREE_TYPE (exp))); + return temp; + } return expand_expr (build3 (BIT_FIELD_REF, bftype, base, TYPE_SIZE (TREE_TYPE (exp)), diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3ff49d77c5e..32baf0e09a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-01-26 Jakub Jelinek + + PR middle-end/51895 + * g++.dg/opt/pr51895.C: New test. + 2012-01-26 Michael Matz PR tree-optimization/48794 diff --git a/gcc/testsuite/g++.dg/opt/pr51895.C b/gcc/testsuite/g++.dg/opt/pr51895.C new file mode 100644 index 00000000000..84ac5e9962f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr51895.C @@ -0,0 +1,25 @@ +// PR middle-end/51895 +// { dg-do compile } +// { dg-options "-O2" } + +struct S +{ + long a; + char b; + S () : a (0), b (0) {} + bool baz (); +}; + +__attribute__((noinline)) static bool +bar (S x, S y) +{ + y = x; + return y.baz (); +} + +bool +foo (S x) +{ + S y; + return bar (x, y); +}