Commit Graph

2 Commits

Author SHA1 Message Date
Matthew Flatt
c9701b1d7c tweak to tree-reduce memoization
original commit: 5d1deee09b4ccf13e58df4d9487b4e87589e334c
2017-12-21 07:24:57 -07:00
Matthew Flatt
3ba909f3c6 avoid quadratics in call-live information
Using a tree representation enables sharing to avoid a quadratic-sized
compiled form and intermediate quadtraic-time/space representations
for a program like this one, where there are N calls each with an
average of N/2 live variables:

 (define vars
   (let loop ([i 10000])
     (cond
      [(zero? i) '()]
      [else (cons (gensym) (loop (sub1 i)))])))

 (time
  (begin
   (compile
    `(lambda ,vars
       ,@(map (lambda (v) `(,v)) vars)))
   (void)))

Keeping the variables in tree form (since they're already collected
that way) and memoizing reduces on the tree allows sharing to be
constructed and preserved. The tree approach persists even to the
runtime mask for live variables.

original commit: 35942accb14d1226189605548a9e05ca95e3f0b6
2017-12-21 05:34:11 -07:00