Commit 183596eb by Richard Guenther Committed by Richard Biener

tree-ssa-alias.c (struct used_part): Add write_only field.

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.

From-SVN: r109766
parent dcc2da41
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.
2006-01-16 Kazu Hirata <kazu@codesourcery.com> 2006-01-16 Kazu Hirata <kazu@codesourcery.com>
* bb-reorder.c (partition_hot_cold_basic_blocks): Make it * bb-reorder.c (partition_hot_cold_basic_blocks): Make it
......
2006-01-16 Richard Guenther <rguenther@suse.de>
* gcc.dg/tree-ssa/20031015-1.c: Adjust testcase.
2006-01-16 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> 2006-01-16 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR testsuite/25777 PR testsuite/25777
...@@ -13,8 +13,6 @@ main(void) ...@@ -13,8 +13,6 @@ main(void)
return 0; return 0;
} }
/* The V_MUST_DEF comes from the initial assignment; the V_MAY_DEF /* The V_*_DEF comes from the initial assignment and the asm. */
comes from the asm. */ /* { dg-final { scan-tree-dump-times "_DEF" 2 "alias1" } } */
/* { dg-final { scan-tree-dump-times "V_MUST_DEF" 1 "alias1" } } */
/* { dg-final { scan-tree-dump-times "V_MAY_DEF" 1 "alias1" } } */
/* { dg-final { cleanup-tree-dump "alias1" } } */ /* { dg-final { cleanup-tree-dump "alias1" } } */
...@@ -2424,6 +2424,8 @@ typedef struct used_part ...@@ -2424,6 +2424,8 @@ typedef struct used_part
variable. Implicit uses occur when we can't tell what part we variable. Implicit uses occur when we can't tell what part we
are referencing, and have to make conservative assumptions. */ are referencing, and have to make conservative assumptions. */
bool implicit_uses; bool implicit_uses;
/* True if the structure is only written to or taken its address. */
bool write_only;
} *used_part_t; } *used_part_t;
/* An array of used_part structures, indexed by variable uid. */ /* An array of used_part structures, indexed by variable uid. */
...@@ -2509,6 +2511,7 @@ get_or_create_used_part_for (size_t uid) ...@@ -2509,6 +2511,7 @@ get_or_create_used_part_for (size_t uid)
up->maxused = 0; up->maxused = 0;
up->explicit_uses = false; up->explicit_uses = false;
up->implicit_uses = false; up->implicit_uses = false;
up->write_only = true;
} }
return up; return up;
...@@ -2552,10 +2555,11 @@ create_overlap_variables_for (tree var) ...@@ -2552,10 +2555,11 @@ create_overlap_variables_for (tree var)
used_part_t up; used_part_t up;
size_t uid = DECL_UID (var); size_t uid = DECL_UID (var);
if (!up_lookup (uid)) up = up_lookup (uid);
if (!up
|| up->write_only)
return; return;
up = up_lookup (uid);
push_fields_onto_fieldstack (TREE_TYPE (var), &fieldstack, 0, NULL); push_fields_onto_fieldstack (TREE_TYPE (var), &fieldstack, 0, NULL);
if (VEC_length (fieldoff_s, fieldstack) != 0) if (VEC_length (fieldoff_s, fieldstack) != 0)
{ {
...@@ -2691,10 +2695,15 @@ create_overlap_variables_for (tree var) ...@@ -2691,10 +2695,15 @@ create_overlap_variables_for (tree var)
entire structure. */ entire structure. */
static tree 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)) 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 REALPART_EXPR:
case IMAGPART_EXPR: case IMAGPART_EXPR:
case COMPONENT_REF: case COMPONENT_REF:
...@@ -2723,6 +2732,8 @@ find_used_portions (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) ...@@ -2723,6 +2732,8 @@ find_used_portions (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
up->explicit_uses = true; up->explicit_uses = true;
else else
up->implicit_uses = true; up->implicit_uses = true;
if (!lhs_p)
up->write_only = false;
up_insert (uid, up); up_insert (uid, up);
*walk_subtrees = 0; *walk_subtrees = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment