in the middle of squashing labels
This commit is contained in:
parent
11f461886a
commit
72392a7a4c
|
@ -4,7 +4,8 @@
|
||||||
"lexical-structs.rkt"
|
"lexical-structs.rkt"
|
||||||
(prefix-in ufind: "../union-find.rkt")
|
(prefix-in ufind: "../union-find.rkt")
|
||||||
racket/list)
|
racket/list)
|
||||||
|
(require/typed "../logger.rkt"
|
||||||
|
[log-debug (String -> Void)])
|
||||||
(provide optimize-il)
|
(provide optimize-il)
|
||||||
|
|
||||||
;; perform optimizations on the intermediate language.
|
;; perform optimizations on the intermediate language.
|
||||||
|
@ -17,7 +18,168 @@
|
||||||
;; For now, replace pairs of PushEnvironment / AssignImmediate(0, ...)
|
;; For now, replace pairs of PushEnvironment / AssignImmediate(0, ...)
|
||||||
;; We should do some more optimizations here, like peephole...
|
;; We should do some more optimizations here, like peephole...
|
||||||
(let* ([statements (filter not-no-op? statements)])
|
(let* ([statements (filter not-no-op? statements)])
|
||||||
(let loop ([statements statements])
|
(flatten-adjacent-labels
|
||||||
|
(eliminate-no-ops statements))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(: flatten-adjacent-labels ((Listof Statement) -> (Listof Statement)))
|
||||||
|
;; Squash adjacent labels together.
|
||||||
|
(define (flatten-adjacent-labels statements)
|
||||||
|
(cond
|
||||||
|
[(empty? statements)
|
||||||
|
empty]
|
||||||
|
[else
|
||||||
|
|
||||||
|
;; The first pass through will collect adjacent labels and equate them.
|
||||||
|
(define a-forest (ufind:new-forest))
|
||||||
|
(let: loop : 'ok ([stmts : (Listof Statement) (rest statements)]
|
||||||
|
[last-stmt : Statement (first statements)])
|
||||||
|
(cond
|
||||||
|
[(empty? stmts)
|
||||||
|
'ok]
|
||||||
|
[else
|
||||||
|
(define next-stmt (first stmts))
|
||||||
|
(cond
|
||||||
|
[(and (symbol? last-stmt) (symbol? next-stmt))
|
||||||
|
(log-debug (format "merging label ~a and ~a" last-stmt next-stmt))
|
||||||
|
(ufind:union-set a-forest last-stmt next-stmt)
|
||||||
|
(loop (rest stmts) next-stmt)]
|
||||||
|
[else
|
||||||
|
(loop (rest stmts) next-stmt)])]))
|
||||||
|
|
||||||
|
|
||||||
|
(: ref (Symbol -> Symbol))
|
||||||
|
(define (ref a-label)
|
||||||
|
(ufind:find-set a-forest a-label))
|
||||||
|
|
||||||
|
|
||||||
|
(: rewrite-target (Target -> Target))
|
||||||
|
(define (rewrite-target target)
|
||||||
|
;; fixme
|
||||||
|
target)
|
||||||
|
|
||||||
|
(: rewrite-oparg (OpArg -> OpArg))
|
||||||
|
(define (rewrite-oparg oparg)
|
||||||
|
;; fixme
|
||||||
|
oparg)
|
||||||
|
|
||||||
|
(: rewrite-primop (PrimitiveOperator -> PrimitiveOperator))
|
||||||
|
(define (rewrite-primop op)
|
||||||
|
;; fixme
|
||||||
|
op)
|
||||||
|
|
||||||
|
(: rewrite-primcmd (PrimitiveCommand -> PrimitiveCommand))
|
||||||
|
(define (rewrite-primcmd cmd)
|
||||||
|
;; fixme
|
||||||
|
cmd)
|
||||||
|
|
||||||
|
(: rewrite-primtest (PrimitiveTest -> PrimitiveTest))
|
||||||
|
(define (rewrite-primtest test)
|
||||||
|
;; fixme
|
||||||
|
test)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;; The second pass will then rewrite references of labels.
|
||||||
|
(let: loop : (Listof Statement) ([stmts : (Listof Statement) statements])
|
||||||
|
(cond
|
||||||
|
[(empty? stmts)
|
||||||
|
empty]
|
||||||
|
[else
|
||||||
|
(define a-stmt (first stmts))
|
||||||
|
(cond
|
||||||
|
[(symbol? a-stmt)
|
||||||
|
(cond
|
||||||
|
[(eq? (ref a-stmt) a-stmt)
|
||||||
|
(cons (ref a-stmt) (loop (rest stmts)))]
|
||||||
|
[else
|
||||||
|
(loop (rest stmts))])]
|
||||||
|
|
||||||
|
[(LinkedLabel? a-stmt)
|
||||||
|
(cons (make-LinkedLabel (LinkedLabel-label a-stmt)
|
||||||
|
(ref (LinkedLabel-linked-to a-stmt)))
|
||||||
|
(loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(DebugPrint? a-stmt)
|
||||||
|
(cons a-stmt (loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(Comment? a-stmt)
|
||||||
|
(cons a-stmt (loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(AssignImmediateStatement? a-stmt)
|
||||||
|
(cons (make-AssignImmediateStatement (rewrite-target (AssignImmediateStatement-target a-stmt))
|
||||||
|
(rewrite-oparg (AssignImmediateStatement-value a-stmt)))
|
||||||
|
(loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(AssignPrimOpStatement? a-stmt)
|
||||||
|
(cons (make-AssignPrimOpStatement (rewrite-target (AssignPrimOpStatement-target a-stmt))
|
||||||
|
(rewrite-primop (AssignPrimOpStatement-op a-stmt)))
|
||||||
|
(loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(PerformStatement? a-stmt)
|
||||||
|
(cons (make-PerformStatement (rewrite-primcmd (PerformStatement-op a-stmt)))
|
||||||
|
(loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(PopEnvironment? a-stmt)
|
||||||
|
(cons (make-PopEnvironment (rewrite-oparg (PopEnvironment-n a-stmt))
|
||||||
|
(rewrite-oparg (PopEnvironment-skip a-stmt)))
|
||||||
|
(loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(PushEnvironment? a-stmt)
|
||||||
|
(cons a-stmt (loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(PushImmediateOntoEnvironment? a-stmt)
|
||||||
|
(cons (make-PushImmediateOntoEnvironment (rewrite-oparg (PushImmediateOntoEnvironment-value a-stmt))
|
||||||
|
(PushImmediateOntoEnvironment-box? a-stmt))
|
||||||
|
(loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(PushControlFrame/Generic? a-stmt)
|
||||||
|
(cons a-stmt (loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(PushControlFrame/Call? a-stmt)
|
||||||
|
(define a-label (PushControlFrame/Call-label a-stmt))
|
||||||
|
(cons (make-PushControlFrame/Call
|
||||||
|
(make-LinkedLabel (LinkedLabel-label a-label)
|
||||||
|
(ref (LinkedLabel-linked-to a-label))))
|
||||||
|
(loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(PushControlFrame/Prompt? a-stmt)
|
||||||
|
(define a-label (PushControlFrame/Prompt-label a-stmt))
|
||||||
|
(cons (make-PushControlFrame/Prompt (let ([tag (PushControlFrame/Prompt-tag a-stmt)])
|
||||||
|
(if (DefaultContinuationPromptTag? tag)
|
||||||
|
tag
|
||||||
|
(rewrite-oparg tag)))
|
||||||
|
(make-LinkedLabel (LinkedLabel-label a-label)
|
||||||
|
(ref (LinkedLabel-linked-to a-label))))
|
||||||
|
(loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(PopControlFrame? a-stmt)
|
||||||
|
(cons a-stmt (loop (rest stmts)))]
|
||||||
|
|
||||||
|
[(GotoStatement? a-stmt)
|
||||||
|
(define target (GotoStatement-target a-stmt))
|
||||||
|
(cond
|
||||||
|
[(Label? target)
|
||||||
|
(cons (make-GotoStatement (make-Label (ref (Label-name target))))
|
||||||
|
(loop (rest stmts)))]
|
||||||
|
[else
|
||||||
|
(cons a-stmt (loop (rest stmts)))])]
|
||||||
|
|
||||||
|
|
||||||
|
[(TestAndJumpStatement? a-stmt)
|
||||||
|
(cons (make-TestAndJumpStatement (rewrite-primtest (TestAndJumpStatement-op a-stmt))
|
||||||
|
(ref (TestAndJumpStatement-label a-stmt)))
|
||||||
|
(loop (rest stmts)))])]))]))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(: eliminate-no-ops ((Listof Statement) -> (Listof Statement)))
|
||||||
|
(define (eliminate-no-ops statements)
|
||||||
|
(let loop ([statements statements])
|
||||||
(cond
|
(cond
|
||||||
[(empty? statements)
|
[(empty? statements)
|
||||||
empty]
|
empty]
|
||||||
|
@ -25,8 +187,7 @@
|
||||||
(let ([first-stmt (first statements)])
|
(let ([first-stmt (first statements)])
|
||||||
(: default (-> (Listof Statement)))
|
(: default (-> (Listof Statement)))
|
||||||
(define (default)
|
(define (default)
|
||||||
(cons first-stmt
|
(cons first-stmt (loop (rest statements))))
|
||||||
(loop (rest statements))))
|
|
||||||
(cond
|
(cond
|
||||||
[(empty? (rest statements))
|
[(empty? (rest statements))
|
||||||
(default)]
|
(default)]
|
||||||
|
@ -47,8 +208,8 @@
|
||||||
[else
|
[else
|
||||||
(default)]))]
|
(default)]))]
|
||||||
[else
|
[else
|
||||||
(default)]))]))]))))
|
(default)]))]))])))
|
||||||
|
|
||||||
|
|
||||||
(: not-no-op? (Statement -> Boolean))
|
(: not-no-op? (Statement -> Boolean))
|
||||||
(define (not-no-op? stmt) (not (no-op? stmt)))
|
(define (not-no-op? stmt) (not (no-op? stmt)))
|
||||||
|
@ -106,7 +267,7 @@
|
||||||
[(PopControlFrame? stmt)
|
[(PopControlFrame? stmt)
|
||||||
#f]
|
#f]
|
||||||
[(Comment? stmt)
|
[(Comment? stmt)
|
||||||
#f]))
|
#t]))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user