From b8d556514c549f7f6c614fff60bb2fceff7dfdbe Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 23 Apr 2010 20:52:59 -0400 Subject: [PATCH] compiler.cfg.value-numbering: add slot addressing rewrite rule to eliminate a redundant ##add-imm from array-nth and set-array-nth --- .../cfg/value-numbering/slots/authors.txt | 1 + .../cfg/value-numbering/slots/slots.factor | 25 +++++++++++++++++++ .../value-numbering-tests.factor | 19 ++++++++++++++ .../value-numbering/value-numbering.factor | 3 ++- 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 basis/compiler/cfg/value-numbering/slots/authors.txt create mode 100644 basis/compiler/cfg/value-numbering/slots/slots.factor diff --git a/basis/compiler/cfg/value-numbering/slots/authors.txt b/basis/compiler/cfg/value-numbering/slots/authors.txt new file mode 100644 index 0000000000..1901f27a24 --- /dev/null +++ b/basis/compiler/cfg/value-numbering/slots/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/basis/compiler/cfg/value-numbering/slots/slots.factor b/basis/compiler/cfg/value-numbering/slots/slots.factor new file mode 100644 index 0000000000..0549765072 --- /dev/null +++ b/basis/compiler/cfg/value-numbering/slots/slots.factor @@ -0,0 +1,25 @@ +! Copyright (C) 2010 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors combinators.short-circuit cpu.architecture fry +kernel math +compiler.cfg.instructions +compiler.cfg.value-numbering.graph +compiler.cfg.value-numbering.rewrite +compiler.cfg.value-numbering.expressions ; +IN: compiler.cfg.value-numbering.slots + +: simplify-slot-addressing? ( insn -- ? ) + complex-addressing? + [ slot>> vreg>expr add-imm-expr? ] [ drop f ] if ; + +: simplify-slot-addressing ( insn -- insn/f ) + dup simplify-slot-addressing? [ + dup slot>> vreg>expr + [ src1>> vn>vreg >>slot ] + [ src2>> vn>integer over scale>> '[ _ _ shift - ] change-tag ] + bi + ] [ drop f ] if ; + +M: ##slot rewrite simplify-slot-addressing ; +M: ##set-slot rewrite simplify-slot-addressing ; +M: ##write-barrier rewrite simplify-slot-addressing ; diff --git a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor index 0ad195f145..ef7357ea61 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor @@ -2209,6 +2209,25 @@ V{ [ f ] [ 1 get instructions>> [ ##peek? ] any? ] unit-test +! Slot addressing optimization +cpu x86? [ + [ + V{ + T{ ##peek f 0 D 0 } + T{ ##peek f 1 D 1 } + T{ ##add-imm f 2 1 2 } + T{ ##slot f 3 0 1 2 $[ 7 2 cells - ] } + } + ] [ + V{ + T{ ##peek f 0 D 0 } + T{ ##peek f 1 D 1 } + T{ ##add-imm f 2 1 2 } + T{ ##slot f 3 0 2 2 7 } + } value-numbering-step + ] unit-test +] when + ! Alien addressing optimization [ V{ diff --git a/basis/compiler/cfg/value-numbering/value-numbering.factor b/basis/compiler/cfg/value-numbering/value-numbering.factor index 5f8cf5f188..60ff4b2d00 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering.factor @@ -14,7 +14,8 @@ compiler.cfg.value-numbering.expressions compiler.cfg.value-numbering.graph compiler.cfg.value-numbering.math compiler.cfg.value-numbering.rewrite -compiler.cfg.value-numbering.simplify ; +compiler.cfg.value-numbering.simplify +compiler.cfg.value-numbering.slots ; IN: compiler.cfg.value-numbering ! Local value numbering.