3 (declare (simple-string s))
4 (declare (optimize (speed 3) (safety 0) (debug 0)))
7 (dotimes (i (length s))
8 (when (eql (aref s i) #\1)
12 * On X86 I is represented as a tagged integer.
15 3: SLOT S!11[EDX] {SB-C::VECTOR-LENGTH 1 7} => t23[EAX]
16 4: MOVE t23[EAX] => t24[EBX]
18 --------------------------------------------------------------------------------
21 (declare (optimize (speed 3) (safety 0) (space 2) (debug 0)))
22 (declare (type (simple-array double-float 1) v))
24 (declare (type double-float s))
25 (dotimes (i (length v))
26 (setq s (+ s (aref v i))))
29 * Python does not combine + with AREF, so generates extra move and
32 * On X86 Python thinks that all FP registers are directly accessible
33 and emits costy MOVE ... => FR1.
35 --------------------------------------------------------------------------------
38 (declare (optimize (speed 3) (safety 0) (space 2))
40 (let ((v (make-list n)))
41 (setq v (make-array n))
44 * IR1 does not optimize away (MAKE-LIST N).
45 --------------------------------------------------------------------------------
48 (declare (optimize (speed 3) (safety 0) (space 2))
49 (type (simple-array base-char 1) v1 v2))
50 (dotimes (i (length v1))
51 (setf (aref v2 i) (aref v1 i))))
53 VOP DATA-VECTOR-SET/SIMPLE-STRING V2!14[EDI] t32[EAX] t30[S2]>t33[CL]
55 MOV #<TN t33[CL]>, #<TN t30[S2]>
56 MOV BYTE PTR [EDI+EAX+1], #<TN t33[CL]>
57 MOV #<TN t35[AL]>, #<TN t33[CL]>
58 MOV #<TN t34[S2]>, #<TN t35[AL]>
60 * The value of DATA-VECTOR-SET is not used, so there is no need in the
64 --------------------------------------------------------------------------------
68 uses generic arithmetic
69 --------------------------------------------------------------------------------
71 09:49:05 <jtra> I have found a case in those where suboptimal code is
72 generate with nested loops, it might be moderately easy to fix that
74 http://www.bagley.org/~doug/shootout/bench/nestedloop/nestedloop.cmucl
75 09:50:30 <jtra> if you add declarations to dotimes, generated code is
76 almost optimal, but most inner loops run out of registers and use
77 memory location for iteration variable
79 ;;; -*- mode: lisp -*-
80 ;;; http://www.bagley.org/~doug/shootout/
81 ;;; from Friedrich Dominicus
84 (let ((n (parse-integer (or (car (last extensions:*command-line-strings*)) "1")))
88 (optimize (speed 3) (debug 0) (safety 0)))
97 --------------------------------------------------------------------------------
100 (declare (optimize speed (debug 0)))
101 (if (< x 0) x (foo (1- x))))
103 SBCL generates a full call of FOO (but CMUCL does not).
104 --------------------------------------------------------------------------------
107 (declare (optimize (speed 3) (safety 0) (debug 0)))
108 (declare (type (double-float 0d0 1d0) d))
109 (loop for i fixnum from 1 to 5
110 for x1 double-float = (sin d) ;;; !!!
111 do (loop for j fixnum from 1 to 4
112 sum x1 double-float)))
114 Without the marked declaration Python will use boxed representation for X1.
116 This is equivalent to
120 ;; use of X as DOUBLE-FLOAT
123 The initial binding is effectless, and without it X is of type
124 DOUBLE-FLOAT. Unhopefully, IR1 does not optimize away effectless
125 SETs/bindings, and IR2 does not perform type inference.
126 --------------------------------------------------------------------------------
127 #9 "Multi-path constant folding"
129 (if (= (cond ((irgh x) 0)
136 This code could be optimized to
139 (cond ((irgh x) :yes)
142 --------------------------------------------------------------------------------
144 (inverted variant of #9)
147 (let ((y (sap-alien x c-string)))
151 It could be optimized to
153 (lambda (x) (list x x))
155 (if Y were used only once, the current compiler would optimize it)
156 --------------------------------------------------------------------------------
158 (typep (truly-the (simple-array * (*)) x) 'simple-vector)
161 --------------------------------------------------------------------------------
163 FAST-+/FIXNUM and similar should accept unboxed arguments in interests
164 of representation selection. Problem: inter-TN dependencies.
165 --------------------------------------------------------------------------------