fix optimizer on bitwise-and
The optimizer assumed a fixnum result if either argument to `bitwise-and` implies a fixnum result. That's not correct if the fixnum agument is negative. Thanks to Peter Samarin for a bug report. Merge to v6.7
This commit is contained in:
parent
a9f2765b4f
commit
9011fe7d83
|
@ -3387,6 +3387,20 @@
|
||||||
#t))
|
#t))
|
||||||
#f)
|
#f)
|
||||||
|
|
||||||
|
;; Make sure that `bitwise-and` is known to return a fixnum for non-negative
|
||||||
|
;; fixnum arguments but not for a negative one
|
||||||
|
|
||||||
|
(test-comp '(lambda (x)
|
||||||
|
(bitwise-ior (bitwise-and x 7) 1))
|
||||||
|
'(lambda (x)
|
||||||
|
(unsafe-fxior (bitwise-and x 7) 1)))
|
||||||
|
(test-comp '(lambda (x)
|
||||||
|
(bitwise-ior (bitwise-and x -7) 1))
|
||||||
|
'(lambda (x)
|
||||||
|
(unsafe-fxior (bitwise-and x -7) 1))
|
||||||
|
#f)
|
||||||
|
|
||||||
|
|
||||||
(test-comp `(lambda (x)
|
(test-comp `(lambda (x)
|
||||||
(thread (lambda () (set! x 5)))
|
(thread (lambda () (set! x 5)))
|
||||||
(if (pair? x)
|
(if (pair? x)
|
||||||
|
@ -6260,7 +6274,6 @@
|
||||||
(set! f f)
|
(set! f f)
|
||||||
((car f))))
|
((car f))))
|
||||||
|
|
||||||
|
|
||||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(report-errs)
|
(report-errs)
|
||||||
|
|
|
@ -3029,13 +3029,17 @@ static Scheme_Object *do_expr_implies_predicate(Scheme_Object *expr, Optimize_In
|
||||||
&& IS_NAMED_PRIM(app->rator, "bitwise-and")) {
|
&& IS_NAMED_PRIM(app->rator, "bitwise-and")) {
|
||||||
/* Assume that a fixnum argument to bitwise-and will never get lost,
|
/* Assume that a fixnum argument to bitwise-and will never get lost,
|
||||||
and so the validator will be able to confirm that a `bitwise-and`
|
and so the validator will be able to confirm that a `bitwise-and`
|
||||||
combination produces a fixnum. */
|
combination produces a fixnum if either argument is a literal,
|
||||||
|
nonnegative fixnum. */
|
||||||
if ((SCHEME_INTP(app->rand1)
|
if ((SCHEME_INTP(app->rand1)
|
||||||
|
&& (SCHEME_INT_VAL(app->rand1) >= 0)
|
||||||
&& IN_FIXNUM_RANGE_ON_ALL_PLATFORMS(SCHEME_INT_VAL(app->rand1)))
|
&& IN_FIXNUM_RANGE_ON_ALL_PLATFORMS(SCHEME_INT_VAL(app->rand1)))
|
||||||
|| (SCHEME_INTP(app->rand2)
|
|| (SCHEME_INTP(app->rand2)
|
||||||
&& IN_FIXNUM_RANGE_ON_ALL_PLATFORMS(SCHEME_INT_VAL(app->rand2))))
|
&& (SCHEME_INT_VAL(app->rand2) >= 0)
|
||||||
|
&& IN_FIXNUM_RANGE_ON_ALL_PLATFORMS(SCHEME_INT_VAL(app->rand2)))) {
|
||||||
return scheme_fixnum_p_proc;
|
return scheme_fixnum_p_proc;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (SCHEME_PRIMP(app->rator)
|
if (SCHEME_PRIMP(app->rator)
|
||||||
&& SCHEME_PRIM_PROC_OPT_FLAGS(app->rator) & SCHEME_PRIM_CLOSED_ON_REALS) {
|
&& SCHEME_PRIM_PROC_OPT_FLAGS(app->rator) & SCHEME_PRIM_CLOSED_ON_REALS) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user