fix JIT bug related to locally bound flonums; merge to 4.2.4

svn: r17857
This commit is contained in:
Matthew Flatt 2010-01-27 23:22:23 +00:00
parent 3b5d13f229
commit 8733e7f233

View File

@ -1968,10 +1968,14 @@ static int no_sync_change(Scheme_Object *obj, int fuel)
fuel = no_sync_change(branch->tbranch, fuel);
return no_sync_change(branch->fbranch, fuel);
}
case scheme_toplevel_type:
case scheme_local_type:
if (SCHEME_GET_LOCAL_FLAGS(obj) == SCHEME_LOCAL_FLONUM)
return 0;
else
return fuel - 1;
case scheme_toplevel_type:
case scheme_local_unbox_type:
return fuel - 1;
return fuel - 1;
default:
if (t > _scheme_values_types_)
return fuel - 1;
@ -2274,8 +2278,13 @@ static int is_non_gc(Scheme_Object *obj, int depth)
case scheme_unclosed_procedure_type:
break;
case scheme_quote_syntax_type:
case scheme_local_type:
if (SCHEME_GET_LOCAL_FLAGS(obj) == SCHEME_LOCAL_FLONUM)
return 0;
return 1;
break;
case scheme_quote_syntax_type:
case scheme_local_unbox_type:
return 1;
break;
@ -2316,12 +2325,16 @@ static int is_relatively_constant_and_avoids_r1(Scheme_Object *obj, Scheme_Objec
t = SCHEME_TYPE(obj);
if (SAME_TYPE(t, scheme_local_type)) {
/* Must have clearing or other-clears flag set */
Scheme_Type t2 = SCHEME_TYPE(wrt);
if (t2 == scheme_local_type) {
/* If different local vars, then order doesn't matter */
if (SCHEME_LOCAL_POS(wrt) != SCHEME_LOCAL_POS(obj))
return 1;
/* Must have clearing, other-clears, or flonum flag set */
if (SCHEME_GET_LOCAL_FLAGS(obj) == SCHEME_LOCAL_FLONUM)
return 0;
else {
Scheme_Type t2 = SCHEME_TYPE(wrt);
if (t2 == scheme_local_type) {
/* If different local vars, then order doesn't matter */
if (SCHEME_LOCAL_POS(wrt) != SCHEME_LOCAL_POS(obj))
return 1;
}
}
}
@ -3905,10 +3918,12 @@ static int generate_app(Scheme_App_Rec *app, Scheme_Object **alt_rands, int num_
if (num_rands) {
/* Save rator where GC can see it */
Scheme_Type t;
t = SCHEME_TYPE((alt_rands
? alt_rands[1+args_already_in_place]
: app->args[1+args_already_in_place]));
if ((num_rands == 1) && (SAME_TYPE(scheme_local_type, t)
arg = (alt_rands
? alt_rands[1+args_already_in_place]
: app->args[1+args_already_in_place]);
t = SCHEME_TYPE(arg);
if ((num_rands == 1) && ((SAME_TYPE(scheme_local_type, t)
&& ((SCHEME_GET_LOCAL_FLAGS(arg) != SCHEME_LOCAL_FLONUM)))
|| (t >= _scheme_values_types_))) {
/* App of something complex to a local variable. We
can move the proc directly to V1. */