compiler.cfg.gvn: found infinite loop issues when rewrites define new vregs

db4
Alex Vondrak 2011-07-02 13:43:28 -07:00 committed by John Benediktsson
parent 774264b9f9
commit d5dc989fd8
3 changed files with 14 additions and 3 deletions

View File

@ -27,6 +27,8 @@ M: ##box-displaced-alien rewrite
: rewrite-unbox-alien ( insn box-insn -- insn )
[ dst>> ] [ src>> ] bi* <copy> ;
! XXX next-vreg makes vregs>vns change on every iteration
! (hidden in ^^unbox-c-ptr)
: rewrite-unbox-displaced-alien ( insn box-insn -- insns )
[
[ dst>> ]
@ -43,7 +45,8 @@ M: ##box-displaced-alien rewrite
[ rewrite-unbox-alien ]
}
{
[ dup [ ##box-displaced-alien? ] with-available-uses? ]
! [ dup [ ##box-displaced-alien? ] with-available-uses? ]
[ f ]
[ rewrite-unbox-displaced-alien ]
}
[ 2drop f ]

View File

@ -58,6 +58,7 @@ IN: compiler.cfg.gvn.comparisons
: >compare< ( insn -- in1 in2 cc )
[ src1>> ] [ src2>> ] [ cc>> ] tri ; inline
! XXX next-vreg may make vregs>vns change on every iteration
: >test-vector< ( insn -- src1 temp rep vcc )
{
[ src1>> ]
@ -179,11 +180,13 @@ M: ##compare-integer-branch rewrite
[ { [ dst>> ] [ src1>> ] [ src2>> ] [ cc>> ] } cleave ] dip
swap-compare ; inline
! XXX next-vreg may make vregs>vns change on every iteration
: >compare-imm ( insn swap? -- insn' )
(>compare-imm)
[ vreg>literal ] dip
next-vreg \ ##compare-imm new-insn ; inline
! XXX next-vreg may make vregs>vns change on every iteration
: >compare-integer-imm ( insn swap? -- insn' )
(>compare-imm)
[ vreg>integer ] dip
@ -218,6 +221,7 @@ M: ##compare-integer rewrite
[ cc>> { cc= cc/= } member? ]
} 1&& ; inline
! XXX next-vreg may make vregs>vns change on every iteration
: rewrite-redundant-comparison ( insn -- insn' )
[ cc>> ] [ dst>> ] [ src1>> vreg>insn ] tri {
{ [ dup ##compare? ] [ >compare< next-vreg \ ##compare new-insn ] }
@ -279,6 +283,7 @@ M: ##compare-integer-imm rewrite
: simplify-test-imm-branch ( insn -- insn )
(simplify-test-imm) \ ##test-imm-branch new-insn ; inline
! XXX next-vreg may make vregs>vns change on every iteration
: >test-imm ( insn ? -- insn' )
(>compare-imm) [ vreg>integer ] dip next-vreg
\ ##test-imm new-insn ; inline

View File

@ -122,11 +122,14 @@ M: ##sub-imm rewrite sub-imm>add-imm ;
] [ f ] if ; inline
: distribute-over-add? ( insn -- ? )
src1>> vreg>insn [ ##add-imm? ] with-available-uses? ;
drop f ;
! src1>> vreg>insn [ ##add-imm? ] with-available-uses? ;
: distribute-over-sub? ( insn -- ? )
src1>> vreg>insn [ ##sub-imm? ] with-available-uses? ;
drop f ;
! src1>> vreg>insn [ ##sub-imm? ] with-available-uses? ;
! XXX next-vreg makes vregs>vns change on every iteration
: distribute ( insn add-op mul-op -- new-insns/f )
[
dup src1>> vreg>insn