From 75de9fe1552d923a3a7b95ff4cd4966aeaf1de3b Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 10 Apr 2023 15:39:13 -0700 Subject: 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. --- stdlib/optimize.tl | 17 ++++++++--------- 1 file 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) -- cgit v1.2.3