summaryrefslogtreecommitdiffstats
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
commita66700f472a7a5d9be2ec1adef3dfc18cd77cfdd (patch)
tree193af35d68647a1e5481d86ff33f3383043de486
parent95c8233617c4149bc4813fee38f8a6b4a80316c2 (diff)
downloadtxr-a66700f472a7a5d9be2ec1adef3dfc18cd77cfdd.tar.gz
txr-a66700f472a7a5d9be2ec1adef3dfc18cd77cfdd.tar.bz2
txr-a66700f472a7a5d9be2ec1adef3dfc18cd77cfdd.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.
-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)