tree-optimize.c (init_tree_optimization_passes): Schedule pass_may_alias right after the program is renamed into SSA.

* 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.


testsuite/ChangeLog

	* 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.

From-SVN: r85255
This commit is contained in:
Diego Novillo 2004-07-28 05:13:10 +00:00 committed by Diego Novillo
parent 58907cda07
commit c1b763fa9a
22 changed files with 150 additions and 139 deletions

View File

@ -1,3 +1,30 @@
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

View File

@ -1,3 +1,12 @@
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.

View File

@ -32,8 +32,8 @@ get_alias_set (t)
}
}
/* 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"} } */

View File

@ -23,5 +23,5 @@ blah (int arf)
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"} } */

View File

@ -1,5 +1,5 @@
/* { 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
@ -11,6 +11,5 @@ threading(int a,int b)
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"} } */

View File

@ -321,6 +321,7 @@ init_tree_optimization_passes (void)
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);

View File

@ -2213,7 +2213,7 @@ struct tree_opt_pass pass_del_ssa =
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 */

View File

@ -76,6 +76,7 @@ struct tree_opt_pass
#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)

View File

@ -2118,7 +2118,7 @@ struct tree_opt_pass pass_sra =
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 */

View File

@ -175,13 +175,6 @@ bitmap call_clobbered_vars;
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
@ -350,9 +343,6 @@ compute_may_aliases (void)
/* 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 =
@ -365,7 +355,7 @@ 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
@ -379,6 +369,7 @@ static struct alias_info *
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 ();
@ -417,14 +408,8 @@ init_alias_info (void)
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. */
@ -450,12 +435,13 @@ init_alias_info (void)
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;
}
@ -1375,47 +1361,64 @@ setup_pointers_and_addressables (struct alias_info *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 ((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);
/* 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);
/* 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;
/* 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 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);
/* 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);
/* 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);
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;
}
}
}
}

View File

@ -245,7 +245,7 @@ struct tree_opt_pass pass_ccp =
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 */
@ -2704,7 +2704,7 @@ struct tree_opt_pass pass_fold_builtins =
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 */

View File

@ -391,7 +391,7 @@ struct tree_opt_pass pass_rename_ssa_copies =
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 */

View File

@ -908,7 +908,7 @@ struct tree_opt_pass pass_dce =
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 */
@ -924,7 +924,7 @@ struct tree_opt_pass pass_cd_dce =
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 */

View File

@ -692,7 +692,7 @@ struct tree_opt_pass pass_dominator =
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 */

View File

@ -437,7 +437,8 @@ struct tree_opt_pass pass_dse = {
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 */

View File

@ -517,7 +517,8 @@ struct tree_opt_pass pass_forwprop = {
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 */

View File

@ -340,7 +340,7 @@ struct tree_opt_pass pass_ch =
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 */

View File

@ -1137,13 +1137,6 @@ get_asm_expr_operands (tree stmt, voperands_t prev_vops)
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;
}
}
@ -1159,53 +1152,42 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags,
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 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 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 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);
}
}
@ -1272,8 +1254,6 @@ get_call_expr_operands (tree stmt, tree expr, voperands_t 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;
}
@ -1348,13 +1328,6 @@ add_stmt_operand (tree *var_p, tree stmt, int flags, voperands_t prev_vops)
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. */

View File

@ -669,7 +669,7 @@ struct tree_opt_pass pass_phiopt =
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 */

View File

@ -2076,7 +2076,8 @@ struct tree_opt_pass pass_pre =
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 */
@ -2107,7 +2108,7 @@ struct tree_opt_pass pass_fre =
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 */

View File

@ -505,11 +505,8 @@ err:
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 ();
}
@ -677,7 +674,6 @@ init_tree_ssa (void)
init_ssanames ();
init_phinodes ();
global_var = NULL_TREE;
aliases_computed_p = false;
}
@ -710,7 +706,6 @@ delete_tree_ssa (void)
global_var = NULL_TREE;
BITMAP_XFREE (call_clobbered_vars);
call_clobbered_vars = NULL;
aliases_computed_p = false;
BITMAP_XFREE (addressable_vars);
addressable_vars = NULL;
}
@ -1211,7 +1206,7 @@ struct tree_opt_pass pass_redundant_phi =
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 */

View File

@ -937,7 +937,7 @@ struct tree_opt_pass pass_tail_recursion =
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 */
@ -953,7 +953,7 @@ struct tree_opt_pass pass_tail_calls =
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 */