Skip to content

Commit dfa9ca4

Browse files
JeffBezansonN5N3
authored andcommitted
speed up variable lookups in lowering to help JuliaLang#48990
Replace some more linear lookups with hash tables.
1 parent 070eec7 commit dfa9ca4

File tree

2 files changed

+51
-46
lines changed

2 files changed

+51
-46
lines changed

src/julia-parser.scm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
((not (length> l 8))
5050
(eval `(lambda (x)
5151
(not (not (,(if (every symbol? l) 'memq 'memv) x (quote ,l)))))))
52-
((and (every symbol? l) (not (length> l 20)))
52+
((and (not (length> l 20)) (every symbol? l))
5353
(eval `(lambda (x)
5454
(not (not (memq x (quote ,l)))))))
5555
(else

src/julia-syntax.scm

Lines changed: 50 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3253,8 +3253,9 @@
32533253
((and (pair? e) (eq? (car e) 'with-static-parameters)) (free-vars- (cadr e) tab))
32543254
((or (atom? e) (quoted? e)) tab)
32553255
((eq? (car e) 'lambda)
3256-
(let ((bound (lambda-all-vars e)))
3257-
(for-each (lambda (v) (if (not (memq v bound)) (put! tab v #t)))
3256+
(let ((bound (table)))
3257+
(for-each (lambda (b) (put! bound b #t)) (lambda-all-vars e))
3258+
(for-each (lambda (v) (if (not (has? bound v)) (put! tab v #t)))
32583259
(free-vars (lam:body e))))
32593260
tab)
32603261
(else
@@ -3472,13 +3473,13 @@ f(x) = yt(x)
34723473

34733474
(define (convert-lambda lam fname interp capt-sp opaq)
34743475
(let ((body (add-box-inits-to-body
3475-
lam (cl-convert (cadddr lam) fname lam (table) (table) #f interp opaq))))
3476+
lam (cl-convert (cadddr lam) fname lam (table) (table) #f interp opaq (table) (vinfo-to-table (car (lam:vinfo lam)))))))
34763477
`(lambda ,(lam:args lam)
34773478
(,(clear-capture-bits (car (lam:vinfo lam)))
34783479
()
34793480
,(caddr (lam:vinfo lam))
34803481
,(delete-duplicates (append (lam:sp lam) capt-sp)))
3481-
,body)))
3482+
,body)))
34823483

34833484
;; renumber ssavalues assigned in an expr, allowing it to be repeated
34843485
(define (renumber-assigned-ssavalues e)
@@ -3539,10 +3540,10 @@ f(x) = yt(x)
35393540
;; declared types.
35403541
;; when doing this, the original value needs to be preserved, to
35413542
;; ensure the expression `a=b` always returns exactly `b`.
3542-
(define (convert-assignment var rhs0 fname lam interp opaq globals)
3543+
(define (convert-assignment var rhs0 fname lam interp opaq globals locals)
35433544
(cond
35443545
((symbol? var)
3545-
(let* ((vi (assq var (car (lam:vinfo lam))))
3546+
(let* ((vi (get locals var #f))
35463547
(cv (assq var (cadr (lam:vinfo lam))))
35473548
(vt (or (and vi (vinfo:type vi))
35483549
(and cv (vinfo:type cv))
@@ -3559,7 +3560,7 @@ f(x) = yt(x)
35593560
(make-ssavalue)))
35603561
(rhs (if (equal? vt '(core Any))
35613562
rhs1
3562-
(convert-for-type-decl rhs1 (cl-convert vt fname lam #f #f #f interp opaq))))
3563+
(convert-for-type-decl rhs1 (cl-convert vt fname lam #f #f #f interp opaq (table) locals))))
35633564
(ex (cond (closed `(call (core setfield!)
35643565
,(if interp
35653566
`($ ,var)
@@ -3678,8 +3679,9 @@ f(x) = yt(x)
36783679
const atomic null true false ssavalue isdefined toplevel module lambda
36793680
error gc_preserve_begin gc_preserve_end import using export inline noinline)))
36803681

3681-
(define (local-in? s lam)
3682-
(or (assq s (car (lam:vinfo lam)))
3682+
(define (local-in? s lam (tab #f))
3683+
(or (and tab (has? tab s))
3684+
(assq s (car (lam:vinfo lam)))
36833685
(assq s (cadr (lam:vinfo lam)))))
36843686

36853687
;; Try to identify never-undef variables, and then clear the `captured` flag for single-assigned,
@@ -3834,17 +3836,17 @@ f(x) = yt(x)
38343836
(define (toplevel-preserving? e)
38353837
(and (pair? e) (memq (car e) '(if elseif block trycatch tryfinally trycatchelse))))
38363838

3837-
(define (map-cl-convert exprs fname lam namemap defined toplevel interp opaq (globals (table)))
3839+
(define (map-cl-convert exprs fname lam namemap defined toplevel interp opaq (globals (table)) (locals (table)))
38383840
(if toplevel
38393841
(map (lambda (x)
38403842
(let ((tl (lift-toplevel (cl-convert x fname lam namemap defined
38413843
(and toplevel (toplevel-preserving? x))
3842-
interp opaq globals))))
3844+
interp opaq globals locals))))
38433845
(if (null? (cdr tl))
38443846
(car tl)
38453847
`(block ,@(cdr tl) ,(car tl)))))
38463848
exprs)
3847-
(map (lambda (x) (cl-convert x fname lam namemap defined #f interp opaq globals)) exprs)))
3849+
(map (lambda (x) (cl-convert x fname lam namemap defined #f interp opaq globals locals)) exprs)))
38483850

38493851
(define (prepare-lambda! lam)
38503852
;; mark all non-arguments as assigned, since locals that are never assigned
@@ -3853,11 +3855,11 @@ f(x) = yt(x)
38533855
(list-tail (car (lam:vinfo lam)) (length (lam:args lam))))
38543856
(lambda-optimize-vars! lam))
38553857

3856-
(define (cl-convert e fname lam namemap defined toplevel interp opaq (globals (table)))
3858+
(define (cl-convert e fname lam namemap defined toplevel interp opaq (globals (table)) (locals (table)))
38573859
(if (and (not lam)
38583860
(not (and (pair? e) (memq (car e) '(lambda method macro opaque_closure)))))
38593861
(if (atom? e) e
3860-
(cons (car e) (map-cl-convert (cdr e) fname lam namemap defined toplevel interp opaq globals)))
3862+
(cons (car e) (map-cl-convert (cdr e) fname lam namemap defined toplevel interp opaq globals locals)))
38613863
(cond
38623864
((symbol? e)
38633865
(define (new-undef-var name)
@@ -3876,12 +3878,12 @@ f(x) = yt(x)
38763878
(val (if (equal? typ '(core Any))
38773879
val
38783880
`(call (core typeassert) ,val
3879-
,(cl-convert typ fname lam namemap defined toplevel interp opaq globals)))))
3881+
,(cl-convert typ fname lam namemap defined toplevel interp opaq globals locals)))))
38803882
`(block
38813883
,@(if (eq? box access) '() `((= ,access ,box)))
38823884
,undefcheck
38833885
,val)))
3884-
(let ((vi (assq e (car (lam:vinfo lam))))
3886+
(let ((vi (get locals e #f))
38853887
(cv (assq e (cadr (lam:vinfo lam)))))
38863888
(cond ((eq? e fname) e)
38873889
((memq e (lam:sp lam)) e)
@@ -3908,15 +3910,15 @@ f(x) = yt(x)
39083910
e)
39093911
((=)
39103912
(let ((var (cadr e))
3911-
(rhs (cl-convert (caddr e) fname lam namemap defined toplevel interp opaq globals)))
3912-
(convert-assignment var rhs fname lam interp opaq globals)))
3913+
(rhs (cl-convert (caddr e) fname lam namemap defined toplevel interp opaq globals locals)))
3914+
(convert-assignment var rhs fname lam interp opaq globals locals)))
39133915
((local-def) ;; make new Box for local declaration of defined variable
3914-
(let ((vi (assq (cadr e) (car (lam:vinfo lam)))))
3916+
(let ((vi (get locals (cadr e) #f)))
39153917
(if (and vi (vinfo:asgn vi) (vinfo:capt vi))
39163918
`(= ,(cadr e) (call (core Box)))
39173919
'(null))))
39183920
((local) ;; convert local declarations to newvar statements
3919-
(let ((vi (assq (cadr e) (car (lam:vinfo lam)))))
3921+
(let ((vi (get locals (cadr e) #f)))
39203922
(if (and vi (vinfo:asgn vi) (vinfo:capt vi))
39213923
`(= ,(cadr e) (call (core Box)))
39223924
(if (vinfo:never-undef vi)
@@ -3927,12 +3929,12 @@ f(x) = yt(x)
39273929
e)
39283930
((atomic) e)
39293931
((const-if-global)
3930-
(if (local-in? (cadr e) lam)
3932+
(if (local-in? (cadr e) lam locals)
39313933
'(null)
39323934
`(const ,(cadr e))))
39333935
((isdefined) ;; convert isdefined expr to function for closure converted variables
39343936
(let* ((sym (cadr e))
3935-
(vi (and (symbol? sym) (assq sym (car (lam:vinfo lam)))))
3937+
(vi (and (symbol? sym) (get locals sym #f)))
39363938
(cv (and (symbol? sym) (assq sym (cadr (lam:vinfo lam))))))
39373939
(cond ((eq? sym fname) e)
39383940
((memq sym (lam:sp lam)) e)
@@ -3972,13 +3974,13 @@ f(x) = yt(x)
39723974
(lam2 (if short #f (cadddr e)))
39733975
(vis (if short '(() () ()) (lam:vinfo lam2)))
39743976
(cvs (map car (cadr vis)))
3975-
(local? (lambda (s) (and lam (symbol? s) (local-in? s lam))))
3977+
(local? (lambda (s) (and lam (symbol? s) (local-in? s lam locals))))
39763978
(local (and (not (outerref? (cadr e))) (local? name)))
39773979
(sig (and (not short) (caddr e)))
39783980
(sp-inits (if (or short (not (eq? (car sig) 'block)))
39793981
'()
39803982
(map-cl-convert (butlast (cdr sig))
3981-
fname lam namemap defined toplevel interp opaq globals)))
3983+
fname lam namemap defined toplevel interp opaq globals locals)))
39823984
(sig (and sig (if (eq? (car sig) 'block)
39833985
(last sig)
39843986
sig))))
@@ -4005,10 +4007,11 @@ f(x) = yt(x)
40054007
;; anonymous functions with keyword args generate global
40064008
;; functions that refer to the type of a local function
40074009
(rename-sig-types sig namemap)
4008-
fname lam namemap defined toplevel interp opaq globals)
4010+
fname lam namemap defined toplevel interp opaq globals locals)
40094011
,(let ((body (add-box-inits-to-body
40104012
lam2
4011-
(cl-convert (cadddr lam2) 'anon lam2 (table) (table) #f interp opaq))))
4013+
(cl-convert (cadddr lam2) 'anon lam2 (table) (table) #f interp opaq (table)
4014+
(vinfo-to-table (car (lam:vinfo lam2)))))))
40124015
`(lambda ,(cadr lam2)
40134016
(,(clear-capture-bits (car vis))
40144017
,@(cdr vis))
@@ -4019,7 +4022,7 @@ f(x) = yt(x)
40194022
(newlam (compact-and-renumber (linearize (car exprs)) 'none 0)))
40204023
`(toplevel-butfirst
40214024
(block ,@sp-inits
4022-
(method ,name ,(cl-convert sig fname lam namemap defined toplevel interp opaq globals)
4025+
(method ,name ,(cl-convert sig fname lam namemap defined toplevel interp opaq globals locals)
40234026
,(julia-bq-macro newlam)))
40244027
,@top-stmts))))
40254028

@@ -4122,7 +4125,7 @@ f(x) = yt(x)
41224125
(append (map (lambda (gs tvar)
41234126
(make-assignment gs `(call (core TypeVar) ',tvar (core Any))))
41244127
closure-param-syms closure-param-names)
4125-
`((method #f ,(cl-convert arg-defs fname lam namemap defined toplevel interp opaq globals)
4128+
`((method #f ,(cl-convert arg-defs fname lam namemap defined toplevel interp opaq globals locals)
41264129
,(convert-lambda lam2
41274130
(if iskw
41284131
(caddr (lam:args lam2))
@@ -4161,50 +4164,51 @@ f(x) = yt(x)
41614164
(begin
41624165
(put! defined name #t)
41634166
`(toplevel-butfirst
4164-
,(convert-assignment name mk-closure fname lam interp opaq globals)
4167+
,(convert-assignment name mk-closure fname lam interp opaq globals locals)
41654168
,@typedef
41664169
,@(map (lambda (v) `(moved-local ,v)) moved-vars)
41674170
,@sp-inits
41684171
,@mk-method))))))))
41694172
((lambda) ;; happens inside (thunk ...) and generated function bodies
41704173
(for-each (lambda (vi) (vinfo:set-asgn! vi #t))
41714174
(list-tail (car (lam:vinfo e)) (length (lam:args e))))
4175+
(lambda-optimize-vars! e)
41724176
(let ((body (map-cl-convert (cdr (lam:body e)) 'anon
4173-
(lambda-optimize-vars! e)
4177+
e
41744178
(table)
41754179
(table)
41764180
(null? (cadr e)) ;; only toplevel thunks have 0 args
4177-
interp opaq globals)))
4181+
interp opaq globals (vinfo-to-table (car (lam:vinfo e))))))
41784182
`(lambda ,(cadr e)
41794183
(,(clear-capture-bits (car (lam:vinfo e)))
41804184
() ,@(cddr (lam:vinfo e)))
41814185
(block ,@body))))
41824186
;; remaining `::` expressions are type assertions
41834187
((|::|)
4184-
(cl-convert `(call (core typeassert) ,@(cdr e)) fname lam namemap defined toplevel interp opaq globals))
4188+
(cl-convert `(call (core typeassert) ,@(cdr e)) fname lam namemap defined toplevel interp opaq globals locals))
41854189
;; remaining `decl` expressions are only type assertions if the
41864190
;; argument is global or a non-symbol.
41874191
((decl)
41884192
(cond ((and (symbol? (cadr e))
4189-
(local-in? (cadr e) lam))
4193+
(local-in? (cadr e) lam locals))
41904194
'(null))
41914195
(else
41924196
(cl-convert
4193-
(let ((ref (binding-to-globalref (cadr e))))
4194-
(if ref
4195-
(begin
4196-
(put! globals ref #t)
4197-
`(block
4198-
(toplevel-only set_binding_type! ,(cadr e))
4199-
(call (core set_binding_type!) ,(cadr ref) (inert ,(caddr ref)) ,(caddr e))))
4200-
`(call (core typeassert) ,@(cdr e))))
4201-
fname lam namemap defined toplevel interp opaq globals))))
4197+
(let ((ref (binding-to-globalref (cadr e))))
4198+
(if ref
4199+
(begin
4200+
(put! globals ref #t)
4201+
`(block
4202+
(toplevel-only set_binding_type! ,(cadr e))
4203+
(call (core set_binding_type!) ,(cadr ref) (inert ,(caddr ref)) ,(caddr e))))
4204+
`(call (core typeassert) ,@(cdr e))))
4205+
fname lam namemap defined toplevel interp opaq globals locals))))
42024206
;; `with-static-parameters` expressions can be removed now; used only by analyze-vars
42034207
((with-static-parameters)
4204-
(cl-convert (cadr e) fname lam namemap defined toplevel interp opaq globals))
4208+
(cl-convert (cadr e) fname lam namemap defined toplevel interp opaq globals locals))
42054209
(else
42064210
(cons (car e)
4207-
(map-cl-convert (cdr e) fname lam namemap defined toplevel interp opaq globals))))))))
4211+
(map-cl-convert (cdr e) fname lam namemap defined toplevel interp opaq globals locals))))))))
42084212

42094213
(define (closure-convert e) (cl-convert e #f #f (table) (table) #f #f #f))
42104214

@@ -4248,6 +4252,7 @@ f(x) = yt(x)
42484252
(current-loc #f)
42494253
(rett #f)
42504254
(global-const-error #f)
4255+
(vinfo-table (vinfo-to-table (car (lam:vinfo lam))))
42514256
(arg-map #f) ;; map arguments to new names if they are assigned
42524257
(label-counter 0) ;; counter for generating label addresses
42534258
(label-map (table)) ;; maps label names to generated addresses
@@ -4723,7 +4728,7 @@ f(x) = yt(x)
47234728
;; avoid duplicate newvar nodes
47244729
(if (and (not (and (pair? code) (equal? (car code) e)))
47254730
;; exclude deleted vars
4726-
(assq (cadr e) (car (lam:vinfo lam))))
4731+
(has? vinfo-table (cadr e)))
47274732
(emit e)
47284733
#f))
47294734
((global) ; keep global declarations as statements

0 commit comments

Comments
 (0)