Skip to content

Commit 5e4773b

Browse files
authored
speed up analyze-variables lowering pass by adding a hash table of variables (#43028)
1 parent 40ffd6f commit 5e4773b

File tree

1 file changed

+30
-22
lines changed

1 file changed

+30
-22
lines changed

src/julia-syntax.scm

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3120,14 +3120,20 @@
31203120
(define (free-vars e)
31213121
(table.keys (free-vars- e (table))))
31223122

3123-
(define (analyze-vars-lambda e env captvars sp new-sp (methsig #f))
3123+
(define (vinfo-to-table vi)
3124+
(let ((tab (table)))
3125+
(for-each (lambda (v) (put! tab (car v) v))
3126+
vi)
3127+
tab))
3128+
3129+
(define (analyze-vars-lambda e env captvars sp new-sp methsig tab)
31243130
(let* ((args (lam:args e))
31253131
(locl (caddr e))
31263132
(allv (nconc (map arg-name args) locl))
31273133
(fv (let* ((fv (diff (free-vars (lam:body e)) allv))
31283134
;; add variables referenced in declared types for free vars
31293135
(dv (apply nconc (map (lambda (v)
3130-
(let ((vi (var-info-for v env)))
3136+
(let ((vi (get tab v #f)))
31313137
(if vi (free-vars (vinfo:type vi)) '())))
31323138
fv))))
31333139
(append (diff dv fv) fv)))
@@ -3147,15 +3153,17 @@
31473153
(not (memq (vinfo:name v) new-sp))
31483154
(not (memq (vinfo:name v) glo))))
31493155
env)
3150-
(map make-var-info capt-sp))))
3151-
(analyze-vars (lam:body e)
3152-
(append vi
3156+
(map make-var-info capt-sp)))
3157+
(new-env (append vi
31533158
;; new environment: add our vars
31543159
(filter (lambda (v)
31553160
(and (not (memq (vinfo:name v) allv))
31563161
(not (memq (vinfo:name v) glo))))
3157-
env))
3158-
cv (delete-duplicates (append new-sp sp)))
3162+
env))))
3163+
(analyze-vars (lam:body e)
3164+
new-env
3165+
cv (delete-duplicates (append new-sp sp))
3166+
(vinfo-to-table new-env))
31593167
;; mark all the vars we capture as captured
31603168
(for-each (lambda (v) (vinfo:set-capt! v #t))
31613169
cv)
@@ -3170,36 +3178,36 @@
31703178
;; in-place to
31713179
;; (var-info-lst captured-var-infos ssavalues static_params)
31723180
;; where var-info-lst is a list of var-info records
3173-
(define (analyze-vars e env captvars sp)
3181+
(define (analyze-vars e env captvars sp tab)
31743182
(if (or (atom? e) (quoted? e))
31753183
(begin
31763184
(if (symbol? e)
3177-
(let ((vi (var-info-for e env)))
3185+
(let ((vi (get tab e #f)))
31783186
(if vi
31793187
(vinfo:set-read! vi #t))))
31803188
e)
31813189
(case (car e)
31823190
((local-def) ;; a local that we know has an assignment that dominates all usages
3183-
(let ((vi (var-info-for (cadr e) env)))
3191+
(let ((vi (get tab (cadr e) #f)))
31843192
(vinfo:set-never-undef! vi #t)))
31853193
((=)
3186-
(let ((vi (and (symbol? (cadr e)) (var-info-for (cadr e) env))))
3194+
(let ((vi (and (symbol? (cadr e)) (get tab (cadr e) #f))))
31873195
(if vi ; if local or captured
31883196
(begin (if (vinfo:asgn vi)
31893197
(vinfo:set-sa! vi #f)
31903198
(vinfo:set-sa! vi #t))
31913199
(vinfo:set-asgn! vi #t))))
3192-
(analyze-vars (caddr e) env captvars sp))
3200+
(analyze-vars (caddr e) env captvars sp tab))
31933201
((call)
3194-
(let ((vi (var-info-for (cadr e) env)))
3202+
(let ((vi (get tab (cadr e) #f)))
31953203
(if vi
31963204
(vinfo:set-called! vi #t))
3197-
(for-each (lambda (x) (analyze-vars x env captvars sp))
3205+
(for-each (lambda (x) (analyze-vars x env captvars sp tab))
31983206
(cdr e))))
31993207
((decl)
32003208
;; handle var::T declaration by storing the type in the var-info
32013209
;; record. for non-symbols or globals, emit a type assertion.
3202-
(let ((vi (var-info-for (cadr e) env)))
3210+
(let ((vi (get tab (cadr e) #f)))
32033211
(if vi
32043212
(begin (if (not (equal? (vinfo:type vi) '(core Any)))
32053213
(error (string "multiple type declarations for \""
@@ -3209,31 +3217,31 @@
32093217
"\" declared in inner scope")))
32103218
(vinfo:set-type! vi (caddr e))))))
32113219
((lambda)
3212-
(analyze-vars-lambda e env captvars sp '()))
3220+
(analyze-vars-lambda e env captvars sp '() #f tab))
32133221
((with-static-parameters)
32143222
;; (with-static-parameters func_expr sp_1 sp_2 ...)
32153223
(assert (eq? (car (cadr e)) 'lambda))
32163224
(analyze-vars-lambda (cadr e) env captvars sp
3217-
(cddr e)))
3225+
(cddr e) #f tab))
32183226
((method)
32193227
(if (length= e 2)
3220-
(let ((vi (var-info-for (method-expr-name e) env)))
3228+
(let ((vi (get tab (method-expr-name e) #f)))
32213229
(if vi
32223230
(begin (if (vinfo:asgn vi)
32233231
(vinfo:set-sa! vi #f)
32243232
(vinfo:set-sa! vi #t))
32253233
(vinfo:set-asgn! vi #t)))
32263234
e)
3227-
(begin (analyze-vars (caddr e) env captvars sp)
3235+
(begin (analyze-vars (caddr e) env captvars sp tab)
32283236
(assert (eq? (car (cadddr e)) 'lambda))
32293237
(analyze-vars-lambda (cadddr e) env captvars sp
32303238
(method-expr-static-parameters e)
3231-
(caddr e)))))
3239+
(caddr e) tab))))
32323240
((module toplevel) e)
3233-
(else (for-each (lambda (x) (analyze-vars x env captvars sp))
3241+
(else (for-each (lambda (x) (analyze-vars x env captvars sp tab))
32343242
(cdr e))))))
32353243

3236-
(define (analyze-variables! e) (analyze-vars e '() '() '()) e)
3244+
(define (analyze-variables! e) (analyze-vars e '() '() '() (table)) e)
32373245

32383246
;; pass 4: closure conversion
32393247

0 commit comments

Comments
 (0)