mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
* module/language/cps/optimize.scm (cps-optimizations): * module/language/tree-il/optimize.scm (tree-il-optimizations): * module/system/base/optimize.scm (available-optimizations): Invert the dependency tree to hold the names and default optimization levels in a central place instead of in the optimizers. It moves definitions farther from uses, but it avoids us having to load the CPS optimizer if we don't need it, which improves bootstrap times.
77 lines
2.8 KiB
Scheme
77 lines
2.8 KiB
Scheme
;;; Optimization flags
|
|
|
|
;; Copyright (C) 2018, 2020 Free Software Foundation, Inc.
|
|
|
|
;;;; This library is free software; you can redistribute it and/or
|
|
;;;; modify it under the terms of the GNU Lesser General Public
|
|
;;;; License as published by the Free Software Foundation; either
|
|
;;;; version 3 of the License, or (at your option) any later version.
|
|
;;;;
|
|
;;;; This library is distributed in the hope that it will be useful,
|
|
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
;;;; Lesser General Public License for more details.
|
|
;;;;
|
|
;;;; You should have received a copy of the GNU Lesser General Public
|
|
;;;; License along with this library; if not, write to the Free Software
|
|
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
;;; Code:
|
|
|
|
(define-module (system base optimize)
|
|
#:use-module (ice-9 match)
|
|
#:export (available-optimizations
|
|
pass-optimization-level
|
|
optimizations-for-level))
|
|
|
|
(define* (available-optimizations #:optional lang-name)
|
|
(match lang-name
|
|
('tree-il
|
|
;; Avoid resolve-primitives until -O2, when CPS optimizations kick in.
|
|
;; Otherwise, inlining the primcalls during Tree-IL->CPS compilation
|
|
;; will result in a lot of code that will never get optimized nicely.
|
|
;; Similarly letrectification is great for generated code quality, but
|
|
;; as it gives the compiler more to work with, it increases compile
|
|
;; time enough that we reserve it for -O2. Also, this makes -O1 avoid
|
|
;; assumptions about top-level values, in the same way that avoiding
|
|
;; resolve-primitives does.
|
|
'((#:cps? 1)
|
|
(#:resolve-primitives? 2)
|
|
(#:expand-primitives? 1)
|
|
(#:letrectify? 2)
|
|
(#:seal-private-bindings? 3)
|
|
(#:partial-eval? 1)
|
|
(#:eta-expand? 2)))
|
|
('cps
|
|
'( ;; (#:split-rec? #t)
|
|
(#:simplify? 2)
|
|
(#:eliminate-dead-code? 2)
|
|
(#:prune-top-level-scopes? 2)
|
|
(#:contify? 2)
|
|
(#:specialize-primcalls? 2)
|
|
(#:peel-loops? 2)
|
|
(#:cse? 2)
|
|
(#:type-fold? 2)
|
|
(#:resolve-self-references? 2)
|
|
(#:devirtualize-integers? 2)
|
|
(#:specialize-numbers? 2)
|
|
(#:licm? 2)
|
|
(#:rotate-loops? 2)
|
|
;; This one is used by the slot allocator.
|
|
(#:precolor-calls? 2)))
|
|
(#f
|
|
(append (available-optimizations 'tree-il)
|
|
(available-optimizations 'cps)))))
|
|
|
|
(define (pass-optimization-level kw)
|
|
(match (assq kw (available-optimizations))
|
|
((kw level) level)
|
|
(_ (error "unknown optimization" kw))))
|
|
|
|
;; Turn on all optimizations unless -O0.
|
|
(define (optimizations-for-level level)
|
|
(let lp ((options (available-optimizations)))
|
|
(match options
|
|
(() '())
|
|
(((kw at-level) . options)
|
|
(cons* kw (<= at-level level) (lp options))))))
|