From dd2e0f519d2b385a1d3665bc603fa6d77093380c Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Sun, 24 May 2015 18:24:49 +0200 Subject: [PATCH] Port prune-top-level-scopes pass to CPS2 * module/language/cps2/prune-top-level-scopes.scm: Port to CPS2. * module/language/cps2/optimize.scm: Enable prune-top-level-scopes pass. * module/Makefile.am (CPS2_LANG_SOURCES): Add prune-top-level-scopes.scm. --- module/Makefile.am | 1 + module/language/cps2/optimize.scm | 2 + .../language/cps2/prune-top-level-scopes.scm | 63 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 module/language/cps2/prune-top-level-scopes.scm diff --git a/module/Makefile.am b/module/Makefile.am index 5a14f090d..d5a54e1be 100644 --- a/module/Makefile.am +++ b/module/Makefile.am @@ -151,6 +151,7 @@ CPS2_LANG_SOURCES = \ language/cps2/compile-cps.scm \ language/cps2/dce.scm \ language/cps2/effects-analysis.scm \ + language/cps2/prune-top-level-scopes.scm \ language/cps2/renumber.scm \ language/cps2/optimize.scm \ language/cps2/simplify.scm \ diff --git a/module/language/cps2/optimize.scm b/module/language/cps2/optimize.scm index d5fb329fb..d59232fde 100644 --- a/module/language/cps2/optimize.scm +++ b/module/language/cps2/optimize.scm @@ -25,6 +25,7 @@ (define-module (language cps2 optimize) #:use-module (ice-9 match) #:use-module (language cps2 dce) + #:use-module (language cps2 prune-top-level-scopes) #:use-module (language cps2 simplify) #:export (optimize)) @@ -53,6 +54,7 @@ ;; analysis on the box created for the set!. (run-pass! eliminate-dead-code #:dce2? #t) + (run-pass! prune-top-level-scopes #:prune-top-level-scopes? #t) (run-pass! simplify #:simplify? #t) program) diff --git a/module/language/cps2/prune-top-level-scopes.scm b/module/language/cps2/prune-top-level-scopes.scm new file mode 100644 index 000000000..002ffa486 --- /dev/null +++ b/module/language/cps2/prune-top-level-scopes.scm @@ -0,0 +1,63 @@ +;;; Continuation-passing style (CPS) intermediate language (IL) + +;; Copyright (C) 2014, 2015 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 + +;;; Commentary: +;;; +;;; A simple pass to prune unneeded top-level scopes. +;;; +;;; Code: + +(define-module (language cps2 prune-top-level-scopes) + #:use-module (ice-9 match) + #:use-module (language cps2) + #:use-module (language cps2 utils) + #:use-module (language cps intmap) + #:use-module (language cps intset) + #:export (prune-top-level-scopes)) + +(define (compute-used-scopes conts constants) + (persistent-intset + (intmap-fold + (lambda (label cont used-scopes) + (match cont + (($ $kargs _ _ + ($ $continue k src + ($ $primcall 'cached-toplevel-box (scope name bound?)))) + (intset-add! used-scopes (intmap-ref constants scope))) + (_ + used-scopes))) + conts + empty-intset))) + +(define (prune-top-level-scopes conts) + (let* ((constants (compute-constant-values conts)) + (used-scopes (compute-used-scopes conts constants))) + (intmap-map + (lambda (label cont) + (match cont + (($ $kargs names vars + ($ $continue k src + ($ $primcall 'cache-current-module! + (module (? (lambda (scope) + (let ((val (intmap-ref constants scope))) + (not (intset-ref used-scopes val))))))))) + (build-cont ($kargs names vars + ($continue k src ($primcall 'values ()))))) + (_ + cont))) + conts)))