compiler: remove jumps to the next instruction

In case there are no returns in the inlined function, jumps point to the
next instruction and can be omitted. This optimization can be extended
to handle other cases, here we just make sure that already existing code
stays the same.

Signed-off-by: Evgeniy Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
Evgeniy Stratonikov 2022-07-12 11:44:32 +03:00
parent 05efc57485
commit 17329eea64
2 changed files with 7 additions and 4 deletions

View file

@ -2244,8 +2244,13 @@ func (c *codegen) writeJumps(b []byte) ([]byte, error) {
return nil, err return nil, err
} }
if op != opcode.PUSHA && math.MinInt8 <= offset && offset <= math.MaxInt8 { if op != opcode.PUSHA && math.MinInt8 <= offset && offset <= math.MaxInt8 {
copy(b[ctx.IP():], []byte{byte(toShortForm(op)), byte(offset), byte(opcode.NOP), byte(opcode.NOP), byte(opcode.NOP)}) if op == opcode.JMPL && offset == 5 {
nopOffsets = append(nopOffsets, ctx.IP()+2, ctx.IP()+3, ctx.IP()+4) copy(b[ctx.IP():], []byte{byte(opcode.NOP), byte(opcode.NOP), byte(opcode.NOP), byte(opcode.NOP), byte(opcode.NOP)})
nopOffsets = append(nopOffsets, ctx.IP(), ctx.IP()+1, ctx.IP()+2, ctx.IP()+3, ctx.IP()+4)
} else {
copy(b[ctx.IP():], []byte{byte(toShortForm(op)), byte(offset), byte(opcode.NOP), byte(opcode.NOP), byte(opcode.NOP)})
nopOffsets = append(nopOffsets, ctx.IP()+2, ctx.IP()+3, ctx.IP()+4)
}
} }
case opcode.INITSLOT: case opcode.INITSLOT:
nextIP := ctx.NextIP() nextIP := ctx.NextIP()

View file

@ -281,7 +281,6 @@ func TestInlineVariadicInInlinedCall(t *testing.T) {
} }
func TestInlineConversion(t *testing.T) { func TestInlineConversion(t *testing.T) {
t.Skip()
src1 := `package foo src1 := `package foo
import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/inline" import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/inline"
var _ = inline.A var _ = inline.A
@ -307,7 +306,6 @@ func TestInlineConversion(t *testing.T) {
} }
func TestInlineConversionQualified(t *testing.T) { func TestInlineConversionQualified(t *testing.T) {
t.Skip()
src1 := `package foo src1 := `package foo
import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/inline" import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/inline"
var A = 1 var A = 1