diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2023-04-10 15:02:27 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2023-04-10 15:02:27 -0700 |
commit | bb92eaa8da819ff3734d8753b1c4dae4ba841c6d (patch) | |
tree | 193af35d68647a1e5481d86ff33f3383043de486 /stdlib | |
parent | 2959397edd309c9e64ddf509137619a618d12cf0 (diff) | |
download | txr-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.tl | 5 |
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) |