From ca4f442eaa20055e5ded3af24ee577c5ed77741c Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 3 May 2010 18:20:28 -0400 Subject: [PATCH] compiler.cfg.alias-analysis: storing a reference into an object now merges the reference's alias class with the heap alias class --- .../cfg/alias-analysis/alias-analysis.factor | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/basis/compiler/cfg/alias-analysis/alias-analysis.factor b/basis/compiler/cfg/alias-analysis/alias-analysis.factor index 3cf099d149..438395e2a7 100644 --- a/basis/compiler/cfg/alias-analysis/alias-analysis.factor +++ b/basis/compiler/cfg/alias-analysis/alias-analysis.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: kernel math namespaces assocs hashtables sequences arrays accessors words vectors combinators combinators.short-circuit -sets classes layouts cpu.architecture +sets classes layouts fry cpu.architecture compiler.cfg compiler.cfg.rpo compiler.cfg.def-use @@ -100,6 +100,15 @@ SYMBOL: acs>vregs : each-alias ( vreg quot -- ) [ aliases ] dip each ; inline +: merge-acs ( vreg into -- ) + [ vreg>ac ] dip + 2dup eq? [ 2drop ] [ + [ ac>vregs ] dip + [ vregs>acs get '[ [ _ ] dip _ set-at ] each ] + [ acs>vregs get at push-all ] + 2bi + ] if ; + ! Map vregs -> slot# -> vreg SYMBOL: live-slots @@ -187,7 +196,8 @@ SYMBOL: heap-ac : remember-set-slot ( slot#/f vreg -- ) over [ [ record-constant-set-slot ] - [ kill-constant-set-slot ] 2bi + [ kill-constant-set-slot ] + 2bi ] [ nip kill-computed-set-slot ] if ; GENERIC: insn-slot# ( insn -- slot#/f ) @@ -262,7 +272,10 @@ M: ##write analyze-aliases* dup [ src>> resolve ] [ insn-slot# ] [ insn-object ] tri 3dup idempotent? [ 3drop ] [ - [ remember-set-slot drop ] [ load-slot ] 3bi + [ 2drop heap-ac get merge-acs ] + [ remember-set-slot drop ] + [ load-slot ] + 3tri ] if ; M: ##copy analyze-aliases*