; LLVM IR from cashapp/zipline :: zipline/native/quickjs (cutils)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@utf8_first_code_mask = external hidden constant [5 x i8], align 1
@utf8_min_code = external hidden constant [5 x i32], align 16

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nounwind uwtable
define dso_local i32 @unicode_from_utf8(ptr noundef %0, i32 noundef %1, ptr noundef %2) #1 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store i32 %1, ptr %6, align 4, !tbaa !9
  store ptr %2, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #2
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #2
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #2
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #2
  %13 = load ptr, ptr %5, align 8, !tbaa !5
  %14 = getelementptr inbounds i8, ptr %13, i32 1
  store ptr %14, ptr %5, align 8, !tbaa !5
  %15 = load i8, ptr %13, align 1, !tbaa !11
  %16 = zext i8 %15 to i32
  store i32 %16, ptr %9, align 4, !tbaa !9
  %17 = load i32, ptr %9, align 4, !tbaa !9
  %18 = icmp slt i32 %17, 128
  br i1 %18, label %19, label %23

19:                                               ; preds = %3
  %20 = load ptr, ptr %5, align 8, !tbaa !5
  %21 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %20, ptr %21, align 8, !tbaa !5
  %22 = load i32, ptr %9, align 4, !tbaa !9
  store i32 %22, ptr %4, align 4
  store i32 1, ptr %12, align 4
  br label %83

23:                                               ; preds = %3
  %24 = load i32, ptr %9, align 4, !tbaa !9
  switch i32 %24, label %30 [
    i32 192, label %25
    i32 193, label %25
    i32 194, label %25
    i32 195, label %25
    i32 196, label %25
    i32 197, label %25
    i32 198, label %25
    i32 199, label %25
    i32 200, label %25
    i32 201, label %25
    i32 202, label %25
    i32 203, label %25
    i32 204, label %25
    i32 205, label %25
    i32 206, label %25
    i32 207, label %25
    i32 208, label %25
    i32 209, label %25
    i32 210, label %25
    i32 211, label %25
    i32 212, label %25
    i32 213, label %25
    i32 214, label %25
    i32 215, label %25
    i32 216, label %25
    i32 217, label %25
    i32 218, label %25
    i32 219, label %25
    i32 220, label %25
    i32 221, label %25
    i32 222, label %25
    i32 223, label %25
    i32 224, label %26
    i32 225, label %26
    i32 226, label %26
    i32 227, label %26
    i32 228, label %26
    i32 229, label %26
    i32 230, label %26
    i32 231, label %26
    i32 232, label %26
    i32 233, label %26
    i32 234, label %26
    i32 235, label %26
    i32 236, label %26
    i32 237, label %26
    i32 238, label %26
    i32 239, label %26
    i32 240, label %27
    i32 241, label %27
    i32 242, label %27
    i32 243, label %27
    i32 244, label %27
    i32 245, label %27
    i32 246, label %27
    i32 247, label %27
    i32 248, label %28
    i32 249, label %28
    i32 250, label %28
    i32 251, label %28
    i32 252, label %29
    i32 253, label %29
  ]

25:                                               ; preds = %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23
  store i32 1, ptr %8, align 4, !tbaa !9
  br label %31

26:                                               ; preds = %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23, %23
  store i32 2, ptr %8, align 4, !tbaa !9
  br label %31

27:                                               ; preds = %23, %23, %23, %23, %23, %23, %23, %23
  store i32 3, ptr %8, align 4, !tbaa !9
  br label %31

28:                                               ; preds = %23, %23, %23, %23
  store i32 4, ptr %8, align 4, !tbaa !9
  br label %31

29:                                               ; preds = %23, %23
  store i32 5, ptr %8, align 4, !tbaa !9
  br label %31

30:                                               ; preds = %23
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %12, align 4
  br label %83

31:                                               ; preds = %29, %28, %27, %26, %25
  %32 = load i32, ptr %8, align 4, !tbaa !9
  %33 = load i32, ptr %6, align 4, !tbaa !9
  %34 = sub nsw i32 %33, 1
  %35 = icmp sgt i32 %32, %34
  br i1 %35, label %36, label %37

36:                                               ; preds = %31
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %12, align 4
  br label %83

37:                                               ; preds = %31
  %38 = load i32, ptr %8, align 4, !tbaa !9
  %39 = sub nsw i32 %38, 1
  %40 = sext i32 %39 to i64
  %41 = getelementptr inbounds [5 x i8], ptr @utf8_first_code_mask, i64 0, i64 %40
  %42 = load i8, ptr %41, align 1, !tbaa !11
  %43 = zext i8 %42 to i32
  %44 = load i32, ptr %9, align 4, !tbaa !9
  %45 = and i32 %44, %43
  store i32 %45, ptr %9, align 4, !tbaa !9
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %46

46:                                               ; preds = %67, %37
  %47 = load i32, ptr %11, align 4, !tbaa !9
  %48 = load i32, ptr %8, align 4, !tbaa !9
  %49 = icmp slt i32 %47, %48
  br i1 %49, label %50, label %70

50:                                               ; preds = %46
  %51 = load ptr, ptr %5, align 8, !tbaa !5
  %52 = getelementptr inbounds i8, ptr %51, i32 1
  store ptr %52, ptr %5, align 8, !tbaa !5
  %53 = load i8, ptr %51, align 1, !tbaa !11
  %54 = zext i8 %53 to i32
  store i32 %54, ptr %10, align 4, !tbaa !9
  %55 = load i32, ptr %10, align 4, !tbaa !9
  %56 = icmp slt i32 %55, 128
  br i1 %56, label %60, label %57

57:                                               ; preds = %50
  %58 = load i32, ptr %10, align 4, !tbaa !9
  %59 = icmp sge i32 %58, 192
  br i1 %59, label %60, label %61

60:                                               ; preds = %57, %50
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %12, align 4
  br label %83

61:                                               ; preds = %57
  %62 = load i32, ptr %9, align 4, !tbaa !9
  %63 = shl i32 %62, 6
  %64 = load i32, ptr %10, align 4, !tbaa !9
  %65 = and i32 %64, 63
  %66 = or i32 %63, %65
  store i32 %66, ptr %9, align 4, !tbaa !9
  br label %67

67:                                               ; preds = %61
  %68 = load i32, ptr %11, align 4, !tbaa !9
  %69 = add nsw i32 %68, 1
  store i32 %69, ptr %11, align 4, !tbaa !9
  br label %46, !llvm.loop !12

70:                                               ; preds = %46
  %71 = load i32, ptr %9, align 4, !tbaa !9
  %72 = load i32, ptr %8, align 4, !tbaa !9
  %73 = sub nsw i32 %72, 1
  %74 = sext i32 %73 to i64
  %75 = getelementptr inbounds [5 x i32], ptr @utf8_min_code, i64 0, i64 %74
  %76 = load i32, ptr %75, align 4, !tbaa !9
  %77 = icmp ult i32 %71, %76
  br i1 %77, label %78, label %79

78:                                               ; preds = %70
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %12, align 4
  br label %83

79:                                               ; preds = %70
  %80 = load ptr, ptr %5, align 8, !tbaa !5
  %81 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %80, ptr %81, align 8, !tbaa !5
  %82 = load i32, ptr %9, align 4, !tbaa !9
  store i32 %82, ptr %4, align 4
  store i32 1, ptr %12, align 4
  br label %83

83:                                               ; preds = %79, %78, %60, %36, %30, %19
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #2
  %84 = load i32, ptr %4, align 4
  ret i32 %84
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = distinct !{!12, !13}
!13 = !{!"llvm.loop.mustprogress"}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@utf8_first_code_mask = external hidden local_unnamed_addr constant [5 x i8], align 1
@utf8_min_code = external hidden local_unnamed_addr constant [5 x i32], align 16
@switch.table.unicode_from_utf8 = private unnamed_addr constant [62 x i32] [i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 4, i32 4, i32 4, i32 4, i32 5, i32 5], align 4

; Function Attrs: nofree norecurse nosync nounwind memory(read, argmem: readwrite, inaccessiblemem: none) uwtable
define dso_local i32 @unicode_from_utf8(ptr noundef %0, i32 noundef %1, ptr nocapture noundef writeonly %2) local_unnamed_addr #0 {
  %4 = getelementptr inbounds i8, ptr %0, i64 1
  %5 = load i8, ptr %0, align 1, !tbaa !5
  %6 = icmp sgt i8 %5, -1
  br i1 %6, label %7, label %9

7:                                                ; preds = %3
  %8 = zext nneg i8 %5 to i32
  br label %.loopexit.sink.split

9:                                                ; preds = %3
  %switch.tableidx = add nsw i8 %5, 64
  %10 = icmp ult i8 %switch.tableidx, 62
  br i1 %10, label %switch.lookup, label %.loopexit

switch.lookup:                                    ; preds = %9
  %11 = zext nneg i8 %switch.tableidx to i64
  %switch.gep = getelementptr inbounds [62 x i32], ptr @switch.table.unicode_from_utf8, i64 0, i64 %11
  %switch.load = load i32, ptr %switch.gep, align 4
  %.not = icmp slt i32 %switch.load, %1
  br i1 %.not, label %12, label %.loopexit

12:                                               ; preds = %switch.lookup
  %13 = add nsw i32 %switch.load, -1
  %14 = zext nneg i32 %13 to i64
  %15 = getelementptr inbounds [5 x i8], ptr @utf8_first_code_mask, i64 0, i64 %14
  %16 = load i8, ptr %15, align 1, !tbaa !5
  %17 = and i8 %16, %5
  %18 = zext i8 %17 to i32
  %19 = getelementptr i8, ptr %0, i64 %14
  %scevgep = getelementptr i8, ptr %19, i64 2
  br label %20

20:                                               ; preds = %12, %22
  %.034 = phi i32 [ 0, %12 ], [ %28, %22 ]
  %.02533 = phi i32 [ %18, %12 ], [ %27, %22 ]
  %.02732 = phi ptr [ %4, %12 ], [ %23, %22 ]
  %21 = load i8, ptr %.02732, align 1, !tbaa !5
  %or.cond = icmp sgt i8 %21, -65
  br i1 %or.cond, label %.loopexit, label %22

22:                                               ; preds = %20
  %23 = getelementptr inbounds i8, ptr %.02732, i64 1
  %24 = shl i32 %.02533, 6
  %25 = and i8 %21, 63
  %26 = zext nneg i8 %25 to i32
  %27 = or disjoint i32 %24, %26
  %28 = add nuw nsw i32 %.034, 1
  %exitcond.not = icmp eq i32 %28, %switch.load
  br i1 %exitcond.not, label %29, label %20, !llvm.loop !8

29:                                               ; preds = %22
  %30 = getelementptr inbounds [5 x i32], ptr @utf8_min_code, i64 0, i64 %14
  %31 = load i32, ptr %30, align 4, !tbaa !10
  %32 = icmp ult i32 %27, %31
  br i1 %32, label %.loopexit, label %.loopexit.sink.split

.loopexit.sink.split:                             ; preds = %29, %7
  %scevgep.sink = phi ptr [ %4, %7 ], [ %scevgep, %29 ]
  %.024.ph = phi i32 [ %8, %7 ], [ %27, %29 ]
  store ptr %scevgep.sink, ptr %2, align 8, !tbaa !12
  br label %.loopexit

.loopexit:                                        ; preds = %20, %9, %.loopexit.sink.split, %29, %switch.lookup
  %.024 = phi i32 [ -1, %9 ], [ -1, %switch.lookup ], [ -1, %29 ], [ %.024.ph, %.loopexit.sink.split ], [ -1, %20 ]
  ret i32 %.024
}

attributes #0 = { nofree norecurse nosync nounwind memory(read, argmem: readwrite, inaccessiblemem: none) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C/C++ TBAA"}
!8 = distinct !{!8, !9}
!9 = !{!"llvm.loop.mustprogress"}
!10 = !{!11, !11, i64 0}
!11 = !{!"int", !6, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"any pointer", !6, i64 0}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass