aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-12-13 17:36:20 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-12-13 17:36:20 +0000
commit1bea309889ac0d3f7cab5d51e2105cda6fc7f59b (patch)
tree23844ce3a0dff07fc11d48bb663df234c6fea161 /gcc
parent70c5cc5d72b5ce7bc8b5601f7e1817b9a021678f (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr42357.C30
-rw-r--r--gcc/tree-sra.c3
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;
}
}