guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 09/12: Port prune-top-level-scopes pass to CPS2


From: Andy Wingo
Subject: [Guile-commits] 09/12: Port prune-top-level-scopes pass to CPS2
Date: Tue, 02 Jun 2015 08:33:54 +0000

wingo pushed a commit to branch master
in repository guile.

commit dd2e0f519d2b385a1d3665bc603fa6d77093380c
Author: Andy Wingo <address@hidden>
Date:   Sun May 24 18:24:49 2015 +0200

    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 +
 module/language/cps2/prune-top-level-scopes.scm |   63 +++++++++++++++++++++++
 3 files changed, 66 insertions(+), 0 deletions(-)

diff --git a/module/Makefile.am b/module/Makefile.am
index 5a14f09..d5a54e1 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 d5fb329..d59232f 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 0000000..002ffa4
--- /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)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]