18437bb54a1c908b4811e9c824f69ab62cac246a
[sbcl.git] / src / compiler / policies.lisp
1 ;;;; aimed optimization qualities
2
3 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; more information.
5 ;;;;
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; files for more information.
11
12 (in-package "SB!C")
13
14 (define-optimization-quality check-constant-modification
15     safety
16   ("no" "maybe" "yes" "yes")
17   "Control whether the compiler should check for constant
18 modification. Defaults to SAFETY.")
19
20 (define-optimization-quality type-check
21     ;; FIXME: grepping the tree for "policy.*safety" yields some
22     ;; places which might want to use this instead -- or
23     ;; some other derived policy.
24     (cond ((= safety 0) 0)
25           ((and (< safety 2) (< safety speed)) 2)
26           (t 3))
27   ("no" "maybe" "weak" "full")
28   "Control the way to perform runtime type checking:
29 0: declared types are simply trusted; no runtime checks are performed;
30 2: fast checks are performed: declared types are weakened to
31    FIXNUM/SINGLE-FLOAT/FLOAT/NUMBER/structure/specialized array etc.;
32 3: declared types are fully checked (several exceptions exist;
33    see \"SBCL User Manual\", Compiler->Handling of Types->
34    Implementation Limitations for details).")
35
36 (define-optimization-quality check-tag-existence
37     (cond ((= safety 0) 0)
38           (t 3))
39   ("no" "maybe" "yes" "yes")
40   "Control whether GO and RETURN-FROM check liveness of the destination tag.
41 Enabling this option can increase heap consing of closures.")
42
43 (define-optimization-quality let-conversion
44     (if (<= debug speed) 3 0)
45   ("off" "maybe" "on" "on")
46   "Control inline-substitution of used-once local functions.")
47
48 (define-optimization-quality rest-conversion
49     (if (= debug 3) 0 3)
50   ("off" "maybe" "on" "on")
51   "Control conversion of &REST argments to &MORE arguments when
52 only used as the final argument to APPLY.")
53
54 (define-optimization-quality alien-funcall-saves-fp-and-pc
55     (if (<= speed debug) 3 0)
56   ("no" "maybe" "yes" "yes")
57   "Control ALIEN-FUNCALL saving frame-pointer and program counter for
58 more reliable bactracing across foreign calls.")
59
60 (define-optimization-quality verify-arg-count
61     (if (zerop safety) 0 3)
62   ("no" "maybe" "yes" "yes"))
63
64 (define-optimization-quality merge-tail-calls
65     (if (or (> space debug)
66             (> speed debug))
67         3
68         0)
69   ("no" "maybe" "yes" "yes")
70   "Control whether tail-calls should reuse caller stack frame.
71 Enabling this option make functions use less stack space, and make
72 tail-recursive functions execute in constant stack, but debugging
73 become harder, because backtraces show only part of function call
74 sequence.
75
76 This options has no effect when INSERT-DEBUG-CATCH is set.")
77
78 (define-optimization-quality insert-debug-catch
79     (if (> debug (max speed space))
80         3
81         0)
82   ("no" "maybe" "yes" "yes")
83   "Enable possibility of returning from stack frames with the debugger.
84
85 Enabling this option effectively disables MERGE-TAIL-CALLS.")
86
87 (define-optimization-quality recognize-self-calls
88     (if (> (max speed space) debug)
89         3
90         0)
91   ("no" "maybe" "yes" "yes")
92   "When enabled, reference to a function FOO inside the body of (DEFUN
93 FOO ...) is considered to be the reference to the function being
94 defined. Calls to FOO are compiled as local. This allows better
95 optimization and type checking, but TRACE will not show recursive
96 calls. If the function object is bound to another name BAR, and FOO is
97 bound to another function, calls to FOO inside BAR will remain to be
98 recursive.
99
100 When disabled, internal references to a function FOO will be
101 considered ti be a call of a function, bound to the symbol at
102 run-time, which is less efficient. TRACE will show recursive calls. In
103 case of renaming described above, calls to FOO will not be recursive
104 and will refer to the new function, bound to FOO.")
105
106 (define-optimization-quality float-accuracy
107     3
108   ("degraded" "full" "full" "full"))
109
110 (define-optimization-quality insert-step-conditions
111     (if (> debug (max speed space compilation-speed))
112         debug
113         0)
114   ("no" "no" "partial" "full")
115   "Control instrumentation of code, enabling single-stepping through
116 it in the debugger.
117
118 This option has no effect without COMPUTE-DEBUG-FUN.")
119
120 (define-optimization-quality compute-debug-fun
121     debug
122   ("no" "minimal" "yes" "yes"))
123
124 (define-optimization-quality preserve-single-use-debug-variables
125     (if (and (>= debug 2)
126              (< speed 3))
127         3
128         0)
129   ("no" "no" "no" "yes")
130   "When disabled, LET variable, which is never set and is referenced
131 exactly once, is eliminated and the reference is substituted with the
132 initial value. This allows better type inference and some algebraic
133 optimizations.
134
135 When enabled, the variable is preserved and can be seen in the
136 debugger.")
137
138 (define-optimization-quality insert-array-bounds-checks
139     (if (= safety 0) 0 3)
140   ("no" "yes" "yes" "yes"))
141
142 (define-optimization-quality store-xref-data
143     (if (= space 3)
144         0
145         3)
146   ("no" "yes" "yes" "yes"))
147
148 (define-optimization-quality store-coverage-data
149     0
150   ("no" "no" "yes" "yes"))