From 5cf6a30027d3e258fdedc29073a35481defb052f Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 26 May 2024 14:58:26 +0800 Subject: [PATCH] llgo/ssa: phi refactor --- cl/_testgo/abiname/in.go | 16 ++++ cl/_testgo/abiname/out.ll | 99 ++++++++++++++++++++ cl/compile.go | 6 +- internal/abi/llgo_autogen.lla | Bin 6546 -> 6546 bytes internal/runtime/llgo_autogen.lla | Bin 0 -> 12124 bytes ssa/cl_test.go | 2 +- ssa/expr.go | 144 ++++++++++++++++-------------- ssa/ssa_test.go | 3 - ssa/type.go | 1 - 9 files changed, 197 insertions(+), 74 deletions(-) create mode 100644 cl/_testgo/abiname/in.go create mode 100644 cl/_testgo/abiname/out.ll create mode 100644 internal/runtime/llgo_autogen.lla diff --git a/cl/_testgo/abiname/in.go b/cl/_testgo/abiname/in.go new file mode 100644 index 00000000..eea265b5 --- /dev/null +++ b/cl/_testgo/abiname/in.go @@ -0,0 +1,16 @@ +package main + +import "github.com/goplus/llgo/internal/abi" + +// NewPkgName creates a package name. +func NewPkgName(pkgPath string) (ret abi.Name) { + if len(pkgPath) > 0 { + ret = abi.NewName(pkgPath, "", false, false) + } + return +} + +func main() { + n := NewPkgName("pkgPath") + println(n.Name(), n.Tag(), n.IsExported(), n.IsEmbedded(), n.IsBlank()) +} diff --git a/cl/_testgo/abiname/out.ll b/cl/_testgo/abiname/out.ll new file mode 100644 index 00000000..bc029667 --- /dev/null +++ b/cl/_testgo/abiname/out.ll @@ -0,0 +1,99 @@ +; ModuleID = 'main' +source_filename = "main" + +%"github.com/goplus/llgo/internal/abi.Name" = type { ptr } +%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } + +@"main.init$guard" = global ptr null +@0 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@__llgo_argc = global ptr null +@__llgo_argv = global ptr null +@1 = private unnamed_addr constant [8 x i8] c"pkgPath\00", align 1 + +define %"github.com/goplus/llgo/internal/abi.Name" @main.NewPkgName(%"github.com/goplus/llgo/internal/runtime.String" %0) { +_llgo_0: + %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %0, 1 + %2 = icmp sgt i64 %1, 0 + br i1 %2, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %3 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 0 + store ptr @0, ptr %4, align 8 + %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 1 + store i64 0, ptr %5, align 4 + %6 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %3, align 8 + %7 = call %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/abi.NewName"(%"github.com/goplus/llgo/internal/runtime.String" %0, %"github.com/goplus/llgo/internal/runtime.String" %6, i1 false, i1 false) + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + %8 = phi ptr [ zeroinitializer, %_llgo_0 ], [ %7, %_llgo_1 ] + ret ptr %8 +} + +define void @main.init() { +_llgo_0: + %0 = load i1, ptr @"main.init$guard", align 1 + br i1 %0, label %_llgo_2, label %_llgo_1 + +_llgo_1: ; preds = %_llgo_0 + store i1 true, ptr @"main.init$guard", align 1 + call void @"github.com/goplus/llgo/internal/abi.init"() + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +define i32 @main(i32 %0, ptr %1) { +_llgo_0: + store i32 %0, ptr @__llgo_argc, align 4 + store ptr %1, ptr @__llgo_argv, align 8 + call void @"github.com/goplus/llgo/internal/runtime.init"() + call void @main.init() + %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 + store ptr @1, ptr %3, align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 + store i64 7, ptr %4, align 4 + %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 + %6 = call %"github.com/goplus/llgo/internal/abi.Name" @main.NewPkgName(%"github.com/goplus/llgo/internal/runtime.String" %5) + %7 = call %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Name"(%"github.com/goplus/llgo/internal/abi.Name" %6) + %8 = call %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Tag"(%"github.com/goplus/llgo/internal/abi.Name" %6) + %9 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsExported"(%"github.com/goplus/llgo/internal/abi.Name" %6) + %10 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsEmbedded"(%"github.com/goplus/llgo/internal/abi.Name" %6) + %11 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsBlank"(%"github.com/goplus/llgo/internal/abi.Name" %6) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %7) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %8) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %9) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %10) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %11) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + ret i32 0 +} + +declare %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/abi.NewName"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", i1, i1) + +declare void @"github.com/goplus/llgo/internal/abi.init"() + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Name"(%"github.com/goplus/llgo/internal/abi.Name") + +declare %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Tag"(%"github.com/goplus/llgo/internal/abi.Name") + +declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsExported"(%"github.com/goplus/llgo/internal/abi.Name") + +declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsEmbedded"(%"github.com/goplus/llgo/internal/abi.Name") + +declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsBlank"(%"github.com/goplus/llgo/internal/abi.Name") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) diff --git a/cl/compile.go b/cl/compile.go index 991c136e..608a09de 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -522,7 +522,7 @@ func (p *context) compilePhis(b llssa.Builder, block *ssa.BasicBlock) int { } for i := 0; i < n; i++ { iv := block.Instrs[i].(*ssa.Phi) - p.bvals[iv] = rets[i].Do(b) + p.bvals[iv] = rets[i] } return n } @@ -784,7 +784,7 @@ func (p *context) compileInstr(b llssa.Builder, instr ssa.Instruction) { val := p.compileValue(b, v.Value) b.MapUpdate(m, key, val) case *ssa.Panic: - arg := p.compileValue(b, v.X).Do(b) + arg := p.compileValue(b, v.X) b.Panic(arg) default: panic(fmt.Sprintf("compileInstr: unknown instr - %T\n", instr)) @@ -856,7 +856,7 @@ func (p *context) compileValues(b llssa.Builder, vals []ssa.Value, hasVArg int) n := len(vals) - hasVArg ret := make([]llssa.Expr, n) for i := 0; i < n; i++ { - ret[i] = p.compileValue(b, vals[i]).Do(b) + ret[i] = p.compileValue(b, vals[i]) } if hasVArg > 0 { ret = p.compileVArg(ret, b, vals[n]) diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index 6e0de50e42d471f15c1ff1490315bbfdc3a4a9b6..728e9013c16896b9ccc271fed5c09ccbf53ba072 100644 GIT binary patch delta 45 zcmbPaJjs|Rz?+#xgn@y9gF&Z!B99td$lai{(7PKgeoHXvlutI5G+_$4J2_iY9RLdP B4FdoG delta 45 zcmbPaJjs|Rz?+#xgn@y9gJFW}L>@J^_pL!`A6qwC{FY#v;5yk<(uC=K>*Q=nbpRpl B4lw`# diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla new file mode 100644 index 0000000000000000000000000000000000000000..8bb2787b03ac6770f8fa5d0e706047807095e08c GIT binary patch literal 12124 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 CK*34? literal 0 HcmV?d00001 diff --git a/ssa/cl_test.go b/ssa/cl_test.go index 513944c1..0405b3f2 100644 --- a/ssa/cl_test.go +++ b/ssa/cl_test.go @@ -26,7 +26,7 @@ import ( ) func TestFromTestgo(t *testing.T) { - cltest.FromDir(t, "", "../cl/_testgo", false) + cltest.FromDir(t, "abiname", "../cl/_testgo", false) } func TestFromTestpy(t *testing.T) { diff --git a/ssa/expr.go b/ssa/expr.go index 9ff69d84..67009a18 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -41,16 +41,6 @@ func (v Expr) IsNil() bool { return v.Type == nil } -// Do evaluates the delay expression and returns the result. -func (v Expr) Do(b Builder) Expr { // TODO(xsw): can we remove this method? - switch vt := v.Type; vt.kind { - case vkPhisExpr: - e := vt.raw.Type.(*phisExprTy) - return b.aggregateValue(e.Type, e.phis...) - } - return v -} - // ----------------------------------------------------------------------------- type pyVarTy struct { @@ -73,26 +63,6 @@ func pyVarExpr(mod Expr, name string) Expr { // ----------------------------------------------------------------------------- -type phisExprTy struct { - phis []llvm.Value - Type -} - -func (p phisExprTy) Underlying() types.Type { - panic("don't call") -} - -func (p phisExprTy) String() string { - return "phisExpr" -} - -func phisExpr(t Type, phis []llvm.Value) Expr { - tphi := &aType{raw: rawType{&phisExprTy{phis, t}}, kind: vkPhisExpr} - return Expr{Type: tphi} -} - -// ----------------------------------------------------------------------------- - func (p Program) Zero(t Type) Expr { var ret llvm.Value switch u := t.raw.Type.Underlying().(type) { @@ -533,14 +503,6 @@ func llvmFields(vals []Expr, t *types.Struct, b Builder) (ret []llvm.Value) { return } -func llvmDelayValues(f func(i int) Expr, n int) []llvm.Value { - ret := make([]llvm.Value, n) - for i := 0; i < n; i++ { - ret[i] = f(i).impl - } - return ret -} - func llvmPredBlocks(preds []BasicBlock) []llvm.BasicBlock { ret := make([]llvm.BasicBlock, len(preds)) for i, v := range preds { @@ -549,36 +511,48 @@ func llvmPredBlocks(preds []BasicBlock) []llvm.BasicBlock { return ret } -// Phi represents a phi node. -type Phi struct { +type aPhi struct { Expr + phis []llvm.Value +} + +// Phi represents a phi node. +type Phi = *aPhi + +func (b Builder) newPhi(t Type, phis []llvm.Value) Phi { + ret := b.aggregateValue(t, phis...) + return &aPhi{ret, phis} } // AddIncoming adds incoming values to a phi node. func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int) Expr) { bs := llvmPredBlocks(preds) - if p.kind != vkPhisExpr { // normal phi node - vs := llvmDelayValues(f, len(preds)) - p.impl.AddIncoming(vs, bs) - return - } - e := p.raw.Type.(*phisExprTy) - phis := e.phis - vals := make([][]llvm.Value, len(phis)) - for iblk, blk := range preds { - last := blk.last.LastInstruction() - b.impl.SetInsertPointBefore(last) - impl := b.impl - val := f(iblk).impl - for i := range phis { - if iblk == 0 { - vals[i] = make([]llvm.Value, len(preds)) + phis := p.phis + if phis != nil { + vals := make([][]llvm.Value, len(phis)) + for iblk, blk := range preds { + last := blk.last.LastInstruction() + b.impl.SetInsertPointBefore(last) + impl := b.impl + val := f(iblk).impl + for i := range phis { + if iblk == 0 { + vals[i] = make([]llvm.Value, len(preds)) + } + vals[i][iblk] = llvm.CreateExtractValue(impl, val, i) } - vals[i][iblk] = llvm.CreateExtractValue(impl, val, i) } - } - for i, phi := range phis { - phi.AddIncoming(vals[i], bs) + for i, phi := range phis { + phi.AddIncoming(vals[i], bs) + } + } else { + vals := make([]llvm.Value, len(preds)) + for iblk, blk := range preds { + last := blk.last.LastInstruction() + b.impl.SetInsertPointBefore(last) + vals[iblk] = f(iblk).impl + } + p.impl.AddIncoming(vals, bs) } } @@ -590,17 +564,55 @@ func (b Builder) Phi(t Type) Phi { kind := tund.Kind() switch kind { case types.String: - prog := b.Prog - phis := make([]llvm.Value, 2) - phis[0] = llvm.CreatePHI(impl, prog.tyVoidPtr()) - phis[1] = llvm.CreatePHI(impl, prog.tyInt()) - return Phi{phisExpr(t, phis)} + phis := createStringPhis(impl, make([]llvm.Value, 0, 2), b.Prog) + return b.newPhi(t, phis) } case *types.Struct: + phis := createStrucPhis(impl, nil, tund, b.Prog) + return b.newPhi(t, phis) + default: panic("todo") } phi := llvm.CreatePHI(impl, t.ll) - return Phi{Expr{phi, t}} + return &aPhi{Expr{phi, t}, nil} +} + +func createStringPhis(b llvm.Builder, phis []llvm.Value, prog Program) []llvm.Value { + phis = append(phis, llvm.CreatePHI(b, prog.tyVoidPtr())) + return append(phis, llvm.CreatePHI(b, prog.tyInt())) +} + +func createStrucPhis(b llvm.Builder, phis []llvm.Value, t *types.Struct, prog Program) []llvm.Value { + n := t.NumFields() + if phis == nil { + phis = make([]llvm.Value, 0, n) + } + for i := 0; i < n; i++ { + fld := t.Field(i) + switch tfld := fld.Type().Underlying().(type) { + case *types.Basic: + kind := tfld.Kind() + switch kind { + case types.String: + phis = createStringPhis(b, phis, prog) + default: + phis = createBasicPhi(b, phis, tfld, prog) + } + case *types.Pointer: + phis = createBasicPhi(b, phis, tfld, prog) + case *types.Struct: + phis = createStrucPhis(b, phis, tfld, prog) + default: + panic("todo") + } + } + return phis +} + +func createBasicPhi(b llvm.Builder, phis []llvm.Value, t types.Type, prog Program) []llvm.Value { + tll := prog.rawType(t).ll + phi := llvm.CreatePHI(b, tll) + return append(phis, phi) } // ----------------------------------------------------------------------------- diff --git a/ssa/ssa_test.go b/ssa/ssa_test.go index 3e23e756..b6123bd3 100644 --- a/ssa/ssa_test.go +++ b/ssa/ssa_test.go @@ -109,9 +109,7 @@ func TestCvtType(t *testing.T) { } func TestUserdefExpr(t *testing.T) { - b := &phisExprTy{} c := &pyVarTy{} - _ = b.String() _ = c.String() test := func(a types.Type) { defer func() { @@ -121,7 +119,6 @@ func TestUserdefExpr(t *testing.T) { }() a.Underlying() } - test(b) test(c) } diff --git a/ssa/type.go b/ssa/type.go index ece67e4c..2b1f3608 100644 --- a/ssa/type.go +++ b/ssa/type.go @@ -53,7 +53,6 @@ const ( vkEface vkIface vkStruct - vkPhisExpr = -1 ) // -----------------------------------------------------------------------------