[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 23/25: Improve make-vector compilation for known big siz
From: |
Andy Wingo |
Subject: |
[Guile-commits] 23/25: Improve make-vector compilation for known big sizes |
Date: |
Mon, 8 Jan 2018 09:25:05 -0500 (EST) |
wingo pushed a commit to branch master
in repository guile.
commit 55a8483435de094753b6c04a34a3942678f5c835
Author: Andy Wingo <address@hidden>
Date: Sun Jan 7 22:50:55 2018 +0100
Improve make-vector compilation for known big sizes
* module/language/tree-il/compile-cps.scm
(emit-initializations-as-loop): New helper.
(make-vector): Use new helper.
(make-vector/immediate): Emit a loop if the number of words is greater
than or equal to 32. An arbitrary limit that could be adjusted later.
---
module/language/tree-il/compile-cps.scm | 77 +++++++++++++++++++++------------
1 file changed, 49 insertions(+), 28 deletions(-)
diff --git a/module/language/tree-il/compile-cps.scm
b/module/language/tree-il/compile-cps.scm
index 6a9784a..a4f79b9 100644
--- a/module/language/tree-il/compile-cps.scm
+++ b/module/language/tree-il/compile-cps.scm
@@ -345,6 +345,25 @@
($continue k src
($primcall 'scm-set!/immediate `(vector . ,pos) (v val)))))))
+(define (emit-initializations-as-loop cps k src obj annotation start nwords
init)
+ (with-cps cps
+ (letv pos)
+ (letk kloop ,#f) ;; Patched later.
+ (letk kback
+ ($kargs () ()
+ ($continue kloop src
+ ($primcall 'uadd/immediate 1 (pos)))))
+ (letk kinit
+ ($kargs () ()
+ ($continue kback src
+ ($primcall 'scm-set! annotation (obj pos init)))))
+ (setk kloop
+ ($kargs ('pos) (pos)
+ ($branch k kinit src 'u64-< #f (pos nwords))))
+ (build-term
+ ($continue kloop src
+ ($primcall 'load-u64 start ())))))
+
(define-primcall-converter allocate-vector
(lambda (cps k src op param)
(define size param)
@@ -374,26 +393,13 @@
cps src op size 0 (target-max-vector-length)
(lambda (cps ssize)
(with-cps cps
- (letv usize nwords v w0-high w0 pos)
- (letk kloop ,#f) ;; Patched later.
+ (letv usize nwords v w0-high w0)
(letk kdone
($kargs () ()
($continue k src ($values (v)))))
- (letk kback
- ($kargs () ()
- ($continue kloop src
- ($primcall 'uadd/immediate 1 (pos)))))
- (letk kinit
- ($kargs () ()
- ($continue kback src
- ($primcall 'scm-set! 'vector (v pos init)))))
- (setk kloop
- ($kargs ('pos) (pos)
- ($branch kinit kdone src 'u64-< #f (usize pos))))
- (letk kbody
- ($kargs () ()
- ($continue kloop src
- ($primcall 'load-u64 1 ()))))
+ (let$ init-loop
+ (emit-initializations-as-loop kdone src v 'vector 1 nwords
init))
+ (letk kbody ($kargs () () ,init-loop))
(letk ktag2
($kargs ('w0) (w0)
($continue kbody src
@@ -425,17 +431,32 @@
(define size param)
(define nwords (1+ size))
(define (init-fields cps v pos kdone)
- (if (< pos nwords)
- (with-cps cps
- (let$ knext (init-fields v (1+ pos) kdone))
- (letk kinit
- ($kargs () ()
- ($continue knext src
- ($primcall 'scm-set!/immediate `(vector . ,pos)
- (v init)))))
- kinit)
- (with-cps cps
- kdone)))
+ ;; Inline the initializations, up to vectors of size 32. Above
+ ;; that it's a bit of a waste, so reify a loop instead.
+ (cond
+ ((<= 32 nwords)
+ (with-cps cps
+ (letv unwords)
+ (let$ init-loop
+ (emit-initializations-as-loop kdone src v 'vector
+ pos unwords init))
+ (letk kinit ($kargs ('unwords) (unwords) ,init-loop))
+ (letk kusize ($kargs () ()
+ ($continue kinit src
+ ($primcall 'load-u64 nwords ()))))
+ kusize))
+ ((< pos nwords)
+ (with-cps cps
+ (let$ knext (init-fields v (1+ pos) kdone))
+ (letk kinit
+ ($kargs () ()
+ ($continue knext src
+ ($primcall 'scm-set!/immediate `(vector . ,pos)
+ (v init)))))
+ kinit))
+ (else
+ (with-cps cps
+ kdone))))
(unless (and (exact-integer? size) (<= 0 size (target-max-vector-length)))
(error "precondition failed" size))
(with-cps cps
- [Guile-commits] 13/25: Add CPS compilation support for mutable-vector?, (continued)
- [Guile-commits] 13/25: Add CPS compilation support for mutable-vector?, Andy Wingo, 2018/01/08
- [Guile-commits] 24/25: Sync IP before allocating closures, Andy Wingo, 2018/01/08
- [Guile-commits] 19/25: Expand pair-related primcalls, Andy Wingo, 2018/01/08
- [Guile-commits] 16/25: Re-add compiler backend support for immutable vectors, Andy Wingo, 2018/01/08
- [Guile-commits] 25/25: Save VM compare result before calling out to hooks, Andy Wingo, 2018/01/08
- [Guile-commits] 01/25: Fix verify.scm for call-thunk/no-inline, Andy Wingo, 2018/01/08
- [Guile-commits] 22/25: Better compilation of vector constructors and initializers, Andy Wingo, 2018/01/08
- [Guile-commits] 08/25: Instruction explosion for /immediate variants of vector prims, Andy Wingo, 2018/01/08
- [Guile-commits] 06/25: Fix primitive reification for scm-set! / word-set!., Andy Wingo, 2018/01/08
- [Guile-commits] 17/25: Compiler frontend support for vector mutability checks, Andy Wingo, 2018/01/08
- [Guile-commits] 23/25: Improve make-vector compilation for known big sizes,
Andy Wingo <=
- [Guile-commits] 04/25: Make integer devirtualization less eager, Andy Wingo, 2018/01/08
- [Guile-commits] 02/25: Fix specialization of the allocate-words family of instructions, Andy Wingo, 2018/01/08
- [Guile-commits] 14/25: Fix bug in struct-ref effects analysis, Andy Wingo, 2018/01/08
- [Guile-commits] 20/25: Remove special optimizer and backend support for pairs, Andy Wingo, 2018/01/08