diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-01-26 15:09:29 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-01-26 15:09:29 +0100 |
commit | 892123df86260d2bddfc9bbb9f2d60915a5b0b8d (patch) | |
tree | 4ef0a42b783ea90511e4b9dc646b1386093ba1cd | |
parent | 1a47f99c0f033b16594eaabac4e6dbc4c5c58554 (diff) | |
download | gcc-892123df86260d2bddfc9bbb9f2d60915a5b0b8d.zip gcc-892123df86260d2bddfc9bbb9f2d60915a5b0b8d.tar.gz gcc-892123df86260d2bddfc9bbb9f2d60915a5b0b8d.tar.bz2 |
re PR middle-end/51895 (ICE in simplify_subreg)
PR middle-end/51895
* expr.c (expand_expr_real_1): Handle BLKmode MEM_REF of
non-addressable non-BLKmode base correctly.
* g++.dg/opt/pr51895.C: New test.
From-SVN: r183560
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expr.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr51895.C | 25 |
4 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2a45134..cd0671a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-01-26 Jakub Jelinek <jakub@redhat.com> + + 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 <matz@suse.de> PR tree-optimization/48794 @@ -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 3ff49d7..32baf0e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-01-26 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/51895 + * g++.dg/opt/pr51895.C: New test. + 2012-01-26 Michael Matz <matz@suse.de> 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 0000000..84ac5e9 --- /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); +} |