From bb92eaa8da819ff3734d8753b1c4dae4ba841c6d Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 10 Apr 2023 15:02:27 -0700 Subject: 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. --- stdlib/optimize.tl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'stdlib') 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) -- cgit v1.2.3