[PATCH] Fix compile time regression with fortran
Richard Guenther
rguenther@suse.de
Mon Jan 16 12:43:00 GMT 2006
This patch may fix the compile time regression introduced with
the fix for PR 22555. It reduces the amount of SFTs produced for
variables that are only written to in a function.
Bootstrapped and tested on x86_64-unknown-linux-gnu.
Ok for mainline?
I'd appreciate testing from the fortran folks or a preprocessed testcase
that showed the compile-time regression.
Thanks,
Richard.
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.
Index: tree-ssa-alias.c
===================================================================
*** tree-ssa-alias.c (revision 109743)
--- tree-ssa-alias.c (working copy)
*************** typedef struct used_part
*** 2424,2429 ****
--- 2424,2431 ----
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. */
*************** get_or_create_used_part_for (size_t uid)
*** 2509,2514 ****
--- 2511,2517 ----
up->maxused = 0;
up->explicit_uses = false;
up->implicit_uses = false;
+ up->write_only = true;
}
return up;
*************** create_overlap_variables_for (tree var)
*** 2552,2561 ****
used_part_t up;
size_t uid = DECL_UID (var);
! if (!up_lookup (uid))
return;
- up = up_lookup (uid);
push_fields_onto_fieldstack (TREE_TYPE (var), &fieldstack, 0, NULL);
if (VEC_length (fieldoff_s, fieldstack) != 0)
{
--- 2555,2565 ----
used_part_t up;
size_t uid = DECL_UID (var);
! up = up_lookup (uid);
! if (!up
! || up->write_only)
return;
push_fields_onto_fieldstack (TREE_TYPE (var), &fieldstack, 0, NULL);
if (VEC_length (fieldoff_s, fieldstack) != 0)
{
*************** create_overlap_variables_for (tree var)
*** 2691,2700 ****
entire structure. */
static tree
! find_used_portions (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
{
switch (TREE_CODE (*tp))
{
case REALPART_EXPR:
case IMAGPART_EXPR:
case COMPONENT_REF:
--- 2695,2709 ----
entire structure. */
static tree
! 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:
*************** find_used_portions (tree *tp, int *walk_
*** 2723,2728 ****
--- 2732,2739 ----
up->explicit_uses = true;
else
up->implicit_uses = true;
+ if (!lhs_p)
+ up->write_only = false;
up_insert (uid, up);
*walk_subtrees = 0;
Index: testsuite/gcc.dg/tree-ssa/20031015-1.c
===================================================================
*** testsuite/gcc.dg/tree-ssa/20031015-1.c (revision 109743)
--- testsuite/gcc.dg/tree-ssa/20031015-1.c (working copy)
*************** main(void)
*** 13,20 ****
return 0;
}
! /* The V_MUST_DEF comes from the initial assignment; the V_MAY_DEF
! comes from the asm. */
! /* { 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" } } */
--- 13,18 ----
return 0;
}
! /* The V_*_DEF comes from the initial assignment and the asm. */
! /* { dg-final { scan-tree-dump-times "_DEF" 2 "alias1" } } */
/* { dg-final { cleanup-tree-dump "alias1" } } */
More information about the Gcc-patches
mailing list