From: Christophe R. <cr...@us...> - 2003-10-09 11:05:18
|
Update of /cvsroot/sbcl/sbcl/tests In directory sc8-pr-cvs1:/tmp/cvs-serv17770/tests Modified Files: compiler.pure.lisp Log Message: 0.8.4.12: I'm not proud of this. HEALTH WARNING: this may not work. It does for me, on Linux/PPC. If your sourceforge-fu is strong, please try it. HEALTH WARNING: this is ugly as sin. Unexported symbols, special assumptions, KLUDGEs thrown in with gay abandon. In partial mitigation, it does fix a bug :-) Fix for lying-to-the-compiler bug in UB32-STRENGTH-REDUCE-CONSTANT-MULTIPLY ... turn TRULY-THEs into suitable LOGANDs (inefficient in compile-time space; we only need one LOGAND wrapping the resulting form) ... likewise in x86 OPTIMIZE-MULTIPLY (even less efficient: constant mask is first :-) but that would be slow at runtime if we just left it there, so ... add - as a modular function (that was easy) ... add preliminary support for ASH as a modular function (for constant right shifts): ... delete ASH-RIGHT-[UN]SIGNED from the sparc backend (will be restored eventually, fear not, probably more cross-platformly) ... hack in special knowledge about ASH into CUT-TO-WIDTH ... ensure that all backends have a suitable VOP for translation of new ASH function ... (alpha version is 64bit, oh yes) ... don't forget out-of-line version (for xc also!) (aside: might we not need out-of-line versions of other modular functions in the xc?) Index: compiler.pure.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/tests/compiler.pure.lisp,v retrieving revision 1.66 retrieving revision 1.67 diff -u -d -r1.66 -r1.67 --- compiler.pure.lisp 9 Oct 2003 06:41:51 -0000 1.66 +++ compiler.pure.lisp 9 Oct 2003 11:05:12 -0000 1.67 @@ -675,3 +675,18 @@ (wum #'bbfn "hc3" (list))) r3533))) (compile nil '(lambda () (flet ((%f () (unwind-protect nil))) nil))) + +;;; the strength reduction of constant multiplication used (before +;;; sbcl-0.8.4.x) to lie to the compiler. This meant that, under +;;; certain circumstances, the compiler would derive that a perfectly +;;; reasonable multiplication never returned, causing chaos. Fixed by +;;; explicitly doing modular arithmetic, and relying on the backends +;;; being smart. +(assert (= (funcall + (compile nil + '(lambda (x) + (declare (type (integer 178956970 178956970) x) + (optimize speed)) + (* x 24))) + 178956970) + 4294967280)) |