From 572d7f77f86cc0c57509e0f2611cd8b450df62ca Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Tue, 4 May 2010 05:46:21 -0500 Subject: [PATCH] compiler.cfg.value-numbering: don't use complex addressing modes unless architecture supports it --- .../cfg/value-numbering/alien/alien.factor | 19 ++-- .../value-numbering-tests.factor | 92 +++++++++++++------ 2 files changed, 77 insertions(+), 34 deletions(-) diff --git a/basis/compiler/cfg/value-numbering/alien/alien.factor b/basis/compiler/cfg/value-numbering/alien/alien.factor index 190d911ad5..58674602d9 100644 --- a/basis/compiler/cfg/value-numbering/alien/alien.factor +++ b/basis/compiler/cfg/value-numbering/alien/alien.factor @@ -70,7 +70,10 @@ M: ##unbox-alien rewrite rewrite-unbox-any-c-ptr ; ! construct a new ##load-memory or ##store-memory with the ! ##add's operand as the displacement : fuse-displacement? ( insn -- ? ) - base>> vreg>insn ##add? ; + { + [ offset>> 0 = complex-addressing? or ] + [ base>> vreg>insn ##add? ] + } 1&& ; GENERIC: alien-insn-value ( insn -- value ) @@ -106,12 +109,14 @@ M: ##store-memory-imm new-alien-insn drop \ ##store-memory new-insn ; [ >>displacement ] [ >>scale ] bi* ; : rewrite-memory-op ( insn -- insn/f ) - { - { [ dup fuse-base-offset? ] [ fuse-base-offset ] } - { [ dup fuse-displacement-offset? ] [ fuse-displacement-offset ] } - { [ dup fuse-scale? ] [ fuse-scale ] } - [ drop f ] - } cond ; + complex-addressing? [ + { + { [ dup fuse-base-offset? ] [ fuse-base-offset ] } + { [ dup fuse-displacement-offset? ] [ fuse-displacement-offset ] } + { [ dup fuse-scale? ] [ fuse-scale ] } + [ drop f ] + } cond + ] [ drop f ] if ; : rewrite-memory-imm-op ( insn -- insn/f ) { diff --git a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor index 3be4e584fb..00d8652279 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor @@ -2576,7 +2576,8 @@ cpu x86? [ } value-numbering-step ] unit-test -! Base offset fusion on ##load/store-memory +! Base offset fusion on ##load/store-memory -- only on x86 +cpu x86? [ V{ T{ ##peek f 0 D 0 } @@ -2586,7 +2587,18 @@ cpu x86? [ T{ ##add-imm f 4 2 31337 } T{ ##load-memory f 5 2 3 0 31337 int-rep c:uchar } } -] [ +] +[ + V{ + T{ ##peek f 0 D 0 } + T{ ##peek f 1 D 1 } + T{ ##tagged>integer f 2 0 } + T{ ##tagged>integer f 3 1 } + T{ ##add-imm f 4 2 31337 } + T{ ##load-memory f 5 4 3 0 0 int-rep c:uchar } + } +] ? +[ V{ T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } @@ -2597,7 +2609,8 @@ cpu x86? [ } value-numbering-step ] unit-test -! Displacement offset fusion on ##load/store-memory +! Displacement offset fusion on ##load/store-memory -- only on x86 +cpu x86? [ V{ T{ ##peek f 0 D 0 } @@ -2607,7 +2620,18 @@ cpu x86? [ T{ ##add-imm f 4 3 31337 } T{ ##load-memory f 5 2 3 0 31338 int-rep c:uchar } } -] [ +] +[ + V{ + T{ ##peek f 0 D 0 } + T{ ##peek f 1 D 1 } + T{ ##tagged>integer f 2 0 } + T{ ##tagged>integer f 3 1 } + T{ ##add-imm f 4 3 31337 } + T{ ##load-memory f 5 2 4 0 1 int-rep c:uchar } + } +] ? +[ V{ T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } @@ -2632,6 +2656,7 @@ cpu x86? [ ] unit-test ! Scale fusion on ##load/store-memory +cpu x86? [ V{ T{ ##peek f 0 D 0 } @@ -2641,7 +2666,18 @@ cpu x86? [ T{ ##shl-imm f 4 3 2 } T{ ##load-memory f 5 2 3 2 0 int-rep c:uchar } } -] [ +] +[ + V{ + T{ ##peek f 0 D 0 } + T{ ##peek f 1 D 1 } + T{ ##tagged>integer f 2 0 } + T{ ##tagged>integer f 3 1 } + T{ ##shl-imm f 4 3 2 } + T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar } + } +] ? +[ V{ T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } @@ -2652,26 +2688,28 @@ cpu x86? [ } value-numbering-step ] unit-test -! Don't do scale fusion if there's already a scale -[ ] [ - V{ - T{ ##peek f 0 D 0 } - T{ ##peek f 1 D 1 } - T{ ##tagged>integer f 2 0 } - T{ ##tagged>integer f 3 1 } - T{ ##shl-imm f 4 3 2 } - T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar } - } dup value-numbering-step assert= -] unit-test +cpu x86? [ + ! Don't do scale fusion if there's already a scale + [ ] [ + V{ + T{ ##peek f 0 D 0 } + T{ ##peek f 1 D 1 } + T{ ##tagged>integer f 2 0 } + T{ ##tagged>integer f 3 1 } + T{ ##shl-imm f 4 3 2 } + T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar } + } dup value-numbering-step assert= + ] unit-test -! Don't do scale fusion if the scale factor is out of range -[ ] [ - V{ - T{ ##peek f 0 D 0 } - T{ ##peek f 1 D 1 } - T{ ##tagged>integer f 2 0 } - T{ ##tagged>integer f 3 1 } - T{ ##shl-imm f 4 3 4 } - T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar } - } dup value-numbering-step assert= -] unit-test + ! Don't do scale fusion if the scale factor is out of range + [ ] [ + V{ + T{ ##peek f 0 D 0 } + T{ ##peek f 1 D 1 } + T{ ##tagged>integer f 2 0 } + T{ ##tagged>integer f 3 1 } + T{ ##shl-imm f 4 3 4 } + T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar } + } dup value-numbering-step assert= + ] unit-test +] when