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:
parent
05efc57485
commit
17329eea64
2 changed files with 7 additions and 4 deletions
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue