From 5d93565e1696ea47413bf5aef67206fc22b80d0b Mon Sep 17 00:00:00 2001 From: visualfc Date: Wed, 15 May 2024 10:29:06 +0800 Subject: [PATCH] ssa: add builtin append --- cl/_testdata/print/out.ll | 10 +-- cl/_testdata/vargs/out.ll | 8 +-- cl/_testrt/builtin/in.go | 6 ++ cl/_testrt/builtin/out.ll | 100 +++++++++++++++++++----------- cl/_testrt/concat/out.ll | 8 +-- cl/_testrt/intgen/out.ll | 20 +++--- cl/_testrt/sum/out.ll | 8 +-- internal/runtime/llgo_autogen.lla | Bin 3697 -> 4183 bytes internal/runtime/slice.go | 40 ++++++++++++ internal/runtime/z_slice.go | 21 +++++++ ssa/expr.go | 78 ++++++++++++++++++----- ssa/type.go | 8 ++- 12 files changed, 216 insertions(+), 91 deletions(-) create mode 100644 internal/runtime/slice.go diff --git a/cl/_testdata/print/out.ll b/cl/_testdata/print/out.ll index af0ea398..2e91fdad 100644 --- a/cl/_testdata/print/out.ll +++ b/cl/_testdata/print/out.ll @@ -51,7 +51,7 @@ _llgo_0: define void @main.gwrite(%"github.com/goplus/llgo/internal/runtime.Slice" %0) { _llgo_0: - %1 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %0) + %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 1 %2 = icmp eq i64 %1, 0 br i1 %2, label %_llgo_1, label %_llgo_2 @@ -680,7 +680,7 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 define void @main.println(%"github.com/goplus/llgo/internal/runtime.Slice" %0) { _llgo_0: - %1 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %0) + %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 1 br label %_llgo_1 _llgo_1: ; preds = %_llgo_5, %_llgo_0 @@ -690,7 +690,7 @@ _llgo_1: ; preds = %_llgo_5, %_llgo_0 br i1 %4, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %5 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %0) + %5 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %5, i64 %3 %7 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %6, align 8 %8 = icmp ne i64 %3, 0 @@ -783,8 +783,6 @@ _llgo_0: declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) -declare i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice") - declare i32 @printf(ptr, ...) declare void @"github.com/goplus/llgo/internal/runtime.init"() @@ -802,5 +800,3 @@ declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llg declare { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface", ptr) declare { %"github.com/goplus/llgo/internal/runtime.String", i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2String"(%"github.com/goplus/llgo/internal/runtime.iface", ptr) - -declare ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice") diff --git a/cl/_testdata/vargs/out.ll b/cl/_testdata/vargs/out.ll index 56930b8e..4657338e 100644 --- a/cl/_testdata/vargs/out.ll +++ b/cl/_testdata/vargs/out.ll @@ -48,7 +48,7 @@ _llgo_0: define void @main.test(%"github.com/goplus/llgo/internal/runtime.Slice" %0) { _llgo_0: - %1 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %0) + %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 1 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 @@ -58,7 +58,7 @@ _llgo_1: ; preds = %_llgo_2, %_llgo_0 br i1 %4, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %5 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %0) + %5 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %5, i64 %3 %7 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %6, align 8 %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) @@ -80,10 +80,6 @@ declare %"github.com/goplus/llgo/internal/runtime.iface" @"github.com/goplus/llg declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr, i64, i64, i64, i64, i64) -declare i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice") - -declare ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice") - declare i64 @"github.com/goplus/llgo/internal/runtime.I2Int"(%"github.com/goplus/llgo/internal/runtime.iface", ptr) declare i32 @printf(ptr, ...) diff --git a/cl/_testrt/builtin/in.go b/cl/_testrt/builtin/in.go index a252a6d5..e5416b37 100644 --- a/cl/_testrt/builtin/in.go +++ b/cl/_testrt/builtin/in.go @@ -40,6 +40,12 @@ func main() { string_len("hello"[1:]) string_len("hello"[1:2]) string_len("hello"[5:]) + + s = append(s, 5, 6, 7, 8) + out(len(s)) + data := []byte{'a', 'b', 'c'} + data = append(data, "def"...) + out(len(data)) } func string_len(s string) { diff --git a/cl/_testrt/builtin/out.ll b/cl/_testrt/builtin/out.ll index 9201f246..e446abe4 100644 --- a/cl/_testrt/builtin/out.ll +++ b/cl/_testrt/builtin/out.ll @@ -14,7 +14,8 @@ source_filename = "main" @1 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 @2 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 @3 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 -@4 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 +@4 = private unnamed_addr constant [4 x i8] c"def\00", align 1 +@5 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 define void @main.init() { _llgo_0: @@ -57,7 +58,7 @@ _llgo_0: store i64 2, ptr %10, align 4 store i64 3, ptr %11, align 4 store i64 4, ptr %12, align 4 - %13 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) + %13 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 1 call void @main.out(i64 %13) %14 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 32) %15 = getelementptr inbounds i64, ptr %14, i64 0 @@ -69,64 +70,64 @@ _llgo_0: %18 = getelementptr inbounds i64, ptr %14, i64 3 store i64 4, ptr %18, align 4 %19 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %14, i64 8, i64 4, i64 0, i64 4, i64 4) - %20 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %19) + %20 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %19, 1 call void @main.out(i64 %20) call void @main.out(i64 4) call void @main.out(i64 4) call void @main.out(i64 4) - %21 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) + %21 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 call void @main.out(i64 %21) call void @main.out(i64 4) call void @main.out(i64 4) - %22 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) - %23 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) - %24 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) + %22 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %23 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %24 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 %25 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %24, i64 8, i64 %22, i64 1, i64 %23, i64 %22) - %26 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %25) + %26 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %25, 1 call void @main.out(i64 %26) - %27 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) - %28 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) - %29 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) + %27 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %28 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %29 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 %30 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %29, i64 8, i64 %27, i64 1, i64 %28, i64 %27) - %31 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %30) + %31 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %30, 2 call void @main.out(i64 %31) - %32 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) - %33 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) + %32 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %33 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 %34 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %33, i64 8, i64 %32, i64 1, i64 2, i64 %32) - %35 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %34) + %35 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %34, 1 call void @main.out(i64 %35) - %36 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) - %37 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) + %36 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %37 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 %38 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %37, i64 8, i64 %36, i64 1, i64 2, i64 %36) - %39 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %38) + %39 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %38, 2 call void @main.out(i64 %39) - %40 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) - %41 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) + %40 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %41 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 %42 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %41, i64 8, i64 %40, i64 1, i64 2, i64 2) - %43 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %42) + %43 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %42, 1 call void @main.out(i64 %43) - %44 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) - %45 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) + %44 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %45 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 %46 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %45, i64 8, i64 %44, i64 1, i64 2, i64 2) - %47 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %46) + %47 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %46, 2 call void @main.out(i64 %47) %48 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 4, i64 4) - %49 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %48) + %49 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %48, 1 call void @main.out(i64 %49) %50 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 4, i64 4) - %51 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %50) + %51 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %50, 2 call void @main.out(i64 %51) %52 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 4) - %53 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %52) + %53 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %52, 1 call void @main.out(i64 %53) %54 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 4) - %55 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %54) + %55 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %54, 2 call void @main.out(i64 %55) %56 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 2) - %57 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %56) + %57 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %56, 1 call void @main.out(i64 %57) %58 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 2) - %59 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice" %58) + %59 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %58, 2 call void @main.out(i64 %59) %60 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @0, i64 5) call void @main.string_len(%"github.com/goplus/llgo/internal/runtime.String" %60) @@ -141,12 +142,41 @@ _llgo_0: %67 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %66, 1 %68 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String" %66, i64 5, i64 %67) call void @main.string_len(%"github.com/goplus/llgo/internal/runtime.String" %68) + %69 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 32) + %70 = getelementptr inbounds i64, ptr %69, i64 0 + store i64 5, ptr %70, align 4 + %71 = getelementptr inbounds i64, ptr %69, i64 1 + store i64 6, ptr %71, align 4 + %72 = getelementptr inbounds i64, ptr %69, i64 2 + store i64 7, ptr %72, align 4 + %73 = getelementptr inbounds i64, ptr %69, i64 3 + store i64 8, ptr %73, align 4 + %74 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %69, i64 8, i64 4, i64 0, i64 4, i64 4) + %75 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %74, 0 + %76 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %74, 1 + %77 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/internal/runtime.Slice" %7, ptr %75, i64 %76, i64 8) + %78 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %77, 1 + call void @main.out(i64 %78) + %79 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 3) + %80 = getelementptr inbounds i8, ptr %79, i64 0 + store i8 97, ptr %80, align 1 + %81 = getelementptr inbounds i8, ptr %79, i64 1 + store i8 98, ptr %81, align 1 + %82 = getelementptr inbounds i8, ptr %79, i64 2 + store i8 99, ptr %82, align 1 + %83 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %79, i64 1, i64 3, i64 0, i64 3, i64 3) + %84 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @4, i64 3) + %85 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %84, 0 + %86 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %84, 1 + %87 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/internal/runtime.Slice" %83, ptr %85, i64 %86, i64 1) + %88 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %87, 1 + call void @main.out(i64 %88) ret void } define void @main.out(i64 %0) { _llgo_0: - %1 = call i32 (ptr, ...) @printf(ptr @4, i64 %0) + %1 = call i32 (ptr, ...) @printf(ptr @5, i64 %0) ret void } @@ -163,14 +193,10 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr, i64, i64, i64, i64, i64) -declare i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice") - -declare i64 @"github.com/goplus/llgo/internal/runtime.SliceCap"(%"github.com/goplus/llgo/internal/runtime.Slice") - -declare ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice") - declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr, i64) declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String", i64, i64) +declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/internal/runtime.Slice", ptr, i64, i64) + declare i32 @printf(ptr, ...) diff --git a/cl/_testrt/concat/out.ll b/cl/_testrt/concat/out.ll index 2ebd426d..af3e1e82 100644 --- a/cl/_testrt/concat/out.ll +++ b/cl/_testrt/concat/out.ll @@ -18,7 +18,7 @@ source_filename = "main" define %"github.com/goplus/llgo/internal/runtime.String" @main.concat(%"github.com/goplus/llgo/internal/runtime.Slice" %0) { _llgo_0: - %1 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %0) + %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 1 %2 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @0, i64 0) %3 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %2, 0 %4 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %2, 1 @@ -39,7 +39,7 @@ _llgo_1: ; preds = %_llgo_2, %_llgo_0 br i1 %13, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %14 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %0) + %14 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 %15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %14, i64 %12 %16 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8 %17 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %11, %"github.com/goplus/llgo/internal/runtime.String" %16) @@ -100,10 +100,6 @@ _llgo_0: ret void } -declare i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice") - -declare ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice") - declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String") declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr, i64) diff --git a/cl/_testrt/intgen/out.ll b/cl/_testrt/intgen/out.ll index e4ffe19d..8d91dd12 100644 --- a/cl/_testrt/intgen/out.ll +++ b/cl/_testrt/intgen/out.ll @@ -16,7 +16,7 @@ _llgo_0: %2 = mul i64 %0, 4 %3 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 %2) %4 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice"(ptr %3, i64 %0, i64 %0) - %5 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %4) + %5 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %4, 1 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 @@ -29,7 +29,7 @@ _llgo_2: ; preds = %_llgo_1 %9 = extractvalue { ptr, ptr } %1, 1 %10 = extractvalue { ptr, ptr } %1, 0 %11 = call i32 %10(ptr %9) - %12 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %4) + %12 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %4, 0 %13 = getelementptr inbounds i32, ptr %12, i64 %7 store i32 %11, ptr %13, align 4 br label %_llgo_1 @@ -76,7 +76,7 @@ _llgo_0: store ptr null, ptr %4, align 8 %5 = load { ptr, ptr }, ptr %2, align 8 %6 = call %"github.com/goplus/llgo/internal/runtime.Slice" @main.genInts(i64 5, { ptr, ptr } %5) - %7 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %6) + %7 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %6, 1 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 @@ -86,7 +86,7 @@ _llgo_1: ; preds = %_llgo_2, %_llgo_0 br i1 %10, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %11 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %6) + %11 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %6, 0 %12 = getelementptr inbounds i32, ptr %11, i64 %9 %13 = load i32, ptr %12, align 4 %14 = call i32 (ptr, ...) @printf(ptr @0, i32 %13) @@ -105,7 +105,7 @@ _llgo_3: ; preds = %_llgo_1 store ptr %16, ptr %20, align 8 %21 = load { ptr, ptr }, ptr %18, align 8 %22 = call %"github.com/goplus/llgo/internal/runtime.Slice" @main.genInts(i64 5, { ptr, ptr } %21) - %23 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %22) + %23 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %22, 1 br label %_llgo_4 _llgo_4: ; preds = %_llgo_5, %_llgo_3 @@ -115,7 +115,7 @@ _llgo_4: ; preds = %_llgo_5, %_llgo_3 br i1 %26, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 - %27 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %22) + %27 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %22, 0 %28 = getelementptr inbounds i32, ptr %27, i64 %25 %29 = load i32, ptr %28, align 4 %30 = call i32 (ptr, ...) @printf(ptr @1, i32 %29) @@ -135,7 +135,7 @@ _llgo_6: ; preds = %_llgo_4 store ptr %33, ptr %37, align 8 %38 = load { ptr, ptr }, ptr %35, align 8 %39 = call %"github.com/goplus/llgo/internal/runtime.Slice" @main.genInts(i64 5, { ptr, ptr } %38) - %40 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %39) + %40 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %39, 1 br label %_llgo_7 _llgo_7: ; preds = %_llgo_8, %_llgo_6 @@ -145,7 +145,7 @@ _llgo_7: ; preds = %_llgo_8, %_llgo_6 br i1 %43, label %_llgo_8, label %_llgo_9 _llgo_8: ; preds = %_llgo_7 - %44 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %39) + %44 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %39, 0 %45 = getelementptr inbounds i32, ptr %44, i64 %42 %46 = load i32, ptr %45, align 4 %47 = call i32 (ptr, ...) @printf(ptr @2, i32 %46) @@ -159,10 +159,6 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice"(ptr, i64, i64) -declare i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice") - -declare ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice") - declare void @"github.com/goplus/llgo/internal/runtime.init"() declare i32 @rand() diff --git a/cl/_testrt/sum/out.ll b/cl/_testrt/sum/out.ll index ed29adf4..e414fa91 100644 --- a/cl/_testrt/sum/out.ll +++ b/cl/_testrt/sum/out.ll @@ -44,7 +44,7 @@ _llgo_0: define i64 @main.sum(%"github.com/goplus/llgo/internal/runtime.Slice" %0) { _llgo_0: - %1 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice" %0) + %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 1 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 @@ -55,7 +55,7 @@ _llgo_1: ; preds = %_llgo_2, %_llgo_0 br i1 %5, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %6 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice" %0) + %6 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 %7 = getelementptr inbounds i64, ptr %6, i64 %4 %8 = load i64, ptr %7, align 4 %9 = add i64 %2, %8 @@ -72,7 +72,3 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr, i64, i64, i64, i64, i64) declare i32 @printf(ptr, ...) - -declare i64 @"github.com/goplus/llgo/internal/runtime.SliceLen"(%"github.com/goplus/llgo/internal/runtime.Slice") - -declare ptr @"github.com/goplus/llgo/internal/runtime.SliceData"(%"github.com/goplus/llgo/internal/runtime.Slice") diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index 452cc462be1d0096c947ebaea3412fd5ef1da035..fdd1ba93f59fb05fed21adb21a81e2cfbda62489 100644 GIT binary patch delta 4158 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 I4*&oF00J5BMgRZ+ delta 3668 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 diff --git a/internal/runtime/slice.go b/internal/runtime/slice.go new file mode 100644 index 00000000..d692a710 --- /dev/null +++ b/internal/runtime/slice.go @@ -0,0 +1,40 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package runtime + +// nextslicecap computes the next appropriate slice length. +func nextslicecap(newLen, oldCap int) int { + newcap := oldCap + doublecap := newcap + newcap + if newLen > doublecap { + return newLen + } + + const threshold = 256 + if oldCap < threshold { + return doublecap + } + for { + // Transition from growing 2x for small slices + // to growing 1.25x for large slices. This formula + // gives a smooth-ish transition between the two. + newcap += (newcap + 3*threshold) >> 2 + + // We need to check `newcap >= newLen` and whether `newcap` overflowed. + // newLen is guaranteed to be larger than zero, hence + // when newcap overflows then `uint(newcap) > uint(newLen)`. + // This allows to check for both with the same comparison. + if uint(newcap) >= uint(newLen) { + break + } + } + + // Set newcap to the requested cap when + // the newcap calculation overflowed. + if newcap <= 0 { + return newLen + } + return newcap +} diff --git a/internal/runtime/z_slice.go b/internal/runtime/z_slice.go index f20924fb..e6f9845c 100644 --- a/internal/runtime/z_slice.go +++ b/internal/runtime/z_slice.go @@ -70,4 +70,25 @@ func SliceData(s Slice) unsafe.Pointer { return s.data } +// SliceAppend append elem data and returns a slice. +func SliceAppend(src Slice, data unsafe.Pointer, num, etSize int) Slice { + if etSize == 0 { + return src + } + oldLen := src.len + newLen := src.len + num + if newLen > src.cap { + newCap := nextslicecap(newLen, src.cap) + p := AllocZ(uintptr(newCap * etSize)) + if oldLen != 0 { + c.Memcpy(p, src.data, uintptr(oldLen*etSize)) + } + src.data = p + src.cap = newCap + } + src.len = newLen + c.Memcpy(c.Advance(src.data, oldLen*etSize), data, uintptr(num*etSize)) + return src +} + // ----------------------------------------------------------------------------- diff --git a/ssa/expr.go b/ssa/expr.go index b532984a..420ceb97 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -632,6 +632,36 @@ func (b Builder) StringLen(x Expr) Expr { return Expr{ptr, prog.Int()} } +// SliceData returns the data pointer of a slice. +func (b Builder) SliceData(x Expr) Expr { + if debugInstr { + log.Printf("SliceData %v\n", x.impl) + } + prog := b.Prog + ptr := llvm.CreateExtractValue(b.impl, x.impl, 0) + return Expr{ptr, prog.CStr()} +} + +// SliceLen returns the length of a slice. +func (b Builder) SliceLen(x Expr) Expr { + if debugInstr { + log.Printf("SliceLen %v\n", x.impl) + } + prog := b.Prog + ptr := llvm.CreateExtractValue(b.impl, x.impl, 1) + return Expr{ptr, prog.Int()} +} + +// SliceCap returns the length of a slice cap. +func (b Builder) SliceCap(x Expr) Expr { + if debugInstr { + log.Printf("SliceCap %v\n", x.impl) + } + prog := b.Prog + ptr := llvm.CreateExtractValue(b.impl, x.impl, 2) + return Expr{ptr, prog.Int()} +} + // The IndexAddr instruction yields the address of the element at // index `idx` of collection `x`. `idx` is an integer expression. // @@ -653,8 +683,7 @@ func (b Builder) IndexAddr(x, idx Expr) Expr { pt := prog.Pointer(telem) switch x.raw.Type.Underlying().(type) { case *types.Slice: - pkg := b.Func.Pkg - ptr := b.InlineCall(pkg.rtFunc("SliceData"), x) + ptr := b.SliceData(x) indices := []llvm.Value{idx.impl} return Expr{llvm.CreateInBoundsGEP(b.impl, telem.ll, ptr.impl, indices), pt} } @@ -757,12 +786,12 @@ func (b Builder) Slice(x, low, high, max Expr) (ret Expr) { return case *types.Slice: nEltSize = b.SizeOf(prog.Index(x.Type)) - nCap = b.InlineCall(pkg.rtFunc("SliceCap"), x) + nCap = b.SliceCap(x) if high.IsNil() { - high = b.InlineCall(pkg.rtFunc("SliceLen"), x) + high = b.SliceCap(x) } ret.Type = x.Type - base = b.InlineCall(pkg.rtFunc("SliceData"), x) + base = b.SliceData(x) case *types.Pointer: telem := t.Elem() switch te := telem.Underlying().(type) { @@ -1297,21 +1326,40 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) { case "len": if len(args) == 1 { arg := args[0] - switch t := arg.raw.Type.Underlying().(type) { - case *types.Slice: - return b.InlineCall(b.Func.Pkg.rtFunc("SliceLen"), arg) - case *types.Basic: - if t.Kind() == types.String { - return b.StringLen(arg) - } + switch arg.kind { + case vkSlice: + return b.SliceLen(arg) + case vkString: + return b.StringLen(arg) } } case "cap": if len(args) == 1 { arg := args[0] - switch arg.raw.Type.Underlying().(type) { - case *types.Slice: - return b.InlineCall(b.Func.Pkg.rtFunc("SliceCap"), arg) + switch arg.kind { + case vkSlice: + return b.SliceCap(arg) + } + } + case "append": + if len(args) == 2 { + src := args[0] + if src.kind == vkSlice { + elem := args[1] + switch elem.kind { + case vkSlice: + etSize := b.Prog.SizeOf(b.Prog.Elem(elem.Type)) + ret.Type = src.Type + ret.impl = b.InlineCall(b.Func.Pkg.rtFunc("SliceAppend"), + src, b.SliceData(elem), b.SliceLen(elem), b.Prog.Val(int(etSize))).impl + return + case vkString: + etSize := b.Prog.SizeOf(b.Prog.Type(types.Typ[types.Byte], InGo)) + ret.Type = src.Type + ret.impl = b.InlineCall(b.Func.Pkg.rtFunc("SliceAppend"), + src, b.StringData(elem), b.StringLen(elem), b.Prog.Val(int(etSize))).impl + return + } } } } diff --git a/ssa/type.go b/ssa/type.go index 735a3d90..c10e7da6 100644 --- a/ssa/type.go +++ b/ssa/type.go @@ -45,6 +45,7 @@ const ( vkClosure vkPyFuncRef vkTuple + vkSlice vkPhisExpr = -1 ) @@ -103,7 +104,10 @@ func (p Program) Pointer(typ Type) Type { } func (p Program) Elem(typ Type) Type { - elem := typ.raw.Type.(*types.Pointer).Elem() + elem := typ.raw.Type.(interface { + types.Type + Elem() types.Type + }).Elem() return p.rawType(elem) } @@ -237,7 +241,7 @@ func (p Program) toType(raw types.Type) Type { case *types.Interface: return &aType{p.rtIface(), typ, vkInvalid} case *types.Slice: - return &aType{p.rtSlice(), typ, vkInvalid} + return &aType{p.rtSlice(), typ, vkSlice} case *types.Map: return &aType{p.rtMap(), typ, vkInvalid} case *types.Struct: