From 1bea309889ac0d3f7cab5d51e2105cda6fc7f59b Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Sun, 13 Dec 2009 17:36:20 +0000 Subject: [PATCH] re PR tree-optimization/42357 (another ice in create_tmp_var) 2009-12-13 Richard Guenther 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 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr42357.C | 30 ++++++++++++++++++++++++++ gcc/tree-sra.c | 3 ++- 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr42357.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index daad24950ad..c0e4634def9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-12-13 Richard Guenther + + PR tree-optimization/42357 + * tree-sra.c (sra_modify_assign): Do not tear apart struct copies. + 2009-12-12 Richard Guenther * tree.c (need_assembler_name_p): Abstract decls do not need diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a553545905c..da700243eac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-12-13 Richard Guenther + + PR tree-optimization/42357 + * g++.dg/torture/pr42357.C: New testcase. + 2009-12-11 Janus Weil 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 00000000000..1a1d64e4f8e --- /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 a6a1a90d757..8fdbb727607 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; } }