diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2023-04-10 15:39:13 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2023-04-10 15:39:13 -0700 |
commit | 75de9fe1552d923a3a7b95ff4cd4966aeaf1de3b (patch) | |
tree | 8f4df8cfca2ccf45c88bf60c6e3db3c7bdddff72 | |
parent | bb92eaa8da819ff3734d8753b1c4dae4ba841c6d (diff) | |
download | txr-75de9fe1552d923a3a7b95ff4cd4966aeaf1de3b.tar.gz txr-75de9fe1552d923a3a7b95ff4cd4966aeaf1de3b.tar.bz2 txr-75de9fe1552d923a3a7b95ff4cd4966aeaf1de3b.zip |
compiler: streamline live-info object creation.
* stdlib/optimize.tl (basic-blocks local-liveness): When
processing a pure def, we don't copy the live-info
unconditionally, which is waseteful since if the destination
register is a t-reg, we will invoke (new live-info) to
make yet another live info. Instead, let's destructively
mutate the incoming live info from the instruction below,
and return a copy that is made before that is done.
In the def-ref case, the local copy is entirely superfluous,
because in all cases we return a new object.
We also eliminate redundant (set [bb.li-hash insn] li)
evaluations.
-rw-r--r-- | stdlib/optimize.tl | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/stdlib/optimize.tl b/stdlib/optimize.tl index 4af062f9..6a70cb6c 100644 --- a/stdlib/optimize.tl +++ b/stdlib/optimize.tl @@ -168,16 +168,17 @@ (mappend (do when-match (t @num) @1 (list num)) regs)) (def (li insn def) - (set li (copy li) - li.def def - [bb.li-hash insn] li) + (set [bb.li-hash insn] li) (let* ((dn (regnum def)) (dmask (if dn (mask dn)))) (cond - (dn (new live-info + (dn (set li.def def) + (new live-info used (logand li.used (lognot dmask)) defined (logior li.defined dmask))) - (t (set [bb.li-hash insn] li))))) + (t (prog1 + (copy li) + (set li.def def)))))) (refs (li insn . refs) (set [bb.li-hash insn] li) (let* ((rn (regnums refs)) @@ -186,8 +187,7 @@ used (logior li.used rmask) defined (logand li.defined (lognot rmask))))) (def-ref (li insn def . refs) - (set li (copy li) - li.def def + (set li.def def [bb.li-hash insn] li) (let* ((rn (regnums refs)) (dn (regnum def)) @@ -197,8 +197,7 @@ (dn (new live-info used (logior (logand li.used (lognot dmask)) rmask) defined (logior (logand li.defined (lognot rmask)) dmask))) - (t (set [bb.li-hash insn] li) - (new live-info + (t (new live-info used (logior li.used rmask) defined (logand li.defined (lognot rmask))))))) (liveness (insns) |