+2004-07-28 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-optimize.c (init_tree_optimization_passes): Schedule
+ pass_may_alias right after the program is renamed into SSA.
+ * tree-pass.h (PROP_alias): Define.
+ * tree-outof-ssa.c (pass_del_ssa): Require PROP_alias.
+ * tree-sra.c (pass_sra): Likewise.
+ * tree-ssa-ccp.c (pass_ccp): Likewise.
+ * tree-ssa-copyrename.c (pass_rename_ssa_ccp): Likewise.
+ * tree-ssa-dce.c (pass_dce): Likewise.
+ * tree-ssa-dom.c (pass_dominator): Likewise.
+ * tree-ssa-dse.c (pass_dse): Likewise.
+ * tree-ssa-forwprop.c (pass_forwprop): Likewise.
+ * tree-ssa-loop-ch.c (pass_ch): Likewise.
+ * tree-ssa-phiopt.c (pass_phiopt): Likewise.
+ * tree-ssa-pre.c (pass_pre): Likewise.
+ * tree-tailcall.c (pass_tail_recursion): Likewise.
+ * tree-ssa.c (pass_redundant_phi): Likewise.
+ * tree-ssa-alias.c (aliases_computed_p): Remove.
+ Update all users.
+ (init_alias_info): Do not mark all type tags for renaming
+ unconditionally.
+ Clear may_aliases from every symbol.
+ (setup_pointers_and_addressables): If a pointer has not been
+ dereferenced and it had a type tag, clear it and mark the old
+ tag for renaming.
+
2004-07-28 Diego Novillo <dnovillo@redhat.com>
PR tree-optimization/16705
+2004-07-28 Diego Novillo <dnovillo@redhat.com>
+
+ * gcc.dg/tree-ssa/20030714-2.c: Adjust number of expected
+ conditionals.
+ * gcc.dg/tree-ssa/20031022-1.c: Adjust number of expected
+ loads.
+ * gcc.dg/tree-ssa/ssa-dom-cse-1.c: Expect optimization in
+ DOM1.
+
2004-07-27 Andrew Pinski <apinski@apple.com>
* g++.dg/rtti/tinfo1.C: Correct the xfail.
}
}
-/* There should be exactly four IF conditionals if we thread jumps
+/* There should be exactly three IF conditionals if we thread jumps
properly. */
-/* { dg-final { scan-tree-dump-times "if " 4 "dom3"} } */
+/* { dg-final { scan-tree-dump-times "if " 3 "dom3"} } */
foo (e);
}
-/* There should be two loads from entry_exit_blocks[1].pred. */
+/* There should be one load from entry_exit_blocks[1].pred. */
/* { dg-final { scan-tree-dump-times "entry_exit_blocks.1..pred" 2 "dom1"} } */
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dom2-details" } */
+/* { dg-options "-O2 -fdump-tree-dom1-details" } */
int t(int a) __attribute__ ((const));
void q (void);
void
q();
}
}
-/* We should thread the jump twice and eliminate it. Test this in
- DOM2, after aliases have been computed. */
-/* { dg-final { scan-tree-dump-times "Replaced.* t " 1 "dom2"} } */
+/* We should thread the jump twice and eliminate it. */
+/* { dg-final { scan-tree-dump-times "Replaced.* t " 1 "dom1"} } */
NEXT_PASS (pass_referenced_vars);
NEXT_PASS (pass_build_pta);
NEXT_PASS (pass_build_ssa);
+ NEXT_PASS (pass_may_alias);
NEXT_PASS (pass_rename_ssa_copies);
NEXT_PASS (pass_early_warn_uninitialized);
NEXT_PASS (pass_dce);
NULL, /* next */
0, /* static_pass_number */
TV_TREE_SSA_TO_NORMAL, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
/* ??? If TER is enabled, we also kill gimple. */
PROP_ssa, /* properties_destroyed */
#define PROP_ssa (1 << 6)
#define PROP_no_crit_edges (1 << 7)
#define PROP_rtl (1 << 8)
+#define PROP_alias (1 << 9)
#define PROP_trees \
(PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh)
NULL, /* next */
0, /* static_pass_number */
TV_TREE_SRA, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
variable). */
bitmap addressable_vars;
-/* 'true' after aliases have been computed (see compute_may_aliases). This
- is used by get_stmt_operands and its helpers to determine what to do
- when scanning an operand for a variable that may be aliased. If
- may-alias information is still not available, the statement is marked as
- having volatile operands. */
-bool aliases_computed_p;
-
/* When the program has too many call-clobbered variables and call-sites,
this variable is used to represent the clobbering effects of function
calls. In these cases, all the call clobbered variables in the program
/* Deallocate memory used by aliasing data structures. */
delete_alias_info (ai);
-
- /* Indicate that may-alias information is now available. */
- aliases_computed_p = true;
}
struct tree_opt_pass pass_may_alias =
0, /* static_pass_number */
TV_TREE_MAY_ALIAS, /* tv_id */
PROP_cfg | PROP_ssa | PROP_pta, /* properties_required */
- 0, /* properties_provided */
+ PROP_alias, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func | TODO_rename_vars
init_alias_info (void)
{
struct alias_info *ai;
+ static bool aliases_computed_p = false;
ai = xcalloc (1, sizeof (struct alias_info));
ai->ssa_names_visited = BITMAP_XMALLOC ();
for (i = 0; i < num_referenced_vars; i++)
{
var_ann_t ann = var_ann (referenced_var (i));
-
ann->is_alias_tag = 0;
- if (ann->type_mem_tag)
- {
- var_ann_t tag_ann = var_ann (ann->type_mem_tag);
- tag_ann->may_aliases = NULL;
- bitmap_set_bit (vars_to_rename, tag_ann->uid);
- }
+ ann->may_aliases = NULL;
}
/* Clear flow-sensitive points-to information from each SSA name. */
pi->is_dereferenced = 0;
if (pi->pt_vars)
bitmap_clear (pi->pt_vars);
- if (pi->name_mem_tag)
- var_ann (pi->name_mem_tag)->may_aliases = NULL;
}
}
}
+ /* Next time, we will need to reset alias information. */
+ aliases_computed_p = true;
+
return ai;
}
/* Add pointer variables that have been dereferenced to the POINTERS
array and create a type memory tag for them. */
- if (POINTER_TYPE_P (TREE_TYPE (var))
- && (bitmap_bit_p (ai->dereferenced_ptrs_store, v_ann->uid)
- || bitmap_bit_p (ai->dereferenced_ptrs_load, v_ann->uid)))
+ if (POINTER_TYPE_P (TREE_TYPE (var)))
{
- tree tag;
- var_ann_t t_ann;
-
- /* If pointer VAR still doesn't have a memory tag associated
- with it, create it now or re-use an existing one. */
- tag = get_tmt_for (var, ai);
- t_ann = var_ann (tag);
-
- /* The type tag will need to be renamed into SSA afterwards.
- Note that we cannot do this inside get_tmt_for because
- aliasing may run multiple times and we only create type
- tags the first time. */
- bitmap_set_bit (vars_to_rename, t_ann->uid);
-
- /* Associate the tag with pointer VAR. */
- v_ann->type_mem_tag = tag;
-
- /* If pointer VAR has been used in a store operation, then its
- memory tag must be marked as written-to. */
- if (bitmap_bit_p (ai->dereferenced_ptrs_store, v_ann->uid))
- bitmap_set_bit (ai->written_vars, t_ann->uid);
-
- /* If pointer VAR is a global variable or a PARM_DECL, then its
- memory tag should be considered a global variable. */
- if (TREE_CODE (var) == PARM_DECL || needs_to_live_in_memory (var))
- mark_call_clobbered (tag);
-
- /* All the dereferences of pointer VAR count as references of
- TAG. Since TAG can be associated with several pointers, add
- the dereferences of VAR to the TAG. We may need to grow
- AI->NUM_REFERENCES because we have been adding name and
- type tags. */
- if (t_ann->uid >= VARRAY_SIZE (ai->num_references))
- VARRAY_GROW (ai->num_references, t_ann->uid + 10);
-
- VARRAY_UINT (ai->num_references, t_ann->uid)
- += VARRAY_UINT (ai->num_references, v_ann->uid);
+ if ((bitmap_bit_p (ai->dereferenced_ptrs_store, v_ann->uid)
+ || bitmap_bit_p (ai->dereferenced_ptrs_load, v_ann->uid)))
+ {
+ tree tag;
+ var_ann_t t_ann;
+
+ /* If pointer VAR still doesn't have a memory tag
+ associated with it, create it now or re-use an
+ existing one. */
+ tag = get_tmt_for (var, ai);
+ t_ann = var_ann (tag);
+
+ /* The type tag will need to be renamed into SSA
+ afterwards. Note that we cannot do this inside
+ get_tmt_for because aliasing may run multiple times
+ and we only create type tags the first time. */
+ bitmap_set_bit (vars_to_rename, t_ann->uid);
+
+ /* Associate the tag with pointer VAR. */
+ v_ann->type_mem_tag = tag;
+
+ /* If pointer VAR has been used in a store operation,
+ then its memory tag must be marked as written-to. */
+ if (bitmap_bit_p (ai->dereferenced_ptrs_store, v_ann->uid))
+ bitmap_set_bit (ai->written_vars, t_ann->uid);
+
+ /* If pointer VAR is a global variable or a PARM_DECL,
+ then its memory tag should be considered a global
+ variable. */
+ if (TREE_CODE (var) == PARM_DECL || needs_to_live_in_memory (var))
+ mark_call_clobbered (tag);
+
+ /* All the dereferences of pointer VAR count as
+ references of TAG. Since TAG can be associated with
+ several pointers, add the dereferences of VAR to the
+ TAG. We may need to grow AI->NUM_REFERENCES because
+ we have been adding name and type tags. */
+ if (t_ann->uid >= VARRAY_SIZE (ai->num_references))
+ VARRAY_GROW (ai->num_references, t_ann->uid + 10);
+
+ VARRAY_UINT (ai->num_references, t_ann->uid)
+ += VARRAY_UINT (ai->num_references, v_ann->uid);
+ }
+ else
+ {
+ /* The pointer has not been dereferenced. If it had a
+ type memory tag, remove it and mark the old tag for
+ renaming to remove it out of the IL. */
+ var_ann_t ann = var_ann (var);
+ tree tag = ann->type_mem_tag;
+ if (tag)
+ {
+ bitmap_set_bit (vars_to_rename, var_ann (tag)->uid);
+ ann->type_mem_tag = NULL_TREE;
+ }
+ }
}
}
NULL, /* next */
0, /* static_pass_number */
TV_TREE_CCP, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
0, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
TV_TREE_COPY_RENAME, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
TV_TREE_DCE, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
TV_TREE_CD_DCE, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
TV_TREE_SSA_DOMINATOR_OPTS, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
TV_TREE_DSE, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa
+ | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
TV_TREE_FORWPROP, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa
+ | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
TV_TREE_CH, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
add_stmt_operand (&var, stmt, opf_is_def, prev_vops);
});
- /* If we don't have call-clobbered nor addressable vars and we
- still have not computed aliasing information, just mark the
- statement as having volatile operands. If the alias pass
- finds some, we will add them at that point. */
- if (!aliases_computed_p)
- stmt_ann (stmt)->has_volatile_ops = true;
-
break;
}
}
if (SSA_VAR_P (ptr))
{
- if (!aliases_computed_p)
+ struct ptr_info_def *pi = NULL;
+
+ /* If PTR has flow-sensitive points-to information, use it. */
+ if (TREE_CODE (ptr) == SSA_NAME
+ && (pi = SSA_NAME_PTR_INFO (ptr)) != NULL
+ && pi->name_mem_tag)
{
- /* If the pointer does not have a memory tag and aliases have not
- been computed yet, mark the statement as having volatile
- operands to prevent DOM from entering it in equivalence tables
- and DCE from killing it. */
- stmt_ann (stmt)->has_volatile_ops = true;
+ /* PTR has its own memory tag. Use it. */
+ add_stmt_operand (&pi->name_mem_tag, stmt, flags, prev_vops);
}
else
{
- struct ptr_info_def *pi = NULL;
-
- /* If we have computed aliasing already, check if PTR has
- flow-sensitive points-to information. */
- if (TREE_CODE (ptr) == SSA_NAME
- && (pi = SSA_NAME_PTR_INFO (ptr)) != NULL
- && pi->name_mem_tag)
+ /* If PTR is not an SSA_NAME or it doesn't have a name
+ tag, use its type memory tag. */
+ var_ann_t ann;
+
+ /* If we are emitting debugging dumps, display a warning if
+ PTR is an SSA_NAME with no flow-sensitive alias
+ information. That means that we may need to compute
+ aliasing again. */
+ if (dump_file
+ && TREE_CODE (ptr) == SSA_NAME
+ && pi == NULL)
{
- /* PTR has its own memory tag. Use it. */
- add_stmt_operand (&pi->name_mem_tag, stmt, flags, prev_vops);
+ fprintf (dump_file,
+ "NOTE: no flow-sensitive alias info for ");
+ print_generic_expr (dump_file, ptr, dump_flags);
+ fprintf (dump_file, " in ");
+ print_generic_stmt (dump_file, stmt, dump_flags);
}
- else
- {
- /* If PTR is not an SSA_NAME or it doesn't have a name
- tag, use its type memory tag. */
- var_ann_t ann;
-
- /* If we are emitting debugging dumps, display a warning if
- PTR is an SSA_NAME with no flow-sensitive alias
- information. That means that we may need to compute
- aliasing again. */
- if (dump_file
- && TREE_CODE (ptr) == SSA_NAME
- && pi == NULL)
- {
- fprintf (dump_file,
- "NOTE: no flow-sensitive alias info for ");
- print_generic_expr (dump_file, ptr, dump_flags);
- fprintf (dump_file, " in ");
- print_generic_stmt (dump_file, stmt, dump_flags);
- }
- if (TREE_CODE (ptr) == SSA_NAME)
- ptr = SSA_NAME_VAR (ptr);
- ann = var_ann (ptr);
- add_stmt_operand (&ann->type_mem_tag, stmt, flags, prev_vops);
- }
+ if (TREE_CODE (ptr) == SSA_NAME)
+ ptr = SSA_NAME_VAR (ptr);
+ ann = var_ann (ptr);
+ if (ann->type_mem_tag)
+ add_stmt_operand (&ann->type_mem_tag, stmt, flags, prev_vops);
}
}
else if (!(call_flags & (ECF_CONST | ECF_NORETURN)))
add_call_read_ops (stmt, prev_vops);
}
- else if (!aliases_computed_p)
- stmt_ann (stmt)->has_volatile_ops = true;
}
aliases = v_ann->may_aliases;
- /* If alias information hasn't been computed yet, then
- addressable variables will not be an alias tag nor will they
- have aliases. In this case, mark the statement as having
- volatile operands. */
- if (!aliases_computed_p && may_be_aliased (var))
- s_ann->has_volatile_ops = true;
-
if (aliases == NULL)
{
/* The variable is not aliased or it is an alias tag. */
NULL, /* next */
0, /* static_pass_number */
TV_TREE_PHIOPT, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
TV_TREE_PRE, /* tv_id */
- PROP_no_crit_edges | PROP_cfg | PROP_ssa,/* properties_required */
+ PROP_no_crit_edges | PROP_cfg
+ | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
TV_TREE_FRE, /* tv_id */
- PROP_no_crit_edges | PROP_cfg | PROP_ssa,/* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
static void
verify_alias_info (void)
{
- if (aliases_computed_p)
- {
- verify_flow_sensitive_alias_info ();
- verify_flow_insensitive_alias_info ();
- }
+ verify_flow_sensitive_alias_info ();
+ verify_flow_insensitive_alias_info ();
}
init_ssanames ();
init_phinodes ();
global_var = NULL_TREE;
- aliases_computed_p = false;
}
global_var = NULL_TREE;
BITMAP_XFREE (call_clobbered_vars);
call_clobbered_vars = NULL;
- aliases_computed_p = false;
BITMAP_XFREE (addressable_vars);
addressable_vars = NULL;
}
NULL, /* next */
0, /* static_pass_number */
0, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
0, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
NULL, /* next */
0, /* static_pass_number */
0, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */