diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-01-16 19:35:08 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-01-16 19:35:08 +0000 |
commit | e27f337edeb1585c8ef04bd7f069bf6c9d3edacb (patch) | |
tree | 81b34c2198f03ac751ceca53567fb3a0777c0618 /gcc/tree-ssa-alias.c | |
parent | 1c51e1aa8590b0b770f9466e6d45098ec6376404 (diff) | |
download | gcc-e27f337edeb1585c8ef04bd7f069bf6c9d3edacb.tar.gz |
2006-01-16 Richard Guenther <rguenther@suse.de>
* tree-ssa-alias.c (struct used_part): Add write_only field.
(get_or_create_used_part_for): Initialize it to true.
(create_overlap_variables_for): Don't create structure variables
for structures that only are written to.
(find_used_portions): Handle MODIFY_EXPR to track whether a
structure is only written to.
* gcc.dg/tree-ssa/20031015-1.c: Adjust testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109766 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r-- | gcc/tree-ssa-alias.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 353e7bd4448..5370747fc62 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -2424,6 +2424,8 @@ typedef struct used_part variable. Implicit uses occur when we can't tell what part we are referencing, and have to make conservative assumptions. */ bool implicit_uses; + /* True if the structure is only written to or taken its address. */ + bool write_only; } *used_part_t; /* An array of used_part structures, indexed by variable uid. */ @@ -2509,6 +2511,7 @@ get_or_create_used_part_for (size_t uid) up->maxused = 0; up->explicit_uses = false; up->implicit_uses = false; + up->write_only = true; } return up; @@ -2552,10 +2555,11 @@ create_overlap_variables_for (tree var) used_part_t up; size_t uid = DECL_UID (var); - if (!up_lookup (uid)) + up = up_lookup (uid); + if (!up + || up->write_only) return; - up = up_lookup (uid); push_fields_onto_fieldstack (TREE_TYPE (var), &fieldstack, 0, NULL); if (VEC_length (fieldoff_s, fieldstack) != 0) { @@ -2691,10 +2695,15 @@ create_overlap_variables_for (tree var) entire structure. */ static tree -find_used_portions (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) +find_used_portions (tree *tp, int *walk_subtrees, void *lhs_p) { switch (TREE_CODE (*tp)) { + case MODIFY_EXPR: + /* Recurse manually here to track whether the use is in the + LHS of an assignment. */ + find_used_portions (&TREE_OPERAND (*tp, 0), walk_subtrees, tp); + return find_used_portions (&TREE_OPERAND (*tp, 1), walk_subtrees, NULL); case REALPART_EXPR: case IMAGPART_EXPR: case COMPONENT_REF: @@ -2723,6 +2732,8 @@ find_used_portions (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) up->explicit_uses = true; else up->implicit_uses = true; + if (!lhs_p) + up->write_only = false; up_insert (uid, up); *walk_subtrees = 0; |