From 8e1d2e8278cc2bed80ad1a1564cee131996b6129 Mon Sep 17 00:00:00 2001
From: Richard Henderson <rth@redhat.com>
Date: Fri, 31 Dec 2004 18:38:06 -0800
Subject: [PATCH] re PR tree-optimization/19042 (Complex types are not SRA all
 the time.)

        PR tree-opt/19042
        * tree-sra.c (decide_block_copy): Force use_block_copy false
        for complex values.

From-SVN: r92782
---
 gcc/ChangeLog  | 6 ++++++
 gcc/tree-sra.c | 7 ++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ebe2b7d7a296..983ad2ce792f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2004-12-31  Richard Henderson  <rth@redhat.com>
+
+	PR tree-opt/19042
+	* tree-sra.c (decide_block_copy): Force use_block_copy false
+	for complex values.
+
 2004-12-31  Richard Henderson  <rth@redhat.com>
 
 	PR middle-end/17799
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 1c1739b18b21..bb98a8afe6cf 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1293,10 +1293,15 @@ decide_block_copy (struct sra_elt *elt)
       tree size_tree = TYPE_SIZE_UNIT (elt->type);
       bool use_block_copy = true;
 
+      /* Tradeoffs for COMPLEX types pretty much always make it better
+	 to go ahead and split the components.  */
+      if (TREE_CODE (elt->type) == COMPLEX_TYPE)
+	use_block_copy = false;
+
       /* Don't bother trying to figure out the rest if the structure is
 	 so large we can't do easy arithmetic.  This also forces block
 	 copies for variable sized structures.  */
-      if (host_integerp (size_tree, 1))
+      else if (host_integerp (size_tree, 1))
 	{
 	  unsigned HOST_WIDE_INT full_size, inst_size = 0;
 	  unsigned int inst_count;
-- 
GitLab