aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2008-04-20 17:53:58 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2008-04-20 17:53:58 +0000
commiteea05d39c799880df753e9b74d2d96e86215c46e (patch)
tree98b0d0bff7a59feed5c1d5ed59a8533ed0177b82 /gcc
parente871a8730ae8bd2a50a47a6c87691078e2e7fff6 (diff)
downloadgcc-eea05d39c799880df753e9b74d2d96e86215c46e.zip
gcc-eea05d39c799880df753e9b74d2d96e86215c46e.tar.gz
gcc-eea05d39c799880df753e9b74d2d96e86215c46e.tar.bz2
tree-sra.c (sra_walk_expr): Disable scalarization if on the LHS and not a full access.
* tree-sra.c (sra_walk_expr) <VIEW_CONVERT_EXPR>: Disable scalarization if on the LHS and not a full access. From-SVN: r134487
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-sra.c20
2 files changed, 22 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d96a8e6..a760e7f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,9 +1,14 @@
+2008-04-20 Eric Botcazou <ebotcazou@adacore.com>
+
+ * tree-sra.c (sra_walk_expr) <VIEW_CONVERT_EXPR>: Disable
+ scalarization if on the LHS and not a full access.
+
2008-04-20 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
- * Makefile.in (s-gtyp-input): Remove tmp-gi.list before writing
- it.
+ * Makefile.in (s-gtyp-input): Remove tmp-gi.list before writing it.
2008-04-18 Rafael Espindola <espindola@google.com>
+
* tree-vrp.c (find_case_label_index): Fix the binary search.
(find_case_label_range): New.
(vrp_visit_switch_stmt): Use find_case_label_range.
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 752f87d..78a100f 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -855,18 +855,28 @@ sra_walk_expr (tree *expr_p, block_stmt_iterator *bsi, bool is_output,
if (elt)
elt->is_vector_lhs = true;
}
+
/* A bit field reference (access to *multiple* fields simultaneously)
- is not currently scalarized. Consider this an access to the
- complete outer element, to which walk_tree will bring us next. */
-
+ is not currently scalarized. Consider this an access to the full
+ outer element, to which walk_tree will bring us next. */
goto use_all;
- case VIEW_CONVERT_EXPR:
case NOP_EXPR:
- /* Similarly, a view/nop explicitly wants to look at an object in a
+ /* Similarly, a nop explicitly wants to look at an object in a
type other than the one we've scalarized. */
goto use_all;
+ case VIEW_CONVERT_EXPR:
+ /* Likewise for a view conversion, but with an additional twist:
+ it can be on the LHS and, in this case, an access to the full
+ outer element would mean a killing def. So we need to punt
+ if we haven't already a full access to the current element,
+ because we cannot pretend to have a killing def if we only
+ have a partial access at some level. */
+ if (is_output && !use_all_p && inner != expr)
+ disable_scalarization = true;
+ goto use_all;
+
case WITH_SIZE_EXPR:
/* This is a transparent wrapper. The entire inner expression really
is being used. */