diff options
author | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2008-04-20 17:53:58 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2008-04-20 17:53:58 +0000 |
commit | eea05d39c799880df753e9b74d2d96e86215c46e (patch) | |
tree | 98b0d0bff7a59feed5c1d5ed59a8533ed0177b82 /gcc | |
parent | e871a8730ae8bd2a50a47a6c87691078e2e7fff6 (diff) | |
download | gcc-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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/tree-sra.c | 20 |
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. */ |