compiler.cfg.two-operand: if last instruction in a basic block is an overflowing arithmetic op of the form x = y op x, we now convert it correctly. This fixes compiler regression with benchmark.dawes after recent coalescing changes
parent
e01fc93812
commit
9bde92220b
basis/compiler/cfg/two-operand
|
@ -27,19 +27,12 @@ compiler.cfg.registers cpu.architecture namespaces tools.test ;
|
|||
|
||||
[
|
||||
V{
|
||||
T{ ##copy f V int-regs 4 V int-regs 2 }
|
||||
T{ ##sub f V int-regs 4 V int-regs 4 V int-regs 1 }
|
||||
T{ ##copy f V int-regs 1 V int-regs 4 }
|
||||
T{ ##copy f V int-regs 4 V int-regs 1 }
|
||||
T{ ##copy f V int-regs 1 V int-regs 2 }
|
||||
T{ ##sub f V int-regs 1 V int-regs 1 V int-regs 4 }
|
||||
}
|
||||
] [
|
||||
{
|
||||
T{ ##sub f V int-regs 1 V int-regs 2 V int-regs 1 }
|
||||
} (convert-two-operand)
|
||||
] unit-test
|
||||
|
||||
! This should never come up after coalescing
|
||||
[
|
||||
V{
|
||||
T{ ##fixnum-add f V int-regs 2 V int-regs 4 V int-regs 2 }
|
||||
} (convert-two-operand)
|
||||
] must-fail
|
||||
|
|
|
@ -65,15 +65,11 @@ GENERIC: convert-two-operand* ( insn -- )
|
|||
|
||||
: case-2? ( insn -- ? ) [ dst>> ] [ src2>> ] bi = ; inline
|
||||
|
||||
ERROR: bad-case-2 insn ;
|
||||
|
||||
: case-2 ( insn -- )
|
||||
! This can't work with a ##fixnum-overflow since it branches
|
||||
dup ##fixnum-overflow? [ bad-case-2 ] when
|
||||
dup dst>> reg-class>> next-vreg
|
||||
[ swap src1>> emit-copy ]
|
||||
[ [ >>src1 ] [ >>dst ] bi , ]
|
||||
[ [ src2>> ] dip emit-copy ]
|
||||
[ swap src2>> emit-copy ]
|
||||
[ drop [ src2>> ] [ src1>> ] bi emit-copy ]
|
||||
[ >>src2 dup dst>> >>src1 , ]
|
||||
2tri ; inline
|
||||
|
||||
: case-3 ( insn -- )
|
||||
|
|
Loading…
Reference in New Issue