From 848bba80a3c9f92052e09bf1737a213233161bb2 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 7 Jul 2011 15:30:45 -0600 Subject: [PATCH] optimizer repair; `unsafe-c{a,d}r' can be dropped --- src/racket/src/list.c | 8 +++++--- src/racket/src/optimize.c | 6 ++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/racket/src/list.c b/src/racket/src/list.c index 4030f86e87..70951b03fb 100644 --- a/src/racket/src/list.c +++ b/src/racket/src/list.c @@ -724,11 +724,13 @@ scheme_init_unsafe_list (Scheme_Env *env) scheme_null->type = scheme_null_type; p = scheme_make_folding_prim(unsafe_car, "unsafe-car", 1, 1, 1); - SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + SCHEME_PRIM_PROC_FLAGS(p) |= (SCHEME_PRIM_IS_UNARY_INLINED + | SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); scheme_add_global_constant ("unsafe-car", p, env); p = scheme_make_folding_prim(unsafe_cdr, "unsafe-cdr", 1, 1, 1); - SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + SCHEME_PRIM_PROC_FLAGS(p) |= (SCHEME_PRIM_IS_UNARY_INLINED + | SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); scheme_add_global_constant ("unsafe-cdr", p, env); p = scheme_make_immed_prim(unsafe_mcar, "unsafe-mcar", 1, 1); @@ -748,7 +750,7 @@ scheme_init_unsafe_list (Scheme_Env *env) scheme_add_global_constant ("unsafe-set-mcdr!", p, env); p = scheme_make_immed_prim(unsafe_unbox, "unsafe-unbox", 1, 1); - SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; scheme_add_global_constant("unsafe-unbox", p, env); p = scheme_make_immed_prim(unsafe_unbox_star, "unsafe-unbox*", 1, 1); diff --git a/src/racket/src/optimize.c b/src/racket/src/optimize.c index 9f5a287c49..cf52296c68 100644 --- a/src/racket/src/optimize.c +++ b/src/racket/src/optimize.c @@ -390,6 +390,12 @@ int scheme_omittable_expr(Scheme_Object *o, int vals, int fuel, int resolved, note_match(1, vals, warn_info); if ((vals == 1) || (vals < 0)) { /* can omit an unsafe op */ + int i; + for (i = app->num_args; i--; ) { + if (!scheme_omittable_expr(app->args[i + 1], 1, fuel - 1, resolved, warn_info, + deeper_than + (resolved ? app->num_args : 0))) + return 0; + } return 1; } }