diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index def779e5..68590077 100644 Binary files a/internal/abi/llgo_autogen.lla and b/internal/abi/llgo_autogen.lla differ diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index d0d0e4d2..f358a32c 100644 Binary files a/internal/runtime/llgo_autogen.lla and b/internal/runtime/llgo_autogen.lla differ diff --git a/ssa/datastruct.go b/ssa/datastruct.go index c5ade5d7..0ff80d6a 100644 --- a/ssa/datastruct.go +++ b/ssa/datastruct.go @@ -235,7 +235,8 @@ func (b Builder) Slice(x, low, high, max Expr) (ret Expr) { var nCap Expr var nEltSize Expr var base Expr - if low.IsNil() { + var lowIsNil = low.IsNil() + if lowIsNil { low = prog.IntVal(0, prog.Int()) } switch t := x.raw.Type.Underlying().(type) { @@ -266,6 +267,9 @@ func (b Builder) Slice(x, low, high, max Expr) (ret Expr) { nEltSize = SizeOf(prog, elem) nCap = prog.IntVal(uint64(te.Len()), prog.Int()) if high.IsNil() { + if lowIsNil && max.IsNil() { + return b.unsafeSlice(x, nCap.impl, nCap.impl) + } high = nCap } base = x