From feb28ecace3dda85fc8aa05359e6a1d9dc608fc3 Mon Sep 17 00:00:00 2001 From: visualfc Date: Thu, 16 May 2024 20:14:04 +0800 Subject: [PATCH] ssa: fix castInt --- cl/_testdata/print/out.ll | 6 ++-- cl/_testrt/builtin/in.go | 2 +- cl/_testrt/builtin/out.ll | 2 +- cl/_testrt/cast/out.ll | 2 +- cl/_testrt/mask/out.ll | 6 ++-- internal/abi/llgo_autogen.lla | Bin 1679 -> 1680 bytes internal/runtime/llgo_autogen.lla | Bin 6610 -> 6611 bytes ssa/expr.go | 55 ++++++++++++++++-------------- 8 files changed, 39 insertions(+), 34 deletions(-) diff --git a/cl/_testdata/print/out.ll b/cl/_testdata/print/out.ll index 2e91fdad..691e954e 100644 --- a/cl/_testdata/print/out.ll +++ b/cl/_testdata/print/out.ll @@ -322,7 +322,7 @@ _llgo_15: ; preds = %_llgo_13 br i1 %40, label %_llgo_16, label %_llgo_17 _llgo_16: ; preds = %_llgo_15 - %41 = sext i8 %39 to i64 + %41 = zext i8 %39 to i64 call void @main.printuint(i64 %41) br label %_llgo_1 @@ -335,7 +335,7 @@ _llgo_17: ; preds = %_llgo_15 br i1 %46, label %_llgo_18, label %_llgo_19 _llgo_18: ; preds = %_llgo_17 - %47 = sext i16 %45 to i64 + %47 = zext i16 %45 to i64 call void @main.printuint(i64 %47) br label %_llgo_1 @@ -348,7 +348,7 @@ _llgo_19: ; preds = %_llgo_17 br i1 %52, label %_llgo_20, label %_llgo_21 _llgo_20: ; preds = %_llgo_19 - %53 = sext i32 %51 to i64 + %53 = zext i32 %51 to i64 call void @main.printuint(i64 %53) br label %_llgo_1 diff --git a/cl/_testrt/builtin/in.go b/cl/_testrt/builtin/in.go index 00857a49..cb936a02 100644 --- a/cl/_testrt/builtin/in.go +++ b/cl/_testrt/builtin/in.go @@ -25,5 +25,5 @@ func main() { data = append(data, "def"...) println(data) var i any = 100 - println(true, 100, -100, uint(100), int32(-100), 100.5, i, &i, uintptr(unsafe.Pointer(&i))) + println(true, 100, -100, uint(255), int32(-100), 100.5, i, &i, uintptr(unsafe.Pointer(&i))) } diff --git a/cl/_testrt/builtin/out.ll b/cl/_testrt/builtin/out.ll index 5cd53638..70a9fb85 100644 --- a/cl/_testrt/builtin/out.ll +++ b/cl/_testrt/builtin/out.ll @@ -292,7 +292,7 @@ _llgo_0: call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 -100) %129 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @37, i64 1) call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %129) - call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 100) + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 255) %130 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @38, i64 1) call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %130) call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 -100) diff --git a/cl/_testrt/cast/out.ll b/cl/_testrt/cast/out.ll index 65c7100b..5e6f5e05 100644 --- a/cl/_testrt/cast/out.ll +++ b/cl/_testrt/cast/out.ll @@ -199,7 +199,7 @@ _llgo_2: ; preds = %_llgo_0 define void @main.cvtUinptr(i32 %0, i64 %1) { _llgo_0: - %2 = sext i32 %0 to i64 + %2 = zext i32 %0 to i64 %3 = icmp ne i64 %2, %1 br i1 %3, label %_llgo_1, label %_llgo_2 diff --git a/cl/_testrt/mask/out.ll b/cl/_testrt/mask/out.ll index c64b738f..99f341da 100644 --- a/cl/_testrt/mask/out.ll +++ b/cl/_testrt/mask/out.ll @@ -57,7 +57,7 @@ _llgo_0: %9 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @2, i64 1) call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %9) %10 = call i8 @main.mask_shl8u(i8 127, i64 5) - %11 = sext i8 %10 to i64 + %11 = zext i8 %10 to i64 call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %11) %12 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @3, i64 1) call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %12) @@ -67,7 +67,7 @@ _llgo_0: %15 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @4, i64 1) call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %15) %16 = call i8 @main.mask_shl8u(i8 127, i64 16) - %17 = sext i8 %16 to i64 + %17 = zext i8 %16 to i64 call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %17) %18 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @5, i64 1) call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %18) @@ -81,7 +81,7 @@ _llgo_0: %23 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @7, i64 1) call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %23) %24 = call i8 @main.mask_shr8u(i8 127, i64 5) - %25 = sext i8 %24 to i64 + %25 = zext i8 %24 to i64 call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %25) %26 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @8, i64 1) call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %26) diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index f2eafdd0145b0ecc079acb9afffb6ae38f6a84ff..be9b522a510d8eca7a117fe482c55fdfb9103e45 100644 GIT binary patch delta 1630 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 size { - // ret.impl = b.impl.CreateTrunc(x.impl, t.ll, "") - // } else if typ.Info()&types.IsUnsigned != 0 { - // ret.impl = b.impl.CreateZExt(x.impl, t.ll, "") - // } else { - // ret.impl = b.impl.CreateSExt(x.impl, t.ll, "") - // } - ret.impl = castInt(b.impl, x.impl, t.ll) + ret.impl = castInt(b, x.impl, t) return } else if xtyp.Info()&types.IsFloat != 0 { if typ.Info()&types.IsUnsigned != 0 { @@ -1099,11 +1090,7 @@ func (b Builder) Convert(t Type, x Expr) (ret Expr) { } return } else if xtyp.Info()&types.IsFloat != 0 { - if xsize > size { - ret.impl = b.impl.CreateFPTrunc(x.impl, t.ll, "") - } else { - ret.impl = b.impl.CreateFPExt(x.impl, t.ll, "") - } + ret.impl = castFloat(b, x.impl, t) return } } @@ -1115,15 +1102,33 @@ func (b Builder) Convert(t Type, x Expr) (ret Expr) { panic("todo") } -func castInt(b llvm.Builder, x llvm.Value, t llvm.Type) llvm.Value { - xt := x.Type() - if xt.TypeKind() == llvm.PointerTypeKind { - return llvm.CreatePtrToInt(b, x, t) +func castUintptr(b Builder, x llvm.Value, typ Type) llvm.Value { + if x.Type().TypeKind() == llvm.PointerTypeKind { + return llvm.CreatePtrToInt(b.impl, x, typ.ll) } - if xt.IntTypeWidth() <= t.IntTypeWidth() { - return llvm.CreateIntCast(b, x, t) + return castInt(b, x, typ) +} + +func castInt(b Builder, x llvm.Value, typ Type) llvm.Value { + xsize := b.Prog.td.TypeAllocSize(x.Type()) + size := b.Prog.td.TypeAllocSize(typ.ll) + if xsize > size { + return b.impl.CreateTrunc(x, typ.ll, "") + } else if typ.kind == vkUnsigned { + return b.impl.CreateZExt(x, typ.ll, "") + } else { + return b.impl.CreateSExt(x, typ.ll, "") + } +} + +func castFloat(b Builder, x llvm.Value, typ Type) llvm.Value { + xsize := b.Prog.td.TypeAllocSize(x.Type()) + size := b.Prog.td.TypeAllocSize(typ.ll) + if xsize > size { + return b.impl.CreateFPTrunc(x, typ.ll, "") + } else { + return b.impl.CreateFPExt(x, typ.ll, "") } - return llvm.CreateTrunc(b, x, t) } func castPtr(b llvm.Builder, x llvm.Value, t llvm.Type) llvm.Value { @@ -1245,12 +1250,12 @@ func (b Builder) TypeAssert(x Expr, assertedTyp Type, commaOk bool) (ret Expr) { conv := func(v llvm.Value) llvm.Value { switch kind { case types.Float32: - v = castInt(b.impl, v, b.Prog.tyInt32()) + v = castInt(b, v, b.Prog.Type(types.Typ[types.Int32], InC)) v = b.impl.CreateBitCast(v, assertedTyp.ll, "") case types.Float64: v = b.impl.CreateBitCast(v, assertedTyp.ll, "") default: - v = castInt(b.impl, v, assertedTyp.ll) + v = castInt(b, v, assertedTyp) } return v }