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,9 +2244,14 @@ func (c *codegen) writeJumps(b []byte) ([]byte, error) {
|
|||
return nil, err
|
||||
}
|
||||
if op != opcode.PUSHA && math.MinInt8 <= offset && offset <= math.MaxInt8 {
|
||||
if op == opcode.JMPL && offset == 5 {
|
||||
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:
|
||||
nextIP := ctx.NextIP()
|
||||
info := c.reverseOffsetMap[ctx.IP()]
|
||||
|
|
|
@ -281,7 +281,6 @@ func TestInlineVariadicInInlinedCall(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestInlineConversion(t *testing.T) {
|
||||
t.Skip()
|
||||
src1 := `package foo
|
||||
import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/inline"
|
||||
var _ = inline.A
|
||||
|
@ -307,7 +306,6 @@ func TestInlineConversion(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestInlineConversionQualified(t *testing.T) {
|
||||
t.Skip()
|
||||
src1 := `package foo
|
||||
import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/inline"
|
||||
var A = 1
|
||||
|
|
Loading…
Reference in a new issue