diff options
author | Richard Guenther <rguenther@suse.de> | 2009-12-13 17:36:20 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-12-13 17:36:20 +0000 |
commit | 1bea309889ac0d3f7cab5d51e2105cda6fc7f59b (patch) | |
tree | 23844ce3a0dff07fc11d48bb663df234c6fea161 /gcc | |
parent | 70c5cc5d72b5ce7bc8b5601f7e1817b9a021678f (diff) | |
download | gcc-1bea309889ac0d3f7cab5d51e2105cda6fc7f59b.zip gcc-1bea309889ac0d3f7cab5d51e2105cda6fc7f59b.tar.gz gcc-1bea309889ac0d3f7cab5d51e2105cda6fc7f59b.tar.bz2 |
re PR tree-optimization/42357 (another ice in create_tmp_var)
2009-12-13 Richard Guenther <rguenther@suse.de>
PR tree-optimization/42357
* tree-sra.c (sra_modify_assign): Do not tear apart struct copies.
* g++.dg/torture/pr42357.C: New testcase.
From-SVN: r155193
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr42357.C | 30 | ||||
-rw-r--r-- | gcc/tree-sra.c | 3 |
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index daad249..c0e4634 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-12-13 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/42357 + * tree-sra.c (sra_modify_assign): Do not tear apart struct copies. + 2009-12-12 Richard Guenther <rguenther@suse.de> * tree.c (need_assembler_name_p): Abstract decls do not need diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a553545..da70024 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-12-13 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/42357 + * g++.dg/torture/pr42357.C: New testcase. + 2009-12-11 Janus Weil <janus@gcc.gnu.org> PR fortran/42257 diff --git a/gcc/testsuite/g++.dg/torture/pr42357.C b/gcc/testsuite/g++.dg/torture/pr42357.C new file mode 100644 index 0000000..1a1d64e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42357.C @@ -0,0 +1,30 @@ +// { dg-do compile } +typedef unsigned char uint8; +typedef unsigned int uint32; +class PixelARGB { +public: + ~PixelARGB() throw() { } + PixelARGB (const uint32 argb_) throw() : argb (argb_) { } + inline __attribute__((always_inline)) uint8 getRed() const throw() { + return components.r; + } + union { + uint32 argb; + struct { + uint8 b, g, r, a; + } components; + }; +}; +class Colour { +public: + Colour() throw() : argb (0) {}; + uint8 getRed() const throw() { + return argb.getRed(); + } + PixelARGB argb; +}; +uint8 writeImage (void) { + Colour pixel; + pixel = Colour (); + return pixel.getRed(); +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index a6a1a90..8fdbb72 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -2441,7 +2441,8 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi, if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs))) { rhs = fold_build1_loc (loc, VIEW_CONVERT_EXPR, TREE_TYPE (lhs), rhs); - if (!is_gimple_reg (lhs)) + if (is_gimple_reg_type (TREE_TYPE (lhs)) + && TREE_CODE (lhs) != SSA_NAME) force_gimple_rhs = true; } } |