summaryrefslogtreecommitdiffstats
path: root/stdlib
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-04-10 15:02:27 -0700
committerKaz Kylheku <kaz@kylheku.com>2023-04-10 15:02:27 -0700
commitbb92eaa8da819ff3734d8753b1c4dae4ba841c6d (patch)
tree193af35d68647a1e5481d86ff33f3383043de486 /stdlib
parent2959397edd309c9e64ddf509137619a618d12cf0 (diff)
downloadtxr-bb92eaa8da819ff3734d8753b1c4dae4ba841c6d.tar.gz
txr-bb92eaa8da819ff3734d8753b1c4dae4ba841c6d.tar.bz2
txr-bb92eaa8da819ff3734d8753b1c4dae4ba841c6d.zip
compiler: bug in liveness calculation over catch insn
* stdlib/optimize.tl (basic-blocks local-liveness): The exception symbol and argument registers in the catch instruction are clobbers, not references. We must treat them as defs. Unfortunately, the instruction has two clobbers but live-info has only one def slot, which should be fixed.
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/optimize.tl5
1 files changed, 4 insertions, 1 deletions
diff --git a/stdlib/optimize.tl b/stdlib/optimize.tl
index d43cfbd1..4af062f9 100644
--- a/stdlib/optimize.tl
+++ b/stdlib/optimize.tl
@@ -226,7 +226,10 @@
((@(or ret abscsr) @nreg @reg)
(refs li insn reg nreg))
((catch @esreg @eareg @syreg @descreg . @nil)
- (refs li insn esreg eareg syreg descreg))
+ ;; Not quite correct: a live-info has only one def
+ (def li insn esreg)
+ (def li insn eareg)
+ (refs li insn syreg descreg))
((handle @funreg @syreg)
(refs li insn funreg syreg))
((@(or getv getvb getfb getl1b getlx getf) @def . @nil)