summaryrefslogtreecommitdiffstats
path: root/stdlib
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-04-15 01:11:50 -0700
committerKaz Kylheku <kaz@kylheku.com>2023-04-15 01:11:50 -0700
commitbf6b46f16a5e691106a8868010807688fe756c84 (patch)
tree0a079968684326a4f38cedb767deca0bb855a92d /stdlib
parent8943016ffc30123525ebf29ad52f8d5a5efbf703 (diff)
downloadtxr-bf6b46f16a5e691106a8868010807688fe756c84.tar.gz
txr-bf6b46f16a5e691106a8868010807688fe756c84.tar.bz2
txr-bf6b46f16a5e691106a8868010807688fe756c84.zip
compiler: tighten cases in liveness calculation
* stdlib/optimize.tl (basic-blocks local-liveness): Handle all instructions explicitly with no catch-all behavior. Make a copy of the live-info even for instructions that have no source or destination operands, so that they don't mistakenly marked as having defs or refs.
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/optimize.tl16
1 files changed, 8 insertions, 8 deletions
diff --git a/stdlib/optimize.tl b/stdlib/optimize.tl
index 88099fa7..24cad22f 100644
--- a/stdlib/optimize.tl
+++ b/stdlib/optimize.tl
@@ -241,14 +241,14 @@
(refs li insn reg))
((close @reg . @nil)
(defs li insn reg))
- ((@op . @nil)
- (caseq op
- ((end jend xend prof or apply call or gapply gcall mov if
- ifq ifql swtch block ret abscsr catch handle getv
- getvb getfb getl1b getlx getf setl1 setlx bindv close)
- (error `wrongly handled @insn instruction`))
- (t (set [bb.li-hash insn] li))))
- (@else (set [bb.li-hash else] li)))))))
+ ((@(or jmp frame dframe uwprot) . @nil)
+ (set [bb.li-hash insn] li)
+ (copy li))
+ ((@nil . @nil)
+ (error `unhandled/mishandled @insn instruction`))
+ (@else
+ (set [bb.li-hash else] li)
+ (copy li)))))))
(let ((li (liveness bl.insns)))
(set bl.used li.used
bl.defined li.defined))))