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
This commit is contained in:
Richard Guenther 2009-12-13 17:36:20 +00:00 committed by Richard Biener
parent 70c5cc5d72
commit 1bea309889
4 changed files with 42 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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();
}

View File

@ -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;
}
}