From 86a15ad47b1452c740e574f11b8de8c25f6e75b5 Mon Sep 17 00:00:00 2001 From: Alex Vondrak Date: Sat, 29 Dec 2012 10:59:25 -0800 Subject: [PATCH] compiler.cfg.liveness: look up leaders (if possible) so liveness analysis doesn't break after leaving SSA (issue #22) --- basis/compiler/cfg/liveness/liveness.factor | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/basis/compiler/cfg/liveness/liveness.factor b/basis/compiler/cfg/liveness/liveness.factor index 0a09a00d8b..aaf6158734 100644 --- a/basis/compiler/cfg/liveness/liveness.factor +++ b/basis/compiler/cfg/liveness/liveness.factor @@ -3,8 +3,9 @@ USING: arrays kernel accessors assocs fry locals combinators deques dlists namespaces sequences sets compiler.cfg compiler.cfg.def-use compiler.cfg.instructions -compiler.cfg.registers compiler.cfg.utilities -compiler.cfg.predecessors compiler.cfg.rpo cpu.architecture ; +compiler.cfg.registers compiler.cfg.ssa.destruction +compiler.cfg.utilities compiler.cfg.predecessors +compiler.cfg.rpo cpu.architecture ; FROM: namespaces => set ; IN: compiler.cfg.liveness @@ -44,11 +45,19 @@ SYMBOL: base-pointers GENERIC: visit-insn ( live-set insn -- live-set ) +! If liveness analysis is run after SSA destruction, we need to +! use the canonical vreg representatives (leaders) because SSA +! destruction does not rename the old vregs. + : kill-defs ( live-set insn -- live-set ) - defs-vregs [ over delete-at ] each ; inline + defs-vregs [ + [ leader ] keep or over delete-at + ] each ; inline : gen-uses ( live-set insn -- live-set ) - uses-vregs [ over conjoin ] each ; inline + uses-vregs [ + [ leader ] keep or over conjoin + ] each ; inline M: vreg-insn visit-insn [ kill-defs ] [ gen-uses ] bi ;