; ModuleID = 'go1.17.go'
source_filename = "go1.17.go"
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
target triple = "wasm32-unknown-wasi"

declare noalias nonnull i8* @runtime.alloc(i32, i8*, i8*, i8*)

; Function Attrs: nounwind
define hidden void @main.init(i8* %context, i8* %parentHandle) unnamed_addr #0 {
entry:
  ret void
}

; Function Attrs: nounwind
define hidden i8* @main.Add32(i8* %p, i32 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
entry:
  %0 = getelementptr i8, i8* %p, i32 %len
  ret i8* %0
}

; Function Attrs: nounwind
define hidden i8* @main.Add64(i8* %p, i64 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
entry:
  %0 = trunc i64 %len to i32
  %1 = getelementptr i8, i8* %p, i32 %0
  ret i8* %1
}

; Function Attrs: nounwind
define hidden [4 x i32]* @main.SliceToArray(i32* %s.data, i32 %s.len, i32 %s.cap, i8* %context, i8* %parentHandle) unnamed_addr #0 {
entry:
  %0 = icmp ult i32 %s.len, 4
  br i1 %0, label %slicetoarray.throw, label %slicetoarray.next

slicetoarray.throw:                               ; preds = %entry
  call void @runtime.sliceToArrayPointerPanic(i8* undef, i8* null) #0
  unreachable

slicetoarray.next:                                ; preds = %entry
  %1 = bitcast i32* %s.data to [4 x i32]*
  ret [4 x i32]* %1
}

declare void @runtime.sliceToArrayPointerPanic(i8*, i8*)

; Function Attrs: nounwind
define hidden [4 x i32]* @main.SliceToArrayConst(i8* %context, i8* %parentHandle) unnamed_addr #0 {
entry:
  %makeslice = call i8* @runtime.alloc(i32 24, i8* nonnull inttoptr (i32 3 to i8*), i8* undef, i8* null) #0
  br i1 false, label %slicetoarray.throw, label %slicetoarray.next

slicetoarray.throw:                               ; preds = %entry
  unreachable

slicetoarray.next:                                ; preds = %entry
  %0 = bitcast i8* %makeslice to [4 x i32]*
  ret [4 x i32]* %0
}

; Function Attrs: nounwind
define hidden { i32*, i32, i32 } @main.SliceInt(i32* dereferenceable_or_null(4) %ptr, i32 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
entry:
  %0 = icmp ugt i32 %len, 1073741823
  %1 = icmp eq i32* %ptr, null
  %2 = icmp ne i32 %len, 0
  %3 = and i1 %1, %2
  %4 = or i1 %3, %0
  br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next

unsafe.Slice.throw:                               ; preds = %entry
  call void @runtime.unsafeSlicePanic(i8* undef, i8* null) #0
  unreachable

unsafe.Slice.next:                                ; preds = %entry
  %5 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
  %6 = insertvalue { i32*, i32, i32 } %5, i32 %len, 1
  %7 = insertvalue { i32*, i32, i32 } %6, i32 %len, 2
  ret { i32*, i32, i32 } %7
}

declare void @runtime.unsafeSlicePanic(i8*, i8*)

; Function Attrs: nounwind
define hidden { i8*, i32, i32 } @main.SliceUint16(i8* dereferenceable_or_null(1) %ptr, i16 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
entry:
  %0 = icmp eq i8* %ptr, null
  %1 = icmp ne i16 %len, 0
  %2 = and i1 %0, %1
  br i1 %2, label %unsafe.Slice.throw, label %unsafe.Slice.next

unsafe.Slice.throw:                               ; preds = %entry
  call void @runtime.unsafeSlicePanic(i8* undef, i8* null) #0
  unreachable

unsafe.Slice.next:                                ; preds = %entry
  %3 = zext i16 %len to i32
  %4 = insertvalue { i8*, i32, i32 } undef, i8* %ptr, 0
  %5 = insertvalue { i8*, i32, i32 } %4, i32 %3, 1
  %6 = insertvalue { i8*, i32, i32 } %5, i32 %3, 2
  ret { i8*, i32, i32 } %6
}

; Function Attrs: nounwind
define hidden { i32*, i32, i32 } @main.SliceUint64(i32* dereferenceable_or_null(4) %ptr, i64 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
entry:
  %0 = icmp ugt i64 %len, 1073741823
  %1 = icmp eq i32* %ptr, null
  %2 = icmp ne i64 %len, 0
  %3 = and i1 %1, %2
  %4 = or i1 %3, %0
  br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next

unsafe.Slice.throw:                               ; preds = %entry
  call void @runtime.unsafeSlicePanic(i8* undef, i8* null) #0
  unreachable

unsafe.Slice.next:                                ; preds = %entry
  %5 = trunc i64 %len to i32
  %6 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
  %7 = insertvalue { i32*, i32, i32 } %6, i32 %5, 1
  %8 = insertvalue { i32*, i32, i32 } %7, i32 %5, 2
  ret { i32*, i32, i32 } %8
}

; Function Attrs: nounwind
define hidden { i32*, i32, i32 } @main.SliceInt64(i32* dereferenceable_or_null(4) %ptr, i64 %len, i8* %context, i8* %parentHandle) unnamed_addr #0 {
entry:
  %0 = icmp ugt i64 %len, 1073741823
  %1 = icmp eq i32* %ptr, null
  %2 = icmp ne i64 %len, 0
  %3 = and i1 %1, %2
  %4 = or i1 %3, %0
  br i1 %4, label %unsafe.Slice.throw, label %unsafe.Slice.next

unsafe.Slice.throw:                               ; preds = %entry
  call void @runtime.unsafeSlicePanic(i8* undef, i8* null) #0
  unreachable

unsafe.Slice.next:                                ; preds = %entry
  %5 = trunc i64 %len to i32
  %6 = insertvalue { i32*, i32, i32 } undef, i32* %ptr, 0
  %7 = insertvalue { i32*, i32, i32 } %6, i32 %5, 1
  %8 = insertvalue { i32*, i32, i32 } %7, i32 %5, 2
  ret { i32*, i32, i32 } %8
}

attributes #0 = { nounwind }
