optimizer: remove argument of finish_optimize_application
The value of rator_flags was calculated in optimize_application and used in finish_optimize_application, but it is possible to calculate it directly in finish_optimize_application, and then remove some internal coupling. This also simplifies other locations where the rator of an application was changed and then it was necessary to recalculate the value of rator_flags to complete the optimization steps.
This commit is contained in:
parent
9ebfdb54e7
commit
85eee2bbbc
|
@ -2025,9 +2025,9 @@ int scheme_ir_duplicate_ok(Scheme_Object *fb, int cross_module)
|
||||||
/* applications, branches, sequences */
|
/* applications, branches, sequences */
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
|
|
||||||
static Scheme_Object *finish_optimize_application(Scheme_App_Rec *app, Optimize_Info *info, int context, int rator_flags);
|
static Scheme_Object *finish_optimize_application(Scheme_App_Rec *app, Optimize_Info *info, int context);
|
||||||
static Scheme_Object *finish_optimize_application2(Scheme_App2_Rec *app, Optimize_Info *info, int context, int rator_flags);
|
static Scheme_Object *finish_optimize_application2(Scheme_App2_Rec *app, Optimize_Info *info, int context);
|
||||||
static Scheme_Object *finish_optimize_application3(Scheme_App3_Rec *app, Optimize_Info *info, int context, int rator_flags);
|
static Scheme_Object *finish_optimize_application3(Scheme_App3_Rec *app, Optimize_Info *info, int context);
|
||||||
|
|
||||||
static Scheme_Object *try_optimize_fold(Scheme_Object *f, Scheme_Object *args, Scheme_Object *o, Optimize_Info *info)
|
static Scheme_Object *try_optimize_fold(Scheme_Object *f, Scheme_Object *args, Scheme_Object *o, Optimize_Info *info)
|
||||||
/* If `args` is NULL, extract arguments from `o` */
|
/* If `args` is NULL, extract arguments from `o` */
|
||||||
|
@ -2308,20 +2308,29 @@ static Scheme_Object *apply_inlined(Scheme_Lambda *lam, Optimize_Info *info,
|
||||||
return replace_tail_inside(p, le_prev, orig);
|
return replace_tail_inside(p, le_prev, orig);
|
||||||
}
|
}
|
||||||
|
|
||||||
int scheme_check_leaf_rator(Scheme_Object *le, int *_flags)
|
int scheme_check_leaf_rator(Scheme_Object *le)
|
||||||
{
|
{
|
||||||
if (le && SCHEME_PRIMP(le)) {
|
if (le && SCHEME_PRIMP(le)) {
|
||||||
int opt;
|
int opt;
|
||||||
opt = ((Scheme_Prim_Proc_Header *)le)->flags & SCHEME_PRIM_OPT_MASK;
|
opt = ((Scheme_Prim_Proc_Header *)le)->flags & SCHEME_PRIM_OPT_MASK;
|
||||||
if (opt >= SCHEME_PRIM_OPT_NONCM) {
|
if (opt >= SCHEME_PRIM_OPT_IMMEDIATE)
|
||||||
if (_flags)
|
return 1;
|
||||||
*_flags = (LAMBDA_PRESERVES_MARKS | LAMBDA_SINGLE_RESULT);
|
|
||||||
if (opt >= SCHEME_PRIM_OPT_IMMEDIATE) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int scheme_get_rator_flags(Scheme_Object *le)
|
||||||
|
{
|
||||||
|
if (SCHEME_PRIMP(le)) {
|
||||||
|
int opt;
|
||||||
|
opt = ((Scheme_Prim_Proc_Header *)le)->flags & SCHEME_PRIM_OPT_MASK;
|
||||||
|
if (opt >= SCHEME_PRIM_OPT_NONCM) {
|
||||||
|
return (LAMBDA_PRESERVES_MARKS | LAMBDA_SINGLE_RESULT);
|
||||||
|
}
|
||||||
|
} else if (SAME_TYPE(SCHEME_TYPE(le), scheme_ir_lambda_type)) {
|
||||||
|
Scheme_Lambda *lam = (Scheme_Lambda *)le;
|
||||||
|
return SCHEME_LAMBDA_FLAGS(lam);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2358,7 +2367,7 @@ int check_potential_size(Scheme_Object *var)
|
||||||
|
|
||||||
Scheme_Object *optimize_for_inline(Optimize_Info *info, Scheme_Object *le, int argc,
|
Scheme_Object *optimize_for_inline(Optimize_Info *info, Scheme_Object *le, int argc,
|
||||||
Scheme_App_Rec *app, Scheme_App2_Rec *app2, Scheme_App3_Rec *app3,
|
Scheme_App_Rec *app, Scheme_App2_Rec *app2, Scheme_App3_Rec *app3,
|
||||||
int *_flags, int context, int optimized_rator)
|
int context, int optimized_rator)
|
||||||
/* Zero or one of app, app2 and app3 should be non-NULL.
|
/* Zero or one of app, app2 and app3 should be non-NULL.
|
||||||
If app, we're inlining a general application. If app2, we're inlining an
|
If app, we're inlining a general application. If app2, we're inlining an
|
||||||
application with a single argument and if app3, we're inlining an
|
application with a single argument and if app3, we're inlining an
|
||||||
|
@ -2484,8 +2493,6 @@ Scheme_Object *optimize_for_inline(Optimize_Info *info, Scheme_Object *le, int a
|
||||||
if (noapp)
|
if (noapp)
|
||||||
return le;
|
return le;
|
||||||
|
|
||||||
*_flags = SCHEME_LAMBDA_FLAGS(lam);
|
|
||||||
|
|
||||||
if ((lam->num_params == argc)
|
if ((lam->num_params == argc)
|
||||||
|| ((SCHEME_LAMBDA_FLAGS(lam) & LAMBDA_HAS_REST)
|
|| ((SCHEME_LAMBDA_FLAGS(lam) & LAMBDA_HAS_REST)
|
||||||
&& (argc + 1 >= lam->num_params))) {
|
&& (argc + 1 >= lam->num_params))) {
|
||||||
|
@ -2557,7 +2564,7 @@ Scheme_Object *optimize_for_inline(Optimize_Info *info, Scheme_Object *le, int a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scheme_check_leaf_rator(le, _flags))
|
if (scheme_check_leaf_rator(le))
|
||||||
nonleaf = 0;
|
nonleaf = 0;
|
||||||
|
|
||||||
if (le && SCHEME_PROCP(le)) {
|
if (le && SCHEME_PROCP(le)) {
|
||||||
|
@ -3309,12 +3316,12 @@ static Scheme_Object *do_expr_implies_predicate(Scheme_Object *expr, Optimize_In
|
||||||
|
|
||||||
{
|
{
|
||||||
/* These tests are slower, so put them at the end */
|
/* These tests are slower, so put them at the end */
|
||||||
int flags, sub_context = 0;
|
int sub_context = 0;
|
||||||
if (!info)
|
if (!info)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (lookup_constant_proc(info, expr)
|
if (lookup_constant_proc(info, expr)
|
||||||
|| optimize_for_inline(info, expr, 1, NULL, NULL, NULL, &flags, sub_context, 1)){
|
|| optimize_for_inline(info, expr, 1, NULL, NULL, NULL, sub_context, 1)){
|
||||||
return scheme_procedure_p_proc;
|
return scheme_procedure_p_proc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3327,15 +3334,15 @@ static Scheme_Object *expr_implies_predicate(Scheme_Object *expr, Optimize_Info
|
||||||
return do_expr_implies_predicate(expr, info, NULL, 5, empty_eq_hash_tree);
|
return do_expr_implies_predicate(expr, info, NULL, 5, empty_eq_hash_tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Scheme_Object *finish_optimize_app(Scheme_Object *o, Optimize_Info *info, int context, int rator_flags)
|
static Scheme_Object *finish_optimize_app(Scheme_Object *o, Optimize_Info *info, int context)
|
||||||
{
|
{
|
||||||
switch(SCHEME_TYPE(o)) {
|
switch(SCHEME_TYPE(o)) {
|
||||||
case scheme_application_type:
|
case scheme_application_type:
|
||||||
return finish_optimize_application((Scheme_App_Rec *)o, info, context, rator_flags);
|
return finish_optimize_application((Scheme_App_Rec *)o, info, context);
|
||||||
case scheme_application2_type:
|
case scheme_application2_type:
|
||||||
return finish_optimize_application2((Scheme_App2_Rec *)o, info, context, rator_flags);
|
return finish_optimize_application2((Scheme_App2_Rec *)o, info, context);
|
||||||
case scheme_application3_type:
|
case scheme_application3_type:
|
||||||
return finish_optimize_application3((Scheme_App3_Rec *)o, info, context, rator_flags);
|
return finish_optimize_application3((Scheme_App3_Rec *)o, info, context);
|
||||||
default:
|
default:
|
||||||
return o; /* may be a constant due to constant-folding */
|
return o; /* may be a constant due to constant-folding */
|
||||||
}
|
}
|
||||||
|
@ -3450,7 +3457,7 @@ static Scheme_Object *optimize_application(Scheme_Object *o, Optimize_Info *info
|
||||||
{
|
{
|
||||||
Scheme_Object *le;
|
Scheme_Object *le;
|
||||||
Scheme_App_Rec *app;
|
Scheme_App_Rec *app;
|
||||||
int i, n, rator_apply_escapes = 0, rator_flags = 0, sub_context = 0;
|
int i, n, rator_apply_escapes = 0, sub_context = 0;
|
||||||
Optimize_Info_Sequence info_seq;
|
Optimize_Info_Sequence info_seq;
|
||||||
|
|
||||||
app = (Scheme_App_Rec *)o;
|
app = (Scheme_App_Rec *)o;
|
||||||
|
@ -3476,7 +3483,7 @@ static Scheme_Object *optimize_application(Scheme_Object *o, Optimize_Info *info
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
if (!i) {
|
if (!i) {
|
||||||
le = optimize_for_inline(info, app->args[i], n - 1, app, NULL, NULL, &rator_flags, context, 0);
|
le = optimize_for_inline(info, app->args[i], n - 1, app, NULL, NULL, context, 0);
|
||||||
if (le)
|
if (le)
|
||||||
return le;
|
return le;
|
||||||
}
|
}
|
||||||
|
@ -3512,7 +3519,7 @@ static Scheme_Object *optimize_application(Scheme_Object *o, Optimize_Info *info
|
||||||
|
|
||||||
if (!i) {
|
if (!i) {
|
||||||
/* Maybe found "((lambda" after optimizing; try again */
|
/* Maybe found "((lambda" after optimizing; try again */
|
||||||
le = optimize_for_inline(info, app->args[i], n - 1, app, NULL, NULL, &rator_flags, context, 1);
|
le = optimize_for_inline(info, app->args[i], n - 1, app, NULL, NULL, context, 1);
|
||||||
if (le)
|
if (le)
|
||||||
return le;
|
return le;
|
||||||
if (SAME_OBJ(app->args[0], scheme_values_proc)
|
if (SAME_OBJ(app->args[0], scheme_values_proc)
|
||||||
|
@ -3526,7 +3533,7 @@ static Scheme_Object *optimize_application(Scheme_Object *o, Optimize_Info *info
|
||||||
|
|
||||||
/* Check for (apply ... (list ...)) after some optimizations: */
|
/* Check for (apply ... (list ...)) after some optimizations: */
|
||||||
le = direct_apply((Scheme_Object *)app, app->args[0], app->args[app->num_args], info);
|
le = direct_apply((Scheme_Object *)app, app->args[0], app->args[app->num_args], info);
|
||||||
if (le) return finish_optimize_app(le, info, context, rator_flags);
|
if (le) return finish_optimize_app(le, info, context);
|
||||||
|
|
||||||
/* Convert (hash-ref '#hash... key (lambda () literal))
|
/* Convert (hash-ref '#hash... key (lambda () literal))
|
||||||
to (hash-ref '#hash... key literal) */
|
to (hash-ref '#hash... key literal) */
|
||||||
|
@ -3544,7 +3551,7 @@ static Scheme_Object *optimize_application(Scheme_Object *o, Optimize_Info *info
|
||||||
SCHEME_APPN_FLAGS(app) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
SCHEME_APPN_FLAGS(app) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return finish_optimize_application(app, info, context, rator_flags);
|
return finish_optimize_application(app, info, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int appn_flags(Scheme_Object *rator, Optimize_Info *info)
|
static int appn_flags(Scheme_Object *rator, Optimize_Info *info)
|
||||||
|
@ -3769,11 +3776,11 @@ static void increment_clocks_for_application(Optimize_Info *info,
|
||||||
info->sclock = s;
|
info->sclock = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Scheme_Object *finish_optimize_application(Scheme_App_Rec *app, Optimize_Info *info, int context, int rator_flags)
|
static Scheme_Object *finish_optimize_application(Scheme_App_Rec *app, Optimize_Info *info, int context)
|
||||||
{
|
{
|
||||||
Scheme_Object *le;
|
Scheme_Object *le;
|
||||||
Scheme_Object *rator = app->args[0];
|
Scheme_Object *rator = app->args[0];
|
||||||
int all_vals = 1, i, flags;
|
int all_vals = 1, i, flags, rator_flags;
|
||||||
|
|
||||||
for (i = app->num_args; i--; ) {
|
for (i = app->num_args; i--; ) {
|
||||||
if (SCHEME_TYPE(app->args[i+1]) < _scheme_ir_values_types_)
|
if (SCHEME_TYPE(app->args[i+1]) < _scheme_ir_values_types_)
|
||||||
|
@ -3797,6 +3804,7 @@ static Scheme_Object *finish_optimize_application(Scheme_App_Rec *app, Optimize_
|
||||||
return scheme_null;
|
return scheme_null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rator_flags = scheme_get_rator_flags(rator);
|
||||||
info->preserves_marks = !!(rator_flags & LAMBDA_PRESERVES_MARKS);
|
info->preserves_marks = !!(rator_flags & LAMBDA_PRESERVES_MARKS);
|
||||||
info->single_result = !!(rator_flags & LAMBDA_SINGLE_RESULT);
|
info->single_result = !!(rator_flags & LAMBDA_SINGLE_RESULT);
|
||||||
if (rator_flags & LAMBDA_RESULT_TENTATIVE) {
|
if (rator_flags & LAMBDA_RESULT_TENTATIVE) {
|
||||||
|
@ -3927,11 +3935,10 @@ static Scheme_Object *check_ignored_call_cc(Scheme_Object *rator, Scheme_Object
|
||||||
&& (IS_NAMED_PRIM(rator, "call-with-current-continuation")
|
&& (IS_NAMED_PRIM(rator, "call-with-current-continuation")
|
||||||
|| IS_NAMED_PRIM(rator, "call-with-composable-continuation")
|
|| IS_NAMED_PRIM(rator, "call-with-composable-continuation")
|
||||||
|| IS_NAMED_PRIM(rator, "call-with-escape-continuation"))) {
|
|| IS_NAMED_PRIM(rator, "call-with-escape-continuation"))) {
|
||||||
int rand_flags;
|
|
||||||
Scheme_Object *proc;
|
Scheme_Object *proc;
|
||||||
proc = lookup_constant_proc(info, rand);
|
proc = lookup_constant_proc(info, rand);
|
||||||
if (!proc)
|
if (!proc)
|
||||||
proc = optimize_for_inline(info, rand, 1, NULL, NULL, NULL, &rand_flags, context, 0);
|
proc = optimize_for_inline(info, rand, 1, NULL, NULL, NULL, context, 0);
|
||||||
|
|
||||||
if (proc && SAME_TYPE(SCHEME_TYPE(proc), scheme_ir_lambda_type)) {
|
if (proc && SAME_TYPE(SCHEME_TYPE(proc), scheme_ir_lambda_type)) {
|
||||||
Scheme_Lambda *lam = (Scheme_Lambda *)proc;
|
Scheme_Lambda *lam = (Scheme_Lambda *)proc;
|
||||||
|
@ -3967,9 +3974,7 @@ static Scheme_Object *make_optimize_prim_application2(Scheme_Object *prim, Schem
|
||||||
alt = make_application_2(prim, rand, info);
|
alt = make_application_2(prim, rand, info);
|
||||||
/* scheme_make_application may use constant folding, check that alt is not a constant */
|
/* scheme_make_application may use constant folding, check that alt is not a constant */
|
||||||
if (SAME_TYPE(SCHEME_TYPE(alt), scheme_application2_type)) {
|
if (SAME_TYPE(SCHEME_TYPE(alt), scheme_application2_type)) {
|
||||||
int rator_flags = 0;
|
return finish_optimize_application2((Scheme_App2_Rec *)alt, info, context);
|
||||||
scheme_check_leaf_rator(prim, &rator_flags);
|
|
||||||
return finish_optimize_application2((Scheme_App2_Rec *)alt, info, context, rator_flags);
|
|
||||||
} else
|
} else
|
||||||
return alt;
|
return alt;
|
||||||
}
|
}
|
||||||
|
@ -3979,7 +3984,7 @@ static Scheme_Object *optimize_application2(Scheme_Object *o, Optimize_Info *inf
|
||||||
{
|
{
|
||||||
Scheme_App2_Rec *app;
|
Scheme_App2_Rec *app;
|
||||||
Scheme_Object *le;
|
Scheme_Object *le;
|
||||||
int rator_flags = 0, rator_apply_escapes, sub_context, ty;
|
int rator_apply_escapes, sub_context, ty;
|
||||||
Optimize_Info_Sequence info_seq;
|
Optimize_Info_Sequence info_seq;
|
||||||
|
|
||||||
app = (Scheme_App2_Rec *)o;
|
app = (Scheme_App2_Rec *)o;
|
||||||
|
@ -3992,7 +3997,7 @@ static Scheme_Object *optimize_application2(Scheme_Object *o, Optimize_Info *inf
|
||||||
if (le)
|
if (le)
|
||||||
return le;
|
return le;
|
||||||
|
|
||||||
le = optimize_for_inline(info, app->rator, 1, NULL, app, NULL, &rator_flags, context, 0);
|
le = optimize_for_inline(info, app->rator, 1, NULL, app, NULL, context, 0);
|
||||||
if (le)
|
if (le)
|
||||||
return le;
|
return le;
|
||||||
|
|
||||||
|
@ -4009,7 +4014,7 @@ static Scheme_Object *optimize_application2(Scheme_Object *o, Optimize_Info *inf
|
||||||
|
|
||||||
{
|
{
|
||||||
/* Maybe found "((lambda" after optimizing; try again */
|
/* Maybe found "((lambda" after optimizing; try again */
|
||||||
le = optimize_for_inline(info, app->rator, 1, NULL, app, NULL, &rator_flags, context, 1);
|
le = optimize_for_inline(info, app->rator, 1, NULL, app, NULL, context, 1);
|
||||||
if (le)
|
if (le)
|
||||||
return le;
|
return le;
|
||||||
rator_apply_escapes = info->escapes;
|
rator_apply_escapes = info->escapes;
|
||||||
|
@ -4038,12 +4043,12 @@ static Scheme_Object *optimize_application2(Scheme_Object *o, Optimize_Info *inf
|
||||||
SCHEME_APPN_FLAGS(app) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
SCHEME_APPN_FLAGS(app) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return finish_optimize_application2(app, info, context, rator_flags);
|
return finish_optimize_application2(app, info, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Scheme_Object *finish_optimize_application2(Scheme_App2_Rec *app, Optimize_Info *info, int context, int rator_flags)
|
static Scheme_Object *finish_optimize_application2(Scheme_App2_Rec *app, Optimize_Info *info, int context)
|
||||||
{
|
{
|
||||||
int flags;
|
int flags, rator_flags;
|
||||||
Scheme_Object *rator = app->rator;
|
Scheme_Object *rator = app->rator;
|
||||||
Scheme_Object *rand, *inside = NULL, *alt;
|
Scheme_Object *rand, *inside = NULL, *alt;
|
||||||
|
|
||||||
|
@ -4072,6 +4077,7 @@ static Scheme_Object *finish_optimize_application2(Scheme_App2_Rec *app, Optimiz
|
||||||
|
|
||||||
increment_clocks_for_application(info, rator, 1);
|
increment_clocks_for_application(info, rator, 1);
|
||||||
|
|
||||||
|
rator_flags = scheme_get_rator_flags(rator);
|
||||||
info->preserves_marks = !!(rator_flags & LAMBDA_PRESERVES_MARKS);
|
info->preserves_marks = !!(rator_flags & LAMBDA_PRESERVES_MARKS);
|
||||||
info->single_result = !!(rator_flags & LAMBDA_SINGLE_RESULT);
|
info->single_result = !!(rator_flags & LAMBDA_SINGLE_RESULT);
|
||||||
if (rator_flags & LAMBDA_RESULT_TENTATIVE) {
|
if (rator_flags & LAMBDA_RESULT_TENTATIVE) {
|
||||||
|
@ -4242,8 +4248,7 @@ static Scheme_Object *finish_optimize_application2(Scheme_App2_Rec *app, Optimiz
|
||||||
if (pred && SAME_OBJ(pred, scheme_fixnum_p_proc)) {
|
if (pred && SAME_OBJ(pred, scheme_fixnum_p_proc)) {
|
||||||
new = (Scheme_App3_Rec *)make_application_3(scheme_unsafe_fx_eq_proc, app->rand, scheme_make_integer(0), info);
|
new = (Scheme_App3_Rec *)make_application_3(scheme_unsafe_fx_eq_proc, app->rand, scheme_make_integer(0), info);
|
||||||
SCHEME_APPN_FLAGS(new) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
SCHEME_APPN_FLAGS(new) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
||||||
scheme_check_leaf_rator(scheme_unsafe_fx_eq_proc, &rator_flags);
|
return finish_optimize_application3(new, info, context);
|
||||||
return finish_optimize_application3(new, info, context, rator_flags);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4338,8 +4343,7 @@ static Scheme_Object *finish_optimize_application2(Scheme_App2_Rec *app, Optimiz
|
||||||
scheme_make_integer(SCHEME_PROC_SHAPE_MODE(alt) >> STRUCT_PROC_SHAPE_SHIFT),
|
scheme_make_integer(SCHEME_PROC_SHAPE_MODE(alt) >> STRUCT_PROC_SHAPE_SHIFT),
|
||||||
info);
|
info);
|
||||||
SCHEME_APPN_FLAGS(new) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
SCHEME_APPN_FLAGS(new) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
||||||
scheme_check_leaf_rator(scheme_unsafe_struct_ref_proc, &rator_flags);
|
return finish_optimize_application3(new, info, context);
|
||||||
return finish_optimize_application3(new, info, context, rator_flags);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4364,7 +4368,7 @@ static Scheme_Object *optimize_application3(Scheme_Object *o, Optimize_Info *inf
|
||||||
{
|
{
|
||||||
Scheme_App3_Rec *app;
|
Scheme_App3_Rec *app;
|
||||||
Scheme_Object *le;
|
Scheme_Object *le;
|
||||||
int rator_flags = 0, rator_apply_escapes, sub_context, ty, flags;
|
int rator_apply_escapes, sub_context, ty, flags;
|
||||||
Optimize_Info_Sequence info_seq;
|
Optimize_Info_Sequence info_seq;
|
||||||
|
|
||||||
app = (Scheme_App3_Rec *)o;
|
app = (Scheme_App3_Rec *)o;
|
||||||
|
@ -4392,7 +4396,7 @@ static Scheme_Object *optimize_application3(Scheme_Object *o, Optimize_Info *inf
|
||||||
if (le)
|
if (le)
|
||||||
return le;
|
return le;
|
||||||
|
|
||||||
le = optimize_for_inline(info, app->rator, 2, NULL, NULL, app, &rator_flags, context, 0);
|
le = optimize_for_inline(info, app->rator, 2, NULL, NULL, app, context, 0);
|
||||||
if (le)
|
if (le)
|
||||||
return le;
|
return le;
|
||||||
|
|
||||||
|
@ -4409,7 +4413,7 @@ static Scheme_Object *optimize_application3(Scheme_Object *o, Optimize_Info *inf
|
||||||
|
|
||||||
{
|
{
|
||||||
/* Maybe found "((lambda" after optimizing; try again */
|
/* Maybe found "((lambda" after optimizing; try again */
|
||||||
le = optimize_for_inline(info, app->rator, 2, NULL, NULL, app, &rator_flags, context, 1);
|
le = optimize_for_inline(info, app->rator, 2, NULL, NULL, app, context, 1);
|
||||||
if (le)
|
if (le)
|
||||||
return le;
|
return le;
|
||||||
rator_apply_escapes = info->escapes;
|
rator_apply_escapes = info->escapes;
|
||||||
|
@ -4457,7 +4461,7 @@ static Scheme_Object *optimize_application3(Scheme_Object *o, Optimize_Info *inf
|
||||||
|
|
||||||
/* Check for (apply ... (list ...)) after some optimizations: */
|
/* Check for (apply ... (list ...)) after some optimizations: */
|
||||||
le = direct_apply((Scheme_Object *)app, app->rator, app->rand2, info);
|
le = direct_apply((Scheme_Object *)app, app->rator, app->rand2, info);
|
||||||
if (le) return finish_optimize_app(le, info, context, rator_flags);
|
if (le) return finish_optimize_app(le, info, context);
|
||||||
|
|
||||||
flags = appn_flags(app->rator, info);
|
flags = appn_flags(app->rator, info);
|
||||||
SCHEME_APPN_FLAGS(app) |= flags;
|
SCHEME_APPN_FLAGS(app) |= flags;
|
||||||
|
@ -4467,12 +4471,12 @@ static Scheme_Object *optimize_application3(Scheme_Object *o, Optimize_Info *inf
|
||||||
SCHEME_APPN_FLAGS(app) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
SCHEME_APPN_FLAGS(app) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return finish_optimize_application3(app, info, context, rator_flags);
|
return finish_optimize_application3(app, info, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Scheme_Object *finish_optimize_application3(Scheme_App3_Rec *app, Optimize_Info *info, int context, int rator_flags)
|
static Scheme_Object *finish_optimize_application3(Scheme_App3_Rec *app, Optimize_Info *info, int context)
|
||||||
{
|
{
|
||||||
int flags;
|
int flags, rator_flags;
|
||||||
Scheme_Object *le;
|
Scheme_Object *le;
|
||||||
int all_vals = 1;
|
int all_vals = 1;
|
||||||
|
|
||||||
|
@ -4608,7 +4612,6 @@ static Scheme_Object *finish_optimize_application3(Scheme_App3_Rec *app, Optimiz
|
||||||
if (pred_new) {
|
if (pred_new) {
|
||||||
app->rator = pred_new;
|
app->rator = pred_new;
|
||||||
SCHEME_APPN_FLAGS(app) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
SCHEME_APPN_FLAGS(app) |= (APPN_FLAG_IMMED | APPN_FLAG_SFS_TAIL);
|
||||||
scheme_check_leaf_rator(pred_new, &rator_flags);
|
|
||||||
|
|
||||||
/* eq? and eqv? are foldable */
|
/* eq? and eqv? are foldable */
|
||||||
if (all_vals) {
|
if (all_vals) {
|
||||||
|
@ -4620,6 +4623,7 @@ static Scheme_Object *finish_optimize_application3(Scheme_App3_Rec *app, Optimiz
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rator_flags = scheme_get_rator_flags(app->rator);
|
||||||
info->preserves_marks = !!(rator_flags & LAMBDA_PRESERVES_MARKS);
|
info->preserves_marks = !!(rator_flags & LAMBDA_PRESERVES_MARKS);
|
||||||
info->single_result = !!(rator_flags & LAMBDA_SINGLE_RESULT);
|
info->single_result = !!(rator_flags & LAMBDA_SINGLE_RESULT);
|
||||||
if (rator_flags & LAMBDA_RESULT_TENTATIVE) {
|
if (rator_flags & LAMBDA_RESULT_TENTATIVE) {
|
||||||
|
@ -4838,11 +4842,10 @@ Scheme_Object *scheme_optimize_apply_values(Scheme_Object *f, Scheme_Object *e,
|
||||||
Scheme_Object *rev = f;
|
Scheme_Object *rev = f;
|
||||||
|
|
||||||
if (rev) {
|
if (rev) {
|
||||||
int rator2_flags;
|
|
||||||
Scheme_Object *o_f;
|
Scheme_Object *o_f;
|
||||||
o_f = lookup_constant_proc(info, rev);
|
o_f = lookup_constant_proc(info, rev);
|
||||||
if (!o_f)
|
if (!o_f)
|
||||||
o_f = optimize_for_inline(info, rev, 1, NULL, NULL, NULL, &rator2_flags, context, 0);
|
o_f = optimize_for_inline(info, rev, 1, NULL, NULL, NULL, context, 0);
|
||||||
|
|
||||||
if (o_f) {
|
if (o_f) {
|
||||||
f_is_proc = rev;
|
f_is_proc = rev;
|
||||||
|
|
|
@ -3117,7 +3117,7 @@ static Scheme_Object *unresolve_lambda(Scheme_Lambda *rlam, Unresolve_Info *ui)
|
||||||
|
|
||||||
static void check_nonleaf_rator(Scheme_Object *rator, Unresolve_Info *ui)
|
static void check_nonleaf_rator(Scheme_Object *rator, Unresolve_Info *ui)
|
||||||
{
|
{
|
||||||
if (!scheme_check_leaf_rator(rator, NULL))
|
if (!scheme_check_leaf_rator(rator))
|
||||||
ui->has_non_leaf = 1;
|
ui->has_non_leaf = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3310,7 +3310,7 @@ Scheme_Object *scheme_unresolve(Scheme_Object *, int argv, int *_has_cases,
|
||||||
Scheme_Object *from_modidx, Scheme_Object *to_modidx);
|
Scheme_Object *from_modidx, Scheme_Object *to_modidx);
|
||||||
Scheme_Object *scheme_unresolve_top(Scheme_Object *, Comp_Prefix **, int comp_flags);
|
Scheme_Object *scheme_unresolve_top(Scheme_Object *, Comp_Prefix **, int comp_flags);
|
||||||
|
|
||||||
int scheme_check_leaf_rator(Scheme_Object *le, int *_flags);
|
int scheme_check_leaf_rator(Scheme_Object *le);
|
||||||
|
|
||||||
int scheme_is_ir_lambda(Scheme_Object *o, int can_be_closed, int can_be_liftable);
|
int scheme_is_ir_lambda(Scheme_Object *o, int can_be_closed, int can_be_liftable);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user