From e7fd038493e4ad9974f490c36e140bf647d6dcec Mon Sep 17 00:00:00 2001 From: visualfc Date: Sat, 18 May 2024 11:08:39 +0800 Subject: [PATCH] ssa: checkIndex for index/indexAddr --- cl/_testdata/print/out.ll | 194 ++++++++++++++++-------------- cl/_testdata/utf8/in.go | 23 ++++ cl/_testdata/utf8/out.ll | 101 ++++++++++++++++ cl/_testdata/vargs/out.ll | 16 ++- cl/_testrt/concat/out.ll | 20 +-- cl/_testrt/intgen/out.ll | 110 +++++++++-------- cl/_testrt/mask/out.ll | 82 ++++++------- cl/_testrt/qsort/out.ll | 10 +- cl/_testrt/sum/out.ll | 14 ++- internal/abi/llgo_autogen.lla | Bin 1680 -> 1680 bytes internal/runtime/llgo_autogen.lla | Bin 6629 -> 6810 bytes ssa/expr.go | 30 ++++- 12 files changed, 389 insertions(+), 211 deletions(-) create mode 100644 cl/_testdata/utf8/in.go create mode 100644 cl/_testdata/utf8/out.ll diff --git a/cl/_testdata/print/out.ll b/cl/_testdata/print/out.ll index 2fd4a841..dd88c08e 100644 --- a/cl/_testdata/print/out.ll +++ b/cl/_testdata/print/out.ll @@ -555,64 +555,66 @@ _llgo_24: ; preds = %_llgo_22 br label %_llgo_12 _llgo_25: ; preds = %_llgo_27 - %43 = fptosi double %59 to i64 - %44 = add i64 %60, 2 + %43 = fptosi double %60 to i64 + %44 = add i64 %61, 2 %45 = add i64 %43, 48 %46 = trunc i64 %45 to i8 - %47 = getelementptr inbounds i8, ptr %11, i64 %44 - store i8 %46, ptr %47, align 1 - %48 = sitofp i64 %43 to double - %49 = fsub double %59, %48 - %50 = fmul double %49, 1.000000e+01 - %51 = add i64 %60, 1 + %47 = icmp slt i64 %44, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %47) + %48 = getelementptr inbounds i8, ptr %11, i64 %44 + store i8 %46, ptr %48, align 1 + %49 = sitofp i64 %43 to double + %50 = fsub double %60, %49 + %51 = fmul double %50, 1.000000e+01 + %52 = add i64 %61, 1 br label %_llgo_27 _llgo_26: ; preds = %_llgo_27 - %52 = getelementptr inbounds i8, ptr %11, i64 2 - %53 = load i8, ptr %52, align 1 - %54 = getelementptr inbounds i8, ptr %11, i64 1 - store i8 %53, ptr %54, align 1 - %55 = getelementptr inbounds i8, ptr %11, i64 2 - store i8 46, ptr %55, align 1 - %56 = getelementptr inbounds i8, ptr %11, i64 9 - store i8 101, ptr %56, align 1 - %57 = getelementptr inbounds i8, ptr %11, i64 10 - store i8 43, ptr %57, align 1 - %58 = icmp slt i64 %19, 0 - br i1 %58, label %_llgo_28, label %_llgo_29 + %53 = getelementptr inbounds i8, ptr %11, i64 2 + %54 = load i8, ptr %53, align 1 + %55 = getelementptr inbounds i8, ptr %11, i64 1 + store i8 %54, ptr %55, align 1 + %56 = getelementptr inbounds i8, ptr %11, i64 2 + store i8 46, ptr %56, align 1 + %57 = getelementptr inbounds i8, ptr %11, i64 9 + store i8 101, ptr %57, align 1 + %58 = getelementptr inbounds i8, ptr %11, i64 10 + store i8 43, ptr %58, align 1 + %59 = icmp slt i64 %19, 0 + br i1 %59, label %_llgo_28, label %_llgo_29 _llgo_27: ; preds = %_llgo_25, %_llgo_12 - %59 = phi double [ %18, %_llgo_12 ], [ %50, %_llgo_25 ] - %60 = phi i64 [ 0, %_llgo_12 ], [ %51, %_llgo_25 ] - %61 = icmp slt i64 %60, 7 - br i1 %61, label %_llgo_25, label %_llgo_26 + %60 = phi double [ %18, %_llgo_12 ], [ %51, %_llgo_25 ] + %61 = phi i64 [ 0, %_llgo_12 ], [ %52, %_llgo_25 ] + %62 = icmp slt i64 %61, 7 + br i1 %62, label %_llgo_25, label %_llgo_26 _llgo_28: ; preds = %_llgo_26 - %62 = sub i64 0, %19 - %63 = getelementptr inbounds i8, ptr %11, i64 10 - store i8 45, ptr %63, align 1 + %63 = sub i64 0, %19 + %64 = getelementptr inbounds i8, ptr %11, i64 10 + store i8 45, ptr %64, align 1 br label %_llgo_29 _llgo_29: ; preds = %_llgo_28, %_llgo_26 - %64 = phi i64 [ %19, %_llgo_26 ], [ %62, %_llgo_28 ] - %65 = sdiv i64 %64, 100 - %66 = trunc i64 %65 to i8 - %67 = add i8 %66, 48 - %68 = getelementptr inbounds i8, ptr %11, i64 11 - store i8 %67, ptr %68, align 1 - %69 = sdiv i64 %64, 10 - %70 = trunc i64 %69 to i8 - %71 = urem i8 %70, 10 - %72 = add i8 %71, 48 - %73 = getelementptr inbounds i8, ptr %11, i64 12 - store i8 %72, ptr %73, align 1 - %74 = srem i64 %64, 10 - %75 = trunc i64 %74 to i8 - %76 = add i8 %75, 48 - %77 = getelementptr inbounds i8, ptr %11, i64 13 - store i8 %76, ptr %77, align 1 - %78 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %11, i64 1, i64 14, i64 0, i64 14, i64 14) - call void @main.gwrite(%"github.com/goplus/llgo/internal/runtime.Slice" %78) + %65 = phi i64 [ %19, %_llgo_26 ], [ %63, %_llgo_28 ] + %66 = sdiv i64 %65, 100 + %67 = trunc i64 %66 to i8 + %68 = add i8 %67, 48 + %69 = getelementptr inbounds i8, ptr %11, i64 11 + store i8 %68, ptr %69, align 1 + %70 = sdiv i64 %65, 10 + %71 = trunc i64 %70 to i8 + %72 = urem i8 %71, 10 + %73 = add i8 %72, 48 + %74 = getelementptr inbounds i8, ptr %11, i64 12 + store i8 %73, ptr %74, align 1 + %75 = srem i64 %65, 10 + %76 = trunc i64 %75 to i8 + %77 = add i8 %76, 48 + %78 = getelementptr inbounds i8, ptr %11, i64 13 + store i8 %77, ptr %78, align 1 + %79 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %11, i64 1, i64 14, i64 0, i64 14, i64 14) + call void @main.gwrite(%"github.com/goplus/llgo/internal/runtime.Slice" %79) ret void } @@ -622,43 +624,49 @@ _llgo_0: br label %_llgo_3 _llgo_1: ; preds = %_llgo_3 - %2 = urem i64 %14, 16 + %2 = urem i64 %17, 16 %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @10, i64 16) %4 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %3, 0 %5 = getelementptr inbounds i8, ptr %4, i64 %2 %6 = load i8, ptr %5, align 1 - %7 = getelementptr inbounds i8, ptr %1, i64 %15 - store i8 %6, ptr %7, align 1 - %8 = icmp ult i64 %14, 16 - br i1 %8, label %_llgo_5, label %_llgo_4 + %7 = icmp slt i64 %18, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %7) + %8 = getelementptr inbounds i8, ptr %1, i64 %18 + store i8 %6, ptr %8, align 1 + %9 = icmp ult i64 %17, 16 + br i1 %9, label %_llgo_5, label %_llgo_4 _llgo_2: ; preds = %_llgo_5, %_llgo_3 - %9 = sub i64 %15, 1 - %10 = getelementptr inbounds i8, ptr %1, i64 %9 - store i8 120, ptr %10, align 1 - %11 = sub i64 %9, 1 - %12 = getelementptr inbounds i8, ptr %1, i64 %11 - store i8 48, ptr %12, align 1 - %13 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 100, i64 %11, i64 100, i64 100) - call void @main.gwrite(%"github.com/goplus/llgo/internal/runtime.Slice" %13) + %10 = sub i64 %18, 1 + %11 = icmp slt i64 %10, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %11) + %12 = getelementptr inbounds i8, ptr %1, i64 %10 + store i8 120, ptr %12, align 1 + %13 = sub i64 %10, 1 + %14 = icmp slt i64 %13, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %14) + %15 = getelementptr inbounds i8, ptr %1, i64 %13 + store i8 48, ptr %15, align 1 + %16 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 100, i64 %13, i64 100, i64 100) + call void @main.gwrite(%"github.com/goplus/llgo/internal/runtime.Slice" %16) ret void _llgo_3: ; preds = %_llgo_4, %_llgo_0 - %14 = phi i64 [ %0, %_llgo_0 ], [ %17, %_llgo_4 ] - %15 = phi i64 [ 99, %_llgo_0 ], [ %18, %_llgo_4 ] - %16 = icmp sgt i64 %15, 0 - br i1 %16, label %_llgo_1, label %_llgo_2 + %17 = phi i64 [ %0, %_llgo_0 ], [ %20, %_llgo_4 ] + %18 = phi i64 [ 99, %_llgo_0 ], [ %21, %_llgo_4 ] + %19 = icmp sgt i64 %18, 0 + br i1 %19, label %_llgo_1, label %_llgo_2 _llgo_4: ; preds = %_llgo_5, %_llgo_1 - %17 = udiv i64 %14, 16 - %18 = sub i64 %15, 1 + %20 = udiv i64 %17, 16 + %21 = sub i64 %18, 1 br label %_llgo_3 _llgo_5: ; preds = %_llgo_1 - %19 = sub i64 100, %15 - %20 = load i64, ptr @main.minhexdigits, align 4 - %21 = icmp sge i64 %19, %20 - br i1 %21, label %_llgo_2, label %_llgo_4 + %22 = sub i64 100, %18 + %23 = load i64, ptr @main.minhexdigits, align 4 + %24 = icmp sge i64 %22, %23 + br i1 %24, label %_llgo_2, label %_llgo_4 } define void @main.printint(i64 %0) { @@ -690,23 +698,25 @@ _llgo_1: ; preds = %_llgo_5, %_llgo_0 br i1 %4, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %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 - br i1 %8, label %_llgo_4, label %_llgo_5 + %5 = icmp slt i64 %3, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %5) + %6 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 + %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %6, i64 %3 + %8 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %7, align 8 + %9 = icmp ne i64 %3, 0 + br i1 %9, label %_llgo_4, label %_llgo_5 _llgo_3: ; preds = %_llgo_1 call void @main.printnl() ret void _llgo_4: ; preds = %_llgo_2 - %9 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @12, i64 1) - call void @main.printstring(%"github.com/goplus/llgo/internal/runtime.String" %9) + %10 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @12, i64 1) + call void @main.printstring(%"github.com/goplus/llgo/internal/runtime.String" %10) br label %_llgo_5 _llgo_5: ; preds = %_llgo_4, %_llgo_2 - call void @main.printany(%"github.com/goplus/llgo/internal/runtime.iface" %7) + call void @main.printany(%"github.com/goplus/llgo/internal/runtime.iface" %8) br label %_llgo_1 } @@ -737,28 +747,30 @@ _llgo_0: br label %_llgo_3 _llgo_1: ; preds = %_llgo_3 - %2 = urem i64 %8, 10 + %2 = urem i64 %9, 10 %3 = add i64 %2, 48 %4 = trunc i64 %3 to i8 - %5 = getelementptr inbounds i8, ptr %1, i64 %9 - store i8 %4, ptr %5, align 1 - %6 = icmp ult i64 %8, 10 - br i1 %6, label %_llgo_2, label %_llgo_4 + %5 = icmp slt i64 %10, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %5) + %6 = getelementptr inbounds i8, ptr %1, i64 %10 + store i8 %4, ptr %6, align 1 + %7 = icmp ult i64 %9, 10 + br i1 %7, label %_llgo_2, label %_llgo_4 _llgo_2: ; preds = %_llgo_3, %_llgo_1 - %7 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 100, i64 %9, i64 100, i64 100) - call void @main.gwrite(%"github.com/goplus/llgo/internal/runtime.Slice" %7) + %8 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 100, i64 %10, i64 100, i64 100) + call void @main.gwrite(%"github.com/goplus/llgo/internal/runtime.Slice" %8) ret void _llgo_3: ; preds = %_llgo_4, %_llgo_0 - %8 = phi i64 [ %0, %_llgo_0 ], [ %11, %_llgo_4 ] - %9 = phi i64 [ 99, %_llgo_0 ], [ %12, %_llgo_4 ] - %10 = icmp sgt i64 %9, 0 - br i1 %10, label %_llgo_1, label %_llgo_2 + %9 = phi i64 [ %0, %_llgo_0 ], [ %12, %_llgo_4 ] + %10 = phi i64 [ 99, %_llgo_0 ], [ %13, %_llgo_4 ] + %11 = icmp sgt i64 %10, 0 + br i1 %11, label %_llgo_1, label %_llgo_2 _llgo_4: ; preds = %_llgo_1 - %11 = udiv i64 %8, 10 - %12 = sub i64 %9, 1 + %12 = udiv i64 %9, 10 + %13 = sub i64 %10, 1 br label %_llgo_3 } @@ -800,3 +812,5 @@ 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 void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1) diff --git a/cl/_testdata/utf8/in.go b/cl/_testdata/utf8/in.go new file mode 100644 index 00000000..3edfa053 --- /dev/null +++ b/cl/_testdata/utf8/in.go @@ -0,0 +1,23 @@ +package main + +import ( + "unicode/utf8" +) + +func main() { + var str = "中abcd" + for i := 0; i < len(str); { + r, n := utf8.DecodeRuneInString(str[i:]) + i += n + println(r) + } + println(index(2) == 3) +} + +var array = [...]uint8{ + 1, 2, 3, 4, 5, 6, 7, 8, +} + +func index(n int8) uint8 { + return array[n] +} diff --git a/cl/_testdata/utf8/out.ll b/cl/_testdata/utf8/out.ll new file mode 100644 index 00000000..c9aebbfd --- /dev/null +++ b/cl/_testdata/utf8/out.ll @@ -0,0 +1,101 @@ +; ModuleID = 'main' +source_filename = "main" + +%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } + +@main.array = global [8 x i8] undef +@"main.init$guard" = global ptr null +@__llgo_argc = global ptr null +@__llgo_argv = global ptr null +@0 = private unnamed_addr constant [8 x i8] c"\E4\B8\ADabcd\00", align 1 +@1 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@2 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@3 = private unnamed_addr constant [8 x i8] c"\E4\B8\ADabcd\00", align 1 + +define i8 @main.index(i8 %0) { +_llgo_0: + %1 = icmp slt i8 %0, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %1) + %2 = zext i8 %0 to i64 + %3 = getelementptr inbounds i8, ptr @main.array, i64 %2 + %4 = load i8, ptr %3, align 1 + ret i8 %4 +} + +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 @"unicode/utf8.init"() + store i8 1, ptr @main.array, align 1 + store i8 2, ptr getelementptr inbounds (i8, ptr @main.array, i64 1), align 1 + store i8 3, ptr getelementptr inbounds (i8, ptr @main.array, i64 2), align 1 + store i8 4, ptr getelementptr inbounds (i8, ptr @main.array, i64 3), align 1 + store i8 5, ptr getelementptr inbounds (i8, ptr @main.array, i64 4), align 1 + store i8 6, ptr getelementptr inbounds (i8, ptr @main.array, i64 5), align 1 + store i8 7, ptr getelementptr inbounds (i8, ptr @main.array, i64 6), align 1 + store i8 8, ptr getelementptr inbounds (i8, ptr @main.array, i64 7), align 1 + 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() + br label %_llgo_3 + +_llgo_1: ; preds = %_llgo_3 + %2 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @0, i64 7) + %3 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %2, 1 + %4 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String" %2, i64 %14, i64 %3) + %5 = call { i32, i64 } @"unicode/utf8.DecodeRuneInString"(%"github.com/goplus/llgo/internal/runtime.String" %4) + %6 = extractvalue { i32, i64 } %5, 0 + %7 = extractvalue { i32, i64 } %5, 1 + %8 = add i64 %14, %7 + %9 = sext i32 %6 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %9) + %10 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @1, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %10) + br label %_llgo_3 + +_llgo_2: ; preds = %_llgo_3 + %11 = call i8 @main.index(i8 2) + %12 = icmp eq i8 %11, 3 + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %12) + %13 = 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" %13) + ret i32 0 + +_llgo_3: ; preds = %_llgo_1, %_llgo_0 + %14 = phi i64 [ 0, %_llgo_0 ], [ %8, %_llgo_1 ] + %15 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @3, i64 7) + %16 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %15, 1 + %17 = icmp slt i64 %14, %16 + br i1 %17, label %_llgo_1, label %_llgo_2 +} + +declare void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1) + +declare void @"unicode/utf8.init"() + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +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 { i32, i64 } @"unicode/utf8.DecodeRuneInString"(%"github.com/goplus/llgo/internal/runtime.String") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) diff --git a/cl/_testdata/vargs/out.ll b/cl/_testdata/vargs/out.ll index 7c75776b..def89a93 100644 --- a/cl/_testdata/vargs/out.ll +++ b/cl/_testdata/vargs/out.ll @@ -58,12 +58,14 @@ _llgo_1: ; preds = %_llgo_2, %_llgo_0 br i1 %4, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %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) - %9 = call i64 @"github.com/goplus/llgo/internal/runtime.I2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %7, ptr %8) - %10 = call i32 (ptr, ...) @printf(ptr @0, i64 %9) + %5 = icmp slt i64 %3, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %5) + %6 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 + %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.iface", ptr %6, i64 %3 + %8 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %7, align 8 + %9 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %10 = call i64 @"github.com/goplus/llgo/internal/runtime.I2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %8, ptr %9) + %11 = call i32 (ptr, ...) @printf(ptr @0, i64 %10) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -80,6 +82,8 @@ 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 void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1) + 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/concat/out.ll b/cl/_testrt/concat/out.ll index 00c7d18a..19f0abd8 100644 --- a/cl/_testrt/concat/out.ll +++ b/cl/_testrt/concat/out.ll @@ -25,8 +25,8 @@ _llgo_0: br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %5 = phi ptr [ %3, %_llgo_0 ], [ %18, %_llgo_2 ] - %6 = phi i64 [ %4, %_llgo_0 ], [ %19, %_llgo_2 ] + %5 = phi ptr [ %3, %_llgo_0 ], [ %19, %_llgo_2 ] + %6 = phi i64 [ %4, %_llgo_0 ], [ %20, %_llgo_2 ] %7 = phi i64 [ -1, %_llgo_0 ], [ %12, %_llgo_2 ] %8 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %8, i32 0, i32 0 @@ -39,12 +39,14 @@ _llgo_1: ; preds = %_llgo_2, %_llgo_0 br i1 %13, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %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) - %18 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %17, 0 - %19 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %17, 1 + %14 = icmp slt i64 %12, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %14) + %15 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 + %16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i64 %12 + %17 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %16, align 8 + %18 = 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" %17) + %19 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %18, 0 + %20 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %18, 1 br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -100,6 +102,8 @@ _llgo_0: ret i32 0 } +declare void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1) + 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 a344eb5f..1fe32d61 100644 --- a/cl/_testrt/intgen/out.ll +++ b/cl/_testrt/intgen/out.ll @@ -29,9 +29,11 @@ _llgo_2: ; preds = %_llgo_1 %9 = extractvalue { ptr, ptr } %1, 1 %10 = extractvalue { ptr, ptr } %1, 0 %11 = call i32 %10(ptr %9) - %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 + %12 = icmp slt i64 %7, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %12) + %13 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %4, 0 + %14 = getelementptr inbounds i32, ptr %13, i64 %7 + store i32 %11, ptr %14, align 4 br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -86,69 +88,75 @@ _llgo_1: ; preds = %_llgo_2, %_llgo_0 br i1 %10, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %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) + %11 = icmp slt i64 %9, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %11) + %12 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %6, 0 + %13 = getelementptr inbounds i32, ptr %12, i64 %9 + %14 = load i32, ptr %13, align 4 + %15 = call i32 (ptr, ...) @printf(ptr @0, i32 %14) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 - %15 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 4) - store i32 1, ptr %15, align 4 - %16 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) - %17 = getelementptr inbounds { ptr }, ptr %16, i32 0, i32 0 - store ptr %15, ptr %17, align 8 - %18 = alloca { ptr, ptr }, align 8 - %19 = getelementptr inbounds { ptr, ptr }, ptr %18, i32 0, i32 0 - store ptr @"main.main$1", ptr %19, align 8 - %20 = getelementptr inbounds { ptr, ptr }, ptr %18, i32 0, i32 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 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %22, 1 + %16 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 4) + store i32 1, ptr %16, align 4 + %17 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) + %18 = getelementptr inbounds { ptr }, ptr %17, i32 0, i32 0 + store ptr %16, ptr %18, align 8 + %19 = alloca { ptr, ptr }, align 8 + %20 = getelementptr inbounds { ptr, ptr }, ptr %19, i32 0, i32 0 + store ptr @"main.main$1", ptr %20, align 8 + %21 = getelementptr inbounds { ptr, ptr }, ptr %19, i32 0, i32 1 + store ptr %17, ptr %21, align 8 + %22 = load { ptr, ptr }, ptr %19, align 8 + %23 = call %"github.com/goplus/llgo/internal/runtime.Slice" @main.genInts(i64 5, { ptr, ptr } %22) + %24 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %23, 1 br label %_llgo_4 _llgo_4: ; preds = %_llgo_5, %_llgo_3 - %24 = phi i64 [ -1, %_llgo_3 ], [ %25, %_llgo_5 ] - %25 = add i64 %24, 1 - %26 = icmp slt i64 %25, %23 - br i1 %26, label %_llgo_5, label %_llgo_6 + %25 = phi i64 [ -1, %_llgo_3 ], [ %26, %_llgo_5 ] + %26 = add i64 %25, 1 + %27 = icmp slt i64 %26, %24 + br i1 %27, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 - %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) + %28 = icmp slt i64 %26, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %28) + %29 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %23, 0 + %30 = getelementptr inbounds i32, ptr %29, i64 %26 + %31 = load i32, ptr %30, align 4 + %32 = call i32 (ptr, ...) @printf(ptr @1, i32 %31) br label %_llgo_4 _llgo_6: ; preds = %_llgo_4 - %31 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 4) - %32 = getelementptr inbounds %main.generator, ptr %31, i32 0, i32 0 - store i32 1, ptr %32, align 4 - %33 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) - %34 = getelementptr inbounds { ptr }, ptr %33, i32 0, i32 0 - store ptr %31, ptr %34, align 8 - %35 = alloca { ptr, ptr }, align 8 - %36 = getelementptr inbounds { ptr, ptr }, ptr %35, i32 0, i32 0 - store ptr @"main.next$bound", ptr %36, align 8 - %37 = getelementptr inbounds { ptr, ptr }, ptr %35, i32 0, i32 1 - 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 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %39, 1 + %33 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 4) + %34 = getelementptr inbounds %main.generator, ptr %33, i32 0, i32 0 + store i32 1, ptr %34, align 4 + %35 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) + %36 = getelementptr inbounds { ptr }, ptr %35, i32 0, i32 0 + store ptr %33, ptr %36, align 8 + %37 = alloca { ptr, ptr }, align 8 + %38 = getelementptr inbounds { ptr, ptr }, ptr %37, i32 0, i32 0 + store ptr @"main.next$bound", ptr %38, align 8 + %39 = getelementptr inbounds { ptr, ptr }, ptr %37, i32 0, i32 1 + store ptr %35, ptr %39, align 8 + %40 = load { ptr, ptr }, ptr %37, align 8 + %41 = call %"github.com/goplus/llgo/internal/runtime.Slice" @main.genInts(i64 5, { ptr, ptr } %40) + %42 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %41, 1 br label %_llgo_7 _llgo_7: ; preds = %_llgo_8, %_llgo_6 - %41 = phi i64 [ -1, %_llgo_6 ], [ %42, %_llgo_8 ] - %42 = add i64 %41, 1 - %43 = icmp slt i64 %42, %40 - br i1 %43, label %_llgo_8, label %_llgo_9 + %43 = phi i64 [ -1, %_llgo_6 ], [ %44, %_llgo_8 ] + %44 = add i64 %43, 1 + %45 = icmp slt i64 %44, %42 + br i1 %45, label %_llgo_8, label %_llgo_9 _llgo_8: ; preds = %_llgo_7 - %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) + %46 = icmp slt i64 %44, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %46) + %47 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %41, 0 + %48 = getelementptr inbounds i32, ptr %47, i64 %44 + %49 = load i32, ptr %48, align 4 + %50 = call i32 (ptr, ...) @printf(ptr @2, i32 %49) br label %_llgo_7 _llgo_9: ; preds = %_llgo_7 @@ -159,6 +167,8 @@ 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 void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1) + declare void @"github.com/goplus/llgo/internal/runtime.init"() declare i32 @rand() diff --git a/cl/_testrt/mask/out.ll b/cl/_testrt/mask/out.ll index 6ebc1e08..68d454fe 100644 --- a/cl/_testrt/mask/out.ll +++ b/cl/_testrt/mask/out.ll @@ -16,12 +16,6 @@ source_filename = "main" @7 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 @8 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 @9 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 -@10 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 -@11 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 -@12 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 -@13 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 -@14 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 -@15 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 define void @main.init() { _llgo_0: @@ -105,71 +99,65 @@ _llgo_0: define i64 @main.mask_shl(i64 %0, i64 %1) { _llgo_0: %2 = icmp slt i64 %1, 0 - %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @10, i64 21) - call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) - %4 = icmp uge i64 %1, 64 - %5 = shl i64 %0, %1 - %6 = select i1 %4, i64 0, i64 %5 - ret i64 %6 + call void @"github.com/goplus/llgo/internal/runtime.AssertNegativeShift"(i1 %2) + %3 = icmp uge i64 %1, 64 + %4 = shl i64 %0, %1 + %5 = select i1 %3, i64 0, i64 %4 + ret i64 %5 } define i8 @main.mask_shl8(i8 %0, i64 %1) { _llgo_0: %2 = icmp slt i64 %1, 0 - %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @11, i64 21) - call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) - %4 = trunc i64 %1 to i8 - %5 = icmp uge i8 %4, 8 - %6 = shl i8 %0, %4 - %7 = select i1 %5, i8 0, i8 %6 - ret i8 %7 + call void @"github.com/goplus/llgo/internal/runtime.AssertNegativeShift"(i1 %2) + %3 = trunc i64 %1 to i8 + %4 = icmp uge i8 %3, 8 + %5 = shl i8 %0, %3 + %6 = select i1 %4, i8 0, i8 %5 + ret i8 %6 } define i8 @main.mask_shl8u(i8 %0, i64 %1) { _llgo_0: %2 = icmp slt i64 %1, 0 - %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @12, i64 21) - call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) - %4 = trunc i64 %1 to i8 - %5 = icmp uge i8 %4, 8 - %6 = shl i8 %0, %4 - %7 = select i1 %5, i8 0, i8 %6 - ret i8 %7 + call void @"github.com/goplus/llgo/internal/runtime.AssertNegativeShift"(i1 %2) + %3 = trunc i64 %1 to i8 + %4 = icmp uge i8 %3, 8 + %5 = shl i8 %0, %3 + %6 = select i1 %4, i8 0, i8 %5 + ret i8 %6 } define i64 @main.mask_shr(i64 %0, i64 %1) { _llgo_0: %2 = icmp slt i64 %1, 0 - %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @13, i64 21) - call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) - %4 = icmp uge i64 %1, 64 - %5 = select i1 %4, i64 63, i64 %1 - %6 = ashr i64 %0, %5 - ret i64 %6 + call void @"github.com/goplus/llgo/internal/runtime.AssertNegativeShift"(i1 %2) + %3 = icmp uge i64 %1, 64 + %4 = select i1 %3, i64 63, i64 %1 + %5 = ashr i64 %0, %4 + ret i64 %5 } define i8 @main.mask_shr8(i8 %0, i64 %1) { _llgo_0: %2 = icmp slt i64 %1, 0 - %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @14, i64 21) - call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) - %4 = trunc i64 %1 to i8 - %5 = icmp uge i8 %4, 8 - %6 = select i1 %5, i8 7, i8 %4 - %7 = ashr i8 %0, %6 - ret i8 %7 + call void @"github.com/goplus/llgo/internal/runtime.AssertNegativeShift"(i1 %2) + %3 = trunc i64 %1 to i8 + %4 = icmp uge i8 %3, 8 + %5 = select i1 %4, i8 7, i8 %3 + %6 = ashr i8 %0, %5 + ret i8 %6 } define i8 @main.mask_shr8u(i8 %0, i64 %1) { _llgo_0: %2 = icmp slt i64 %1, 0 - %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @15, i64 21) - call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) - %4 = trunc i64 %1 to i8 - %5 = icmp uge i8 %4, 8 - %6 = lshr i8 %0, %4 - %7 = select i1 %5, i8 0, i8 %6 - ret i8 %7 + call void @"github.com/goplus/llgo/internal/runtime.AssertNegativeShift"(i1 %2) + %3 = trunc i64 %1 to i8 + %4 = icmp uge i8 %3, 8 + %5 = lshr i8 %0, %3 + %6 = select i1 %4, i8 0, i8 %5 + ret i8 %6 } declare void @"github.com/goplus/llgo/internal/runtime.init"() @@ -182,4 +170,4 @@ declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/ll declare void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64) -declare void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1, %"github.com/goplus/llgo/internal/runtime.String") +declare void @"github.com/goplus/llgo/internal/runtime.AssertNegativeShift"(i1) diff --git a/cl/_testrt/qsort/out.ll b/cl/_testrt/qsort/out.ll index 2d203ee1..916dd34a 100644 --- a/cl/_testrt/qsort/out.ll +++ b/cl/_testrt/qsort/out.ll @@ -48,9 +48,11 @@ _llgo_1: ; preds = %_llgo_2, %_llgo_0 br i1 %12, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %13 = getelementptr inbounds i64, ptr %2, i64 %11 - %14 = load i64, ptr %13, align 4 - %15 = call i32 (ptr, ...) @printf(ptr @0, i64 %14) + %13 = icmp slt i64 %11, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %13) + %14 = getelementptr inbounds i64, ptr %2, i64 %11 + %15 = load i64, ptr %14, align 4 + %16 = call i32 (ptr, ...) @printf(ptr @0, i64 %15) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -72,4 +74,6 @@ _llgo_0: ret i32 %5 } +declare void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1) + declare i32 @printf(ptr, ...) diff --git a/cl/_testrt/sum/out.ll b/cl/_testrt/sum/out.ll index 70c4be76..e13b24a2 100644 --- a/cl/_testrt/sum/out.ll +++ b/cl/_testrt/sum/out.ll @@ -48,17 +48,19 @@ _llgo_0: br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %2 = phi i64 [ 0, %_llgo_0 ], [ %9, %_llgo_2 ] + %2 = phi i64 [ 0, %_llgo_0 ], [ %10, %_llgo_2 ] %3 = phi i64 [ -1, %_llgo_0 ], [ %4, %_llgo_2 ] %4 = add i64 %3, 1 %5 = icmp slt i64 %4, %1 br i1 %5, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %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 + %6 = icmp slt i64 %4, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %6) + %7 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 + %8 = getelementptr inbounds i64, ptr %7, i64 %4 + %9 = load i64, ptr %8, align 4 + %10 = add i64 %2, %9 br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 @@ -72,3 +74,5 @@ 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 void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1) diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index be9b522a510d8eca7a117fe482c55fdfb9103e45..cccf2f81e2804574b2566ee466b99e79cfe3bc60 100644 GIT binary patch delta 49 zcmbQhJAs!sz?+#xgn@y9gFzr-(?niX_6w38X%{6uHd_8*Wd;gOHeoYn28vD2Vp9VE DCMpdS delta 49 zcmbQhJAs!sz?+#xgn@y9gQ0!lhKanY>~cR`(-eQWZnXTt$_x~mY{F*D3>2H3#ij-T DQ2P%M diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index 4f9b44615f8d17ef8d6221bf6adcb63592047ad1..fe0aad96088e82ff5316f40108e1ada92fd9ab77 100644 GIT binary patch literal 6810 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 z z=~VRbSMjlx<(Psno)=VK$*366+LT%>#wJ7#9m^#!ZfdH(7N}(@9aq*Z%n=o1*M}=H zyNoKA8BOp1VLwq$t*vTLr#MQip!TrfP&zJ6s zFM*Al!dypIx(L5I5Ig6kp{tzZ#f6t0>lp|St``X}X;Nx+Pk5`|5DEyk?7^JM@?KC$ zZ^$}I(8ti_&yu+9Xg81vhqs?bQ2(EM!T;xE0DymT1yB<5pX&dZ7?}StG5^cL Xs42q0{-+({-_!n={r<@u0N}p>d_}pw diff --git a/ssa/expr.go b/ssa/expr.go index 49e353d2..8132b989 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -324,9 +324,9 @@ func (b Builder) BinOp(op token.Token, x, y Expr) Expr { case token.AND_NOT: return Expr{b.impl.CreateAnd(x.impl, b.impl.CreateNot(y.impl, ""), ""), x.Type} case token.SHL, token.SHR: - if y.kind == vkSigned { + if needsNegativeCheck(y) { check := Expr{b.impl.CreateICmp(llvm.IntSLT, y.impl, llvm.ConstInt(y.ll, 0, false), ""), b.Prog.Bool()} - b.InlineCall(b.Func.Pkg.rtFunc("CheckRuntimeError"), check, b.Str("negative shift amount")) + b.InlineCall(b.Func.Pkg.rtFunc("AssertNegativeShift"), check) } xsize, ysize := b.Prog.SizeOf(x.Type), b.Prog.SizeOf(y.Type) if xsize != ysize { @@ -723,6 +723,7 @@ func (b Builder) IndexAddr(x, idx Expr) Expr { if debugInstr { log.Printf("IndexAddr %v, %v\n", x.impl, idx.impl) } + idx = b.checkIndex(idx) prog := b.Prog telem := prog.Index(x.Type) pt := prog.Pointer(telem) @@ -737,6 +738,30 @@ func (b Builder) IndexAddr(x, idx Expr) Expr { return Expr{llvm.CreateInBoundsGEP(b.impl, telem.ll, x.impl, indices), pt} } +func needsNegativeCheck(x Expr) bool { + if x.kind == vkSigned { + if rv := x.impl.IsAConstantInt(); !rv.IsNil() && rv.SExtValue() >= 0 { + return false + } + return true + } + return false +} + +// check index >= 0 and size to uint +func (b Builder) checkIndex(idx Expr) Expr { + if needsNegativeCheck(idx) { + check := Expr{b.impl.CreateICmp(llvm.IntSLT, idx.impl, llvm.ConstInt(idx.ll, 0, false), ""), b.Prog.Bool()} + b.InlineCall(b.Func.Pkg.rtFunc("AssertIndexRange"), check) + } + typ := b.Prog.Uint() + if b.Prog.SizeOf(idx.Type) < b.Prog.SizeOf(typ) { + idx.Type = typ + idx.impl = castUintptr(b, idx.impl, typ) + } + return idx +} + // The Index instruction yields element Index of collection X, an array, // string or type parameter containing an array, a string, a pointer to an, // array or a slice. @@ -768,6 +793,7 @@ func (b Builder) Index(x, idx Expr, addr func(Expr) Expr) Expr { b.Store(ptr, x) } } + idx = b.checkIndex(idx) pt := prog.Pointer(telem) indices := []llvm.Value{idx.impl} buf := Expr{llvm.CreateInBoundsGEP(b.impl, telem.ll, ptr.impl, indices), pt}