summaryrefslogtreecommitdiffstats
path: root/stdlib
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-04-10 16:04:37 -0700
committerKaz Kylheku <kaz@kylheku.com>2023-04-10 16:04:37 -0700
commit8943016ffc30123525ebf29ad52f8d5a5efbf703 (patch)
tree0eae0b06785ec0a074a5ce5fab0617901694fc99 /stdlib
parent75de9fe1552d923a3a7b95ff4cd4966aeaf1de3b (diff)
downloadtxr-8943016ffc30123525ebf29ad52f8d5a5efbf703.tar.gz
txr-8943016ffc30123525ebf29ad52f8d5a5efbf703.tar.bz2
txr-8943016ffc30123525ebf29ad52f8d5a5efbf703.zip
compiler: keep track of multiple defs in live-info.
* stdlib/optimize.tl (live-info): Slot def replaced by def0 and def1. (basic-blocks local-liveness): The local function def becomes defs: it can take two defs. These become def0 and def1. In the catch instruction case, we use both arguments, capture the resulting live-info and use it to call refs. (basic-blocks rename): Check whether either def0 or def1 is the source or destination.
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/optimize.tl39
1 files changed, 22 insertions, 17 deletions
diff --git a/stdlib/optimize.tl b/stdlib/optimize.tl
index 6a70cb6c..88099fa7 100644
--- a/stdlib/optimize.tl
+++ b/stdlib/optimize.tl
@@ -29,7 +29,7 @@
(defstruct live-info nil
(defined 0)
(used 0)
- def)
+ def0 def1)
(defstruct basic-block (live-info)
(live 0)
@@ -167,18 +167,24 @@
(regnums (regs)
(mappend (do when-match
(t @num) @1 (list num)) regs))
- (def (li insn def)
+ (defs (li insn def0 : def1)
(set [bb.li-hash insn] li)
- (let* ((dn (regnum def))
- (dmask (if dn (mask dn))))
+ (let* ((dn0 (regnum def0))
+ (dn1 (regnum def1))
+ (dmask0 (if dn0 (mask dn0) 0))
+ (dmask1 (if dn1 (mask dn1) 0))
+ (dmask (logior dmask0 dmask1)))
(cond
- (dn (set li.def def)
- (new live-info
- used (logand li.used (lognot dmask))
- defined (logior li.defined dmask)))
+ ((nzerop dmask)
+ (set li.def0 def0)
+ (set li.def1 def1)
+ (new live-info
+ used (logand li.used (lognot dmask))
+ defined (logior li.defined dmask)))
(t (prog1
(copy li)
- (set li.def def))))))
+ (set li.def0 def0)
+ (set li.def1 def1))))))
(refs (li insn . refs)
(set [bb.li-hash insn] li)
(let* ((rn (regnums refs))
@@ -187,7 +193,7 @@
used (logior li.used rmask)
defined (logand li.defined (lognot rmask)))))
(def-ref (li insn def . refs)
- (set li.def def
+ (set li.def0 def
[bb.li-hash insn] li)
(let* ((rn (regnums refs))
(dn (regnum def))
@@ -225,18 +231,16 @@
((@(or ret abscsr) @nreg @reg)
(refs li insn reg nreg))
((catch @esreg @eareg @syreg @descreg . @nil)
- ;; Not quite correct: a live-info has only one def
- (def li insn esreg)
- (def li insn eareg)
- (refs li insn syreg descreg))
+ (let ((ili (defs li insn esreg eareg)))
+ (refs ili insn syreg descreg)))
((handle @funreg @syreg)
(refs li insn funreg syreg))
((@(or getv getvb getfb getl1b getlx getf) @def . @nil)
- (def li insn def))
+ (defs li insn def))
((@(or setv setl1 setlx bindv) @reg . @nil)
(refs li insn reg))
((close @reg . @nil)
- (def li insn reg))
+ (defs li insn reg))
((@op . @nil)
(caseq op
((end jend xend prof or apply call or gapply gcall mov if
@@ -361,7 +365,8 @@
(whilet ((insn (pop insns)))
(let ((li [bb.li-hash insn]))
(cond
- ((mequal li.def dst src)
+ ((or (mequal li.def0 dst src)
+ (mequal li.def1 dst src))
(add insn)
(pend insns)
(set insns nil))