From 9ea8c9f4887f7d30c231903759644d59d25d0938 Mon Sep 17 00:00:00 2001
From: Peter Bex
Date: Wed, 23 Aug 2017 21:43:50 +0200
Subject: [PATCH] Rewrite vararg generic operators to dyadic ones
This allows for further optimizations because specialization rules are
only defined for dyadic versions of procedures, so even if all
argument types were known, vararg procedures would never be optimized
at all.
Now, even if not all types are known, we can at least specialize a few
intermediate operations.
---
c-platform.scm | 14 ++++++++++++--
optimizer.scm | 53 ++++++++++++++++++++++++++---------------------------
2 files changed, 38 insertions(+), 29 deletions(-)
diff --git a/c-platform.scm b/c-platform.scm
index 9f0554e7..864f371e 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -248,8 +248,6 @@
;;; Rewriting-definitions for this platform:
-(rewrite '+ 19 0 "C_fixnum_plus" "C_u_fixnum_plus" #f)
-
(let ()
;; (add1 ) -> (##core#inline "C_fixnum_increase" ) [fixnum-mode]
;; (add1 ) -> (##core#inline "C_u_fixnum_increase" ) [fixnum-mode + unsafe]
@@ -579,6 +577,10 @@
(rewrite 'abs 14 'fixnum 1 "C_fixnum_abs" "C_fixnum_abs")
+(rewrite 'chicken.bitwise#bitwise-and 19)
+(rewrite 'chicken.bitwise#bitwise-xor 19)
+(rewrite 'chicken.bitwise#bitwise-ior 19)
+
(rewrite 'chicken.bitwise#bitwise-and 21 -1 "C_fixnum_and" "C_u_fixnum_and" "C_s_a_i_bitwise_and" 5)
(rewrite 'chicken.bitwise#bitwise-xor 21 0 "C_fixnum_xor" "C_fixnum_xor" "C_s_a_i_bitwise_xor" 5)
(rewrite 'chicken.bitwise#bitwise-ior 21 0 "C_fixnum_or" "C_u_fixnum_or" "C_s_a_i_bitwise_ior" 5)
@@ -663,10 +665,18 @@
(rewrite 'lcm 12 '##sys#lcm #t 2)
(rewrite 'chicken.data-structures#identity 12 #f #t 1)
+(rewrite 'gcd 19)
+(rewrite 'lcm 19)
+
(rewrite 'gcd 18 0)
(rewrite 'lcm 18 1)
(rewrite 'list 18 '())
+(rewrite '+ 19)
+(rewrite '- 19)
+(rewrite '* 19)
+(rewrite '/ 19)
+
(rewrite '+ 16 2 "C_s_a_i_plus" #t 29)
(rewrite '- 16 2 "C_s_a_i_minus" #t 29)
(rewrite '* 16 2 "C_s_a_i_times" #t 33)
diff --git a/optimizer.scm b/optimizer.scm
index 67f92374..e7d773da 100644
--- a/optimizer.scm
+++ b/optimizer.scm
@@ -1224,35 +1224,34 @@
(intrinsic? name)
(make-node '##core#call (list #t) (list cont (qnode (first classargs))) ) ) )
- ;; () ->
- ;; ( ) ->
- ;; ( ...) -> (##core#inline (##core#inline ...)) [fixnum-mode]
- ;; ( ...) -> (##core#inline (##core#inline ...)) [fixnum-mode + unsafe]
- ;; - Remove "" from arguments.
- ((19) ; classargs = ( )
+ ;; ( ... ) -> ( ( ...) ) [in CPS]
+ ((19)
(and may-rewrite
(intrinsic? name)
- (let* ((id (first classargs))
- (fixop (if unsafe (third classargs) (second classargs)))
- (callargs
- (filter
- (lambda (x)
- (not (and (eq? 'quote (node-class x))
- (eq? id (first (node-parameters x))) ) ) )
- callargs) ) )
- (cond ((null? callargs) (make-node '##core#call (list #t) (list cont (qnode id))))
- ((null? (cdr callargs))
- (make-node '##core#call (list #t) (list cont (first callargs))) )
- ((or (fourth classargs) (eq? number-type 'fixnum))
- (make-node
- '##core#call (list #t)
- (list
- cont
- (fold-inner
- (lambda (x y)
- (make-node '##core#inline (list fixop) (list x y)) )
- callargs) ) ) )
- (else #f) ) ) ) )
+ (> (length callargs) 2)
+ (let ((callargs (reverse callargs)))
+ (let lp ((xn (car callargs))
+ (xn-1 (cadr callargs))
+ (rest (cddr callargs))
+ (cont cont))
+ (if (null? rest)
+ (make-node
+ '##core#call (list #t)
+ (list (varnode name) cont xn-1 xn))
+ (let ((r (gensym 'r))
+ (id (gensym 'va)))
+ (make-node
+ 'let (list id)
+ (list
+ (make-node
+ '##core#lambda (list id #t (list r) 0)
+ (list (make-node
+ '##core#call (list #t)
+ (list (varnode name) cont (varnode r) xn)) ) )
+ (lp xn-1
+ (car rest)
+ (cdr rest)
+ (varnode id) ))) )))) ) )
;; ( ...) -> (##core#inline ... (quote ) )
((20) ; classargs = ( )
--
2.11.0