; LLVM IR from HassenSaidi/IC_sqlite :: src (sqlite3)

; 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"

%struct.anon.9 = type { i32, i32 }
%struct.__va_list_tag = type { i32, i32, ptr, ptr }
%struct.sqlite3 = type { ptr, ptr, ptr, ptr, ptr, i32, i32, i64, i64, i64, i32, i32, i32, i32, i32, i16, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i32, i32, i32, i32, [12 x i32], i32, %struct.sqlite3InitInfo, i32, i32, i32, i32, i32, i32, ptr, %union.anon, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, %union.anon.0, %struct.Lookaside, ptr, ptr, ptr, ptr, i32, i32, %struct.Hash, ptr, ptr, ptr, %struct.Hash, %struct.Hash, %struct.BusyHandler, [2 x %struct.Db], ptr, i32, i32, i32, i32, i64, i64, ptr }
%struct.sqlite3InitInfo = type { i32, i8, i8, i8, ptr }
%union.anon = type { ptr }
%union.anon.0 = type { double }
%struct.Lookaside = type { i32, i16, i16, i8, i32, [3 x i32], ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.Hash = type { i32, i32, ptr, ptr }
%struct.BusyHandler = type { ptr, ptr, i32 }
%struct.Db = type { ptr, ptr, i8, i8, ptr }

@sqlite3_db_config.aFlagOp = external hidden constant [16 x %struct.anon.9], 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: nocallback nofree nosync nounwind willreturn
declare void @llvm.va_start.p0(ptr) #1

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare void @llvm.va_end.p0(ptr) #1

; Function Attrs: nounwind uwtable
declare hidden void @sqlite3ExpirePreparedStatements(ptr noundef, i32 noundef) #2

; Function Attrs: nounwind uwtable
define dso_local i32 @sqlite3_db_config(ptr noundef %0, i32 noundef %1, ...) #2 {
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %5 = alloca [1 x %struct.__va_list_tag], align 16
  %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 ptr, align 8
  %13 = alloca i64, align 8
  store ptr %0, ptr %3, align 8, !tbaa !5
  store i32 %1, ptr %4, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 24, ptr %5) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #3
  %14 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %5, i64 0, i64 0
  call void @llvm.va_start.p0(ptr %14)
  %15 = load i32, ptr %4, align 4, !tbaa !9
  switch i32 %15, label %92 [
    i32 1000, label %16
    i32 1001, label %38
  ]

16:                                               ; preds = %2
  %17 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %5, i64 0, i64 0
  %18 = getelementptr inbounds %struct.__va_list_tag, ptr %17, i32 0, i32 0
  %19 = load i32, ptr %18, align 16
  %20 = icmp ule i32 %19, 40
  br i1 %20, label %21, label %26

21:                                               ; preds = %16
  %22 = getelementptr inbounds %struct.__va_list_tag, ptr %17, i32 0, i32 3
  %23 = load ptr, ptr %22, align 16
  %24 = getelementptr i8, ptr %23, i32 %19
  %25 = add i32 %19, 8
  store i32 %25, ptr %18, align 16
  br label %30

26:                                               ; preds = %16
  %27 = getelementptr inbounds %struct.__va_list_tag, ptr %17, i32 0, i32 2
  %28 = load ptr, ptr %27, align 8
  %29 = getelementptr i8, ptr %28, i32 8
  store ptr %29, ptr %27, align 8
  br label %30

30:                                               ; preds = %26, %21
  %31 = phi ptr [ %24, %21 ], [ %28, %26 ]
  %32 = load ptr, ptr %31, align 8, !tbaa !5
  %33 = load ptr, ptr %3, align 8, !tbaa !5
  %34 = getelementptr inbounds %struct.sqlite3, ptr %33, i32 0, i32 4
  %35 = load ptr, ptr %34, align 8, !tbaa !11
  %36 = getelementptr inbounds %struct.Db, ptr %35, i64 0
  %37 = getelementptr inbounds %struct.Db, ptr %36, i32 0, i32 0
  store ptr %32, ptr %37, align 8, !tbaa !19
  store i32 0, ptr %6, align 4, !tbaa !9
  br label %200

38:                                               ; preds = %2
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #3
  %39 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %5, i64 0, i64 0
  %40 = getelementptr inbounds %struct.__va_list_tag, ptr %39, i32 0, i32 0
  %41 = load i32, ptr %40, align 16
  %42 = icmp ule i32 %41, 40
  br i1 %42, label %43, label %48

43:                                               ; preds = %38
  %44 = getelementptr inbounds %struct.__va_list_tag, ptr %39, i32 0, i32 3
  %45 = load ptr, ptr %44, align 16
  %46 = getelementptr i8, ptr %45, i32 %41
  %47 = add i32 %41, 8
  store i32 %47, ptr %40, align 16
  br label %52

48:                                               ; preds = %38
  %49 = getelementptr inbounds %struct.__va_list_tag, ptr %39, i32 0, i32 2
  %50 = load ptr, ptr %49, align 8
  %51 = getelementptr i8, ptr %50, i32 8
  store ptr %51, ptr %49, align 8
  br label %52

52:                                               ; preds = %48, %43
  %53 = phi ptr [ %46, %43 ], [ %50, %48 ]
  %54 = load ptr, ptr %53, align 8, !tbaa !5
  store ptr %54, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  %55 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %5, i64 0, i64 0
  %56 = getelementptr inbounds %struct.__va_list_tag, ptr %55, i32 0, i32 0
  %57 = load i32, ptr %56, align 16
  %58 = icmp ule i32 %57, 40
  br i1 %58, label %59, label %64

59:                                               ; preds = %52
  %60 = getelementptr inbounds %struct.__va_list_tag, ptr %55, i32 0, i32 3
  %61 = load ptr, ptr %60, align 16
  %62 = getelementptr i8, ptr %61, i32 %57
  %63 = add i32 %57, 8
  store i32 %63, ptr %56, align 16
  br label %68

64:                                               ; preds = %52
  %65 = getelementptr inbounds %struct.__va_list_tag, ptr %55, i32 0, i32 2
  %66 = load ptr, ptr %65, align 8
  %67 = getelementptr i8, ptr %66, i32 8
  store ptr %67, ptr %65, align 8
  br label %68

68:                                               ; preds = %64, %59
  %69 = phi ptr [ %62, %59 ], [ %66, %64 ]
  %70 = load i32, ptr %69, align 4, !tbaa !9
  store i32 %70, ptr %8, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  %71 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %5, i64 0, i64 0
  %72 = getelementptr inbounds %struct.__va_list_tag, ptr %71, i32 0, i32 0
  %73 = load i32, ptr %72, align 16
  %74 = icmp ule i32 %73, 40
  br i1 %74, label %75, label %80

75:                                               ; preds = %68
  %76 = getelementptr inbounds %struct.__va_list_tag, ptr %71, i32 0, i32 3
  %77 = load ptr, ptr %76, align 16
  %78 = getelementptr i8, ptr %77, i32 %73
  %79 = add i32 %73, 8
  store i32 %79, ptr %72, align 16
  br label %84

80:                                               ; preds = %68
  %81 = getelementptr inbounds %struct.__va_list_tag, ptr %71, i32 0, i32 2
  %82 = load ptr, ptr %81, align 8
  %83 = getelementptr i8, ptr %82, i32 8
  store ptr %83, ptr %81, align 8
  br label %84

84:                                               ; preds = %80, %75
  %85 = phi ptr [ %78, %75 ], [ %82, %80 ]
  %86 = load i32, ptr %85, align 4, !tbaa !9
  store i32 %86, ptr %9, align 4, !tbaa !9
  %87 = load ptr, ptr %3, align 8, !tbaa !5
  %88 = load ptr, ptr %7, align 8, !tbaa !5
  %89 = load i32, ptr %8, align 4, !tbaa !9
  %90 = load i32, ptr %9, align 4, !tbaa !9
  %91 = call i32 @setupLookaside(ptr noundef %87, ptr noundef %88, i32 noundef %89, i32 noundef %90)
  store i32 %91, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #3
  br label %200

92:                                               ; preds = %2
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  store i32 1, ptr %6, align 4, !tbaa !9
  store i32 0, ptr %10, align 4, !tbaa !9
  br label %93

93:                                               ; preds = %196, %92
  %94 = load i32, ptr %10, align 4, !tbaa !9
  %95 = icmp ult i32 %94, 16
  br i1 %95, label %96, label %199

96:                                               ; preds = %93
  %97 = load i32, ptr %10, align 4, !tbaa !9
  %98 = zext i32 %97 to i64
  %99 = getelementptr inbounds [16 x %struct.anon.9], ptr @sqlite3_db_config.aFlagOp, i64 0, i64 %98
  %100 = getelementptr inbounds %struct.anon.9, ptr %99, i32 0, i32 0
  %101 = load i32, ptr %100, align 8, !tbaa !21
  %102 = load i32, ptr %4, align 4, !tbaa !9
  %103 = icmp eq i32 %101, %102
  br i1 %103, label %104, label %195

104:                                              ; preds = %96
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  %105 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %5, i64 0, i64 0
  %106 = getelementptr inbounds %struct.__va_list_tag, ptr %105, i32 0, i32 0
  %107 = load i32, ptr %106, align 16
  %108 = icmp ule i32 %107, 40
  br i1 %108, label %109, label %114

109:                                              ; preds = %104
  %110 = getelementptr inbounds %struct.__va_list_tag, ptr %105, i32 0, i32 3
  %111 = load ptr, ptr %110, align 16
  %112 = getelementptr i8, ptr %111, i32 %107
  %113 = add i32 %107, 8
  store i32 %113, ptr %106, align 16
  br label %118

114:                                              ; preds = %104
  %115 = getelementptr inbounds %struct.__va_list_tag, ptr %105, i32 0, i32 2
  %116 = load ptr, ptr %115, align 8
  %117 = getelementptr i8, ptr %116, i32 8
  store ptr %117, ptr %115, align 8
  br label %118

118:                                              ; preds = %114, %109
  %119 = phi ptr [ %112, %109 ], [ %116, %114 ]
  %120 = load i32, ptr %119, align 4, !tbaa !9
  store i32 %120, ptr %11, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #3
  %121 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %5, i64 0, i64 0
  %122 = getelementptr inbounds %struct.__va_list_tag, ptr %121, i32 0, i32 0
  %123 = load i32, ptr %122, align 16
  %124 = icmp ule i32 %123, 40
  br i1 %124, label %125, label %130

125:                                              ; preds = %118
  %126 = getelementptr inbounds %struct.__va_list_tag, ptr %121, i32 0, i32 3
  %127 = load ptr, ptr %126, align 16
  %128 = getelementptr i8, ptr %127, i32 %123
  %129 = add i32 %123, 8
  store i32 %129, ptr %122, align 16
  br label %134

130:                                              ; preds = %118
  %131 = getelementptr inbounds %struct.__va_list_tag, ptr %121, i32 0, i32 2
  %132 = load ptr, ptr %131, align 8
  %133 = getelementptr i8, ptr %132, i32 8
  store ptr %133, ptr %131, align 8
  br label %134

134:                                              ; preds = %130, %125
  %135 = phi ptr [ %128, %125 ], [ %132, %130 ]
  %136 = load ptr, ptr %135, align 8, !tbaa !5
  store ptr %136, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #3
  %137 = load ptr, ptr %3, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.sqlite3, ptr %137, i32 0, i32 7
  %139 = load i64, ptr %138, align 8, !tbaa !23
  store i64 %139, ptr %13, align 8, !tbaa !24
  %140 = load i32, ptr %11, align 4, !tbaa !9
  %141 = icmp sgt i32 %140, 0
  br i1 %141, label %142, label %153

142:                                              ; preds = %134
  %143 = load i32, ptr %10, align 4, !tbaa !9
  %144 = zext i32 %143 to i64
  %145 = getelementptr inbounds [16 x %struct.anon.9], ptr @sqlite3_db_config.aFlagOp, i64 0, i64 %144
  %146 = getelementptr inbounds %struct.anon.9, ptr %145, i32 0, i32 1
  %147 = load i32, ptr %146, align 4, !tbaa !25
  %148 = zext i32 %147 to i64
  %149 = load ptr, ptr %3, align 8, !tbaa !5
  %150 = getelementptr inbounds %struct.sqlite3, ptr %149, i32 0, i32 7
  %151 = load i64, ptr %150, align 8, !tbaa !23
  %152 = or i64 %151, %148
  store i64 %152, ptr %150, align 8, !tbaa !23
  br label %169

153:                                              ; preds = %134
  %154 = load i32, ptr %11, align 4, !tbaa !9
  %155 = icmp eq i32 %154, 0
  br i1 %155, label %156, label %168

156:                                              ; preds = %153
  %157 = load i32, ptr %10, align 4, !tbaa !9
  %158 = zext i32 %157 to i64
  %159 = getelementptr inbounds [16 x %struct.anon.9], ptr @sqlite3_db_config.aFlagOp, i64 0, i64 %158
  %160 = getelementptr inbounds %struct.anon.9, ptr %159, i32 0, i32 1
  %161 = load i32, ptr %160, align 4, !tbaa !25
  %162 = zext i32 %161 to i64
  %163 = xor i64 %162, -1
  %164 = load ptr, ptr %3, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.sqlite3, ptr %164, i32 0, i32 7
  %166 = load i64, ptr %165, align 8, !tbaa !23
  %167 = and i64 %166, %163
  store i64 %167, ptr %165, align 8, !tbaa !23
  br label %168

168:                                              ; preds = %156, %153
  br label %169

169:                                              ; preds = %168, %142
  %170 = load i64, ptr %13, align 8, !tbaa !24
  %171 = load ptr, ptr %3, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.sqlite3, ptr %171, i32 0, i32 7
  %173 = load i64, ptr %172, align 8, !tbaa !23
  %174 = icmp ne i64 %170, %173
  br i1 %174, label %175, label %177

175:                                              ; preds = %169
  %176 = load ptr, ptr %3, align 8, !tbaa !5
  call void @sqlite3ExpirePreparedStatements(ptr noundef %176, i32 noundef 0)
  br label %177

177:                                              ; preds = %175, %169
  %178 = load ptr, ptr %12, align 8, !tbaa !5
  %179 = icmp ne ptr %178, null
  br i1 %179, label %180, label %194

180:                                              ; preds = %177
  %181 = load ptr, ptr %3, align 8, !tbaa !5
  %182 = getelementptr inbounds %struct.sqlite3, ptr %181, i32 0, i32 7
  %183 = load i64, ptr %182, align 8, !tbaa !23
  %184 = load i32, ptr %10, align 4, !tbaa !9
  %185 = zext i32 %184 to i64
  %186 = getelementptr inbounds [16 x %struct.anon.9], ptr @sqlite3_db_config.aFlagOp, i64 0, i64 %185
  %187 = getelementptr inbounds %struct.anon.9, ptr %186, i32 0, i32 1
  %188 = load i32, ptr %187, align 4, !tbaa !25
  %189 = zext i32 %188 to i64
  %190 = and i64 %183, %189
  %191 = icmp ne i64 %190, 0
  %192 = zext i1 %191 to i32
  %193 = load ptr, ptr %12, align 8, !tbaa !5
  store i32 %192, ptr %193, align 4, !tbaa !9
  br label %194

194:                                              ; preds = %180, %177
  store i32 0, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  br label %199

195:                                              ; preds = %96
  br label %196

196:                                              ; preds = %195
  %197 = load i32, ptr %10, align 4, !tbaa !9
  %198 = add i32 %197, 1
  store i32 %198, ptr %10, align 4, !tbaa !9
  br label %93, !llvm.loop !26

199:                                              ; preds = %194, %93
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  br label %200

200:                                              ; preds = %199, %84, %30
  %201 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %5, i64 0, i64 0
  call void @llvm.va_end.p0(ptr %201)
  %202 = load i32, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.end.p0(i64 24, ptr %5) #3
  ret i32 %202
}

; Function Attrs: nounwind uwtable
declare hidden i32 @setupLookaside(ptr noundef, ptr noundef, i32 noundef, i32 noundef) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind willreturn }
attributes #2 = { 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 #3 = { 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 = !{!12, !6, i64 32}
!12 = !{!"sqlite3", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !10, i64 40, !10, i64 44, !13, i64 48, !13, i64 56, !13, i64 64, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84, !10, i64 88, !14, i64 92, !7, i64 94, !7, i64 95, !7, i64 96, !7, i64 97, !7, i64 98, !7, i64 99, !7, i64 100, !7, i64 101, !7, i64 102, !7, i64 103, !7, i64 104, !7, i64 105, !7, i64 106, !10, i64 108, !10, i64 112, !10, i64 116, !10, i64 120, !7, i64 124, !10, i64 172, !15, i64 176, !10, i64 192, !10, i64 196, !10, i64 200, !10, i64 204, !10, i64 208, !10, i64 212, !6, i64 216, !7, i64 224, !6, i64 232, !6, i64 240, !6, i64 248, !6, i64 256, !6, i64 264, !6, i64 272, !6, i64 280, !6, i64 288, !6, i64 296, !6, i64 304, !6, i64 312, !6, i64 320, !6, i64 328, !6, i64 336, !6, i64 344, !6, i64 352, !7, i64 360, !16, i64 368, !6, i64 456, !6, i64 464, !6, i64 472, !6, i64 480, !10, i64 488, !10, i64 492, !17, i64 496, !6, i64 520, !6, i64 528, !6, i64 536, !17, i64 544, !17, i64 568, !18, i64 592, !7, i64 616, !6, i64 680, !10, i64 688, !10, i64 692, !10, i64 696, !10, i64 700, !13, i64 704, !13, i64 712, !6, i64 720}
!13 = !{!"long long", !7, i64 0}
!14 = !{!"short", !7, i64 0}
!15 = !{!"sqlite3InitInfo", !10, i64 0, !7, i64 4, !7, i64 5, !10, i64 6, !10, i64 6, !10, i64 6, !6, i64 8}
!16 = !{!"Lookaside", !10, i64 0, !14, i64 4, !14, i64 6, !7, i64 8, !10, i64 12, !7, i64 16, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80}
!17 = !{!"Hash", !10, i64 0, !10, i64 4, !6, i64 8, !6, i64 16}
!18 = !{!"BusyHandler", !6, i64 0, !6, i64 8, !10, i64 16}
!19 = !{!20, !6, i64 0}
!20 = !{!"Db", !6, i64 0, !6, i64 8, !7, i64 16, !7, i64 17, !6, i64 24}
!21 = !{!22, !10, i64 0}
!22 = !{!"", !10, i64 0, !10, i64 4}
!23 = !{!12, !13, i64 48}
!24 = !{!13, !13, i64 0}
!25 = !{!22, !10, i64 4}
!26 = distinct !{!26, !27}
!27 = !{!"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"

%struct.anon.9 = type { i32, i32 }
%struct.__va_list_tag = type { i32, i32, ptr, ptr }

@sqlite3_db_config.aFlagOp = external hidden local_unnamed_addr constant [16 x %struct.anon.9], align 16

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

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare void @llvm.va_start.p0(ptr) #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare void @llvm.va_end.p0(ptr) #1

; Function Attrs: nounwind uwtable
declare hidden void @sqlite3ExpirePreparedStatements(ptr noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local i32 @sqlite3_db_config(ptr noundef %0, i32 noundef %1, ...) local_unnamed_addr #2 {
  %3 = alloca [1 x %struct.__va_list_tag], align 16
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %3) #3
  call void @llvm.va_start.p0(ptr nonnull %3)
  switch i32 %1, label %.preheader.preheader [
    i32 1000, label %6
    i32 1001, label %24
  ]

.preheader.preheader:                             ; preds = %2
  %4 = load i32, ptr @sqlite3_db_config.aFlagOp, align 16, !tbaa !5
  %5 = icmp eq i32 %4, %1
  br i1 %5, label %100, label %.preheader.1

6:                                                ; preds = %2
  %7 = load i32, ptr %3, align 16
  %8 = icmp ult i32 %7, 41
  br i1 %8, label %9, label %15

9:                                                ; preds = %6
  %10 = getelementptr inbounds i8, ptr %3, i64 16
  %11 = load ptr, ptr %10, align 16
  %12 = zext nneg i32 %7 to i64
  %13 = getelementptr i8, ptr %11, i64 %12
  %14 = add nuw nsw i32 %7, 8
  store i32 %14, ptr %3, align 16
  br label %19

15:                                               ; preds = %6
  %16 = getelementptr inbounds i8, ptr %3, i64 8
  %17 = load ptr, ptr %16, align 8
  %18 = getelementptr i8, ptr %17, i64 8
  store ptr %18, ptr %16, align 8
  br label %19

19:                                               ; preds = %15, %9
  %20 = phi ptr [ %13, %9 ], [ %17, %15 ]
  %21 = load ptr, ptr %20, align 8, !tbaa !10
  %22 = getelementptr inbounds i8, ptr %0, i64 32
  %23 = load ptr, ptr %22, align 8, !tbaa !12
  store ptr %21, ptr %23, align 8, !tbaa !20
  br label %.loopexit

24:                                               ; preds = %2
  %25 = load i32, ptr %3, align 16
  %26 = icmp ult i32 %25, 41
  br i1 %26, label %31, label %.thread

.thread:                                          ; preds = %24
  %27 = getelementptr inbounds i8, ptr %3, i64 8
  %28 = load ptr, ptr %27, align 8
  %29 = getelementptr i8, ptr %28, i64 8
  store ptr %29, ptr %27, align 8
  %30 = load ptr, ptr %28, align 8, !tbaa !10
  br label %.thread42

31:                                               ; preds = %24
  %32 = getelementptr inbounds i8, ptr %3, i64 16
  %33 = load ptr, ptr %32, align 16
  %34 = zext nneg i32 %25 to i64
  %35 = getelementptr i8, ptr %33, i64 %34
  %36 = add nuw nsw i32 %25, 8
  store i32 %36, ptr %3, align 16
  %37 = load ptr, ptr %35, align 8, !tbaa !10
  %38 = icmp ult i32 %25, 33
  br i1 %38, label %44, label %.thread42

.thread42:                                        ; preds = %31, %.thread
  %39 = phi ptr [ %30, %.thread ], [ %37, %31 ]
  %40 = getelementptr inbounds i8, ptr %3, i64 8
  %41 = load ptr, ptr %40, align 8
  %42 = getelementptr i8, ptr %41, i64 8
  store ptr %42, ptr %40, align 8
  %43 = load i32, ptr %41, align 4, !tbaa !22
  br label %58

44:                                               ; preds = %31
  %45 = getelementptr inbounds i8, ptr %3, i64 16
  %46 = load ptr, ptr %45, align 16
  %47 = zext nneg i32 %36 to i64
  %48 = getelementptr i8, ptr %46, i64 %47
  %49 = add nuw nsw i32 %25, 16
  store i32 %49, ptr %3, align 16
  %50 = load i32, ptr %48, align 4, !tbaa !22
  %51 = icmp ult i32 %25, 25
  br i1 %51, label %52, label %58

52:                                               ; preds = %44
  %53 = getelementptr inbounds i8, ptr %3, i64 16
  %54 = load ptr, ptr %53, align 16
  %55 = zext nneg i32 %49 to i64
  %56 = getelementptr i8, ptr %54, i64 %55
  %57 = add nuw nsw i32 %25, 24
  store i32 %57, ptr %3, align 16
  br label %64

58:                                               ; preds = %.thread42, %44
  %59 = phi i32 [ %43, %.thread42 ], [ %50, %44 ]
  %60 = phi ptr [ %39, %.thread42 ], [ %37, %44 ]
  %61 = getelementptr inbounds i8, ptr %3, i64 8
  %62 = load ptr, ptr %61, align 8
  %63 = getelementptr i8, ptr %62, i64 8
  store ptr %63, ptr %61, align 8
  br label %64

64:                                               ; preds = %58, %52
  %65 = phi i32 [ %50, %52 ], [ %59, %58 ]
  %66 = phi ptr [ %37, %52 ], [ %60, %58 ]
  %67 = phi ptr [ %56, %52 ], [ %62, %58 ]
  %68 = load i32, ptr %67, align 4, !tbaa !22
  %69 = call i32 @setupLookaside(ptr noundef %0, ptr noundef %66, i32 noundef %65, i32 noundef %68)
  br label %.loopexit

.preheader.1:                                     ; preds = %.preheader.preheader
  %70 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 8), align 8, !tbaa !5
  %71 = icmp eq i32 %70, %1
  br i1 %71, label %100, label %.preheader.2

.preheader.2:                                     ; preds = %.preheader.1
  %72 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 16), align 16, !tbaa !5
  %73 = icmp eq i32 %72, %1
  br i1 %73, label %100, label %.preheader.3

.preheader.3:                                     ; preds = %.preheader.2
  %74 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 24), align 8, !tbaa !5
  %75 = icmp eq i32 %74, %1
  br i1 %75, label %100, label %.preheader.4

.preheader.4:                                     ; preds = %.preheader.3
  %76 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 32), align 16, !tbaa !5
  %77 = icmp eq i32 %76, %1
  br i1 %77, label %100, label %.preheader.5

.preheader.5:                                     ; preds = %.preheader.4
  %78 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 40), align 8, !tbaa !5
  %79 = icmp eq i32 %78, %1
  br i1 %79, label %100, label %.preheader.6

.preheader.6:                                     ; preds = %.preheader.5
  %80 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 48), align 16, !tbaa !5
  %81 = icmp eq i32 %80, %1
  br i1 %81, label %100, label %.preheader.7

.preheader.7:                                     ; preds = %.preheader.6
  %82 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 56), align 8, !tbaa !5
  %83 = icmp eq i32 %82, %1
  br i1 %83, label %100, label %.preheader.8

.preheader.8:                                     ; preds = %.preheader.7
  %84 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 64), align 16, !tbaa !5
  %85 = icmp eq i32 %84, %1
  br i1 %85, label %100, label %.preheader.9

.preheader.9:                                     ; preds = %.preheader.8
  %86 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 72), align 8, !tbaa !5
  %87 = icmp eq i32 %86, %1
  br i1 %87, label %100, label %.preheader.10

.preheader.10:                                    ; preds = %.preheader.9
  %88 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 80), align 16, !tbaa !5
  %89 = icmp eq i32 %88, %1
  br i1 %89, label %100, label %.preheader.11

.preheader.11:                                    ; preds = %.preheader.10
  %90 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 88), align 8, !tbaa !5
  %91 = icmp eq i32 %90, %1
  br i1 %91, label %100, label %.preheader.12

.preheader.12:                                    ; preds = %.preheader.11
  %92 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 96), align 16, !tbaa !5
  %93 = icmp eq i32 %92, %1
  br i1 %93, label %100, label %.preheader.13

.preheader.13:                                    ; preds = %.preheader.12
  %94 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 104), align 8, !tbaa !5
  %95 = icmp eq i32 %94, %1
  br i1 %95, label %100, label %.preheader.14

.preheader.14:                                    ; preds = %.preheader.13
  %96 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 112), align 16, !tbaa !5
  %97 = icmp eq i32 %96, %1
  br i1 %97, label %100, label %.preheader.15

.preheader.15:                                    ; preds = %.preheader.14
  %98 = load i32, ptr getelementptr inbounds (i8, ptr @sqlite3_db_config.aFlagOp, i64 120), align 8, !tbaa !5
  %99 = icmp eq i32 %98, %1
  br i1 %99, label %100, label %.loopexit

100:                                              ; preds = %.preheader.15, %.preheader.14, %.preheader.13, %.preheader.12, %.preheader.11, %.preheader.10, %.preheader.9, %.preheader.8, %.preheader.7, %.preheader.6, %.preheader.5, %.preheader.4, %.preheader.3, %.preheader.2, %.preheader.1, %.preheader.preheader
  %.lcssa = phi i64 [ 0, %.preheader.preheader ], [ 1, %.preheader.1 ], [ 2, %.preheader.2 ], [ 3, %.preheader.3 ], [ 4, %.preheader.4 ], [ 5, %.preheader.5 ], [ 6, %.preheader.6 ], [ 7, %.preheader.7 ], [ 8, %.preheader.8 ], [ 9, %.preheader.9 ], [ 10, %.preheader.10 ], [ 11, %.preheader.11 ], [ 12, %.preheader.12 ], [ 13, %.preheader.13 ], [ 14, %.preheader.14 ], [ 15, %.preheader.15 ]
  %101 = getelementptr inbounds [16 x %struct.anon.9], ptr @sqlite3_db_config.aFlagOp, i64 0, i64 %.lcssa
  %102 = load i32, ptr %3, align 16
  %103 = icmp ult i32 %102, 41
  br i1 %103, label %108, label %.thread43

.thread43:                                        ; preds = %100
  %104 = getelementptr inbounds i8, ptr %3, i64 8
  %105 = load ptr, ptr %104, align 8
  %106 = getelementptr i8, ptr %105, i64 8
  store ptr %106, ptr %104, align 8
  %107 = load i32, ptr %105, align 4, !tbaa !22
  br label %122

108:                                              ; preds = %100
  %109 = getelementptr inbounds i8, ptr %3, i64 16
  %110 = load ptr, ptr %109, align 16
  %111 = zext nneg i32 %102 to i64
  %112 = getelementptr i8, ptr %110, i64 %111
  %113 = add nuw nsw i32 %102, 8
  store i32 %113, ptr %3, align 16
  %114 = load i32, ptr %112, align 4, !tbaa !22
  %115 = icmp ult i32 %102, 33
  br i1 %115, label %116, label %122

116:                                              ; preds = %108
  %117 = getelementptr inbounds i8, ptr %3, i64 16
  %118 = load ptr, ptr %117, align 16
  %119 = zext nneg i32 %113 to i64
  %120 = getelementptr i8, ptr %118, i64 %119
  %121 = add nuw nsw i32 %102, 16
  store i32 %121, ptr %3, align 16
  br label %127

122:                                              ; preds = %.thread43, %108
  %123 = phi i32 [ %107, %.thread43 ], [ %114, %108 ]
  %124 = getelementptr inbounds i8, ptr %3, i64 8
  %125 = load ptr, ptr %124, align 8
  %126 = getelementptr i8, ptr %125, i64 8
  store ptr %126, ptr %124, align 8
  br label %127

127:                                              ; preds = %122, %116
  %128 = phi i32 [ %114, %116 ], [ %123, %122 ]
  %129 = phi ptr [ %120, %116 ], [ %125, %122 ]
  %130 = load ptr, ptr %129, align 8, !tbaa !10
  %131 = getelementptr inbounds i8, ptr %0, i64 48
  %132 = load i64, ptr %131, align 8, !tbaa !23
  %133 = icmp sgt i32 %128, 0
  br i1 %133, label %134, label %139

134:                                              ; preds = %127
  %135 = getelementptr inbounds i8, ptr %101, i64 4
  %136 = load i32, ptr %135, align 4, !tbaa !24
  %137 = zext i32 %136 to i64
  %138 = or i64 %132, %137
  br label %147

139:                                              ; preds = %127
  %140 = icmp eq i32 %128, 0
  br i1 %140, label %141, label %.thread44

141:                                              ; preds = %139
  %142 = getelementptr inbounds i8, ptr %101, i64 4
  %143 = load i32, ptr %142, align 4, !tbaa !24
  %144 = zext i32 %143 to i64
  %145 = xor i64 %144, -1
  %146 = and i64 %132, %145
  br label %147

147:                                              ; preds = %141, %134
  %.sink = phi i64 [ %146, %141 ], [ %138, %134 ]
  store i64 %.sink, ptr %131, align 8, !tbaa !23
  %.not = icmp eq i64 %132, %.sink
  br i1 %.not, label %.thread44, label %148

148:                                              ; preds = %147
  call void @sqlite3ExpirePreparedStatements(ptr noundef nonnull %0, i32 noundef 0)
  br label %.thread44

.thread44:                                        ; preds = %139, %148, %147
  %.not33 = icmp eq ptr %130, null
  br i1 %.not33, label %.loopexit, label %149

149:                                              ; preds = %.thread44
  %150 = load i64, ptr %131, align 8, !tbaa !23
  %151 = getelementptr inbounds i8, ptr %101, i64 4
  %152 = load i32, ptr %151, align 4, !tbaa !24
  %153 = zext i32 %152 to i64
  %154 = and i64 %150, %153
  %155 = icmp ne i64 %154, 0
  %156 = zext i1 %155 to i32
  store i32 %156, ptr %130, align 4, !tbaa !22
  br label %.loopexit

.loopexit:                                        ; preds = %.preheader.15, %149, %.thread44, %64, %19
  %.1 = phi i32 [ %69, %64 ], [ 0, %19 ], [ 0, %149 ], [ 0, %.thread44 ], [ 1, %.preheader.15 ]
  call void @llvm.va_end.p0(ptr nonnull %3)
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %3) #3
  ret i32 %.1
}

; Function Attrs: nounwind uwtable
declare hidden i32 @setupLookaside(ptr noundef, ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn }
attributes #2 = { 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 #3 = { 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, !7, i64 0}
!6 = !{!"", !7, i64 0, !7, i64 4}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!11, !11, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!13, !11, i64 32}
!13 = !{!"sqlite3", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32, !7, i64 40, !7, i64 44, !14, i64 48, !14, i64 56, !14, i64 64, !7, i64 72, !7, i64 76, !7, i64 80, !7, i64 84, !7, i64 88, !15, i64 92, !8, i64 94, !8, i64 95, !8, i64 96, !8, i64 97, !8, i64 98, !8, i64 99, !8, i64 100, !8, i64 101, !8, i64 102, !8, i64 103, !8, i64 104, !8, i64 105, !8, i64 106, !7, i64 108, !7, i64 112, !7, i64 116, !7, i64 120, !8, i64 124, !7, i64 172, !16, i64 176, !7, i64 192, !7, i64 196, !7, i64 200, !7, i64 204, !7, i64 208, !7, i64 212, !11, i64 216, !8, i64 224, !11, i64 232, !11, i64 240, !11, i64 248, !11, i64 256, !11, i64 264, !11, i64 272, !11, i64 280, !11, i64 288, !11, i64 296, !11, i64 304, !11, i64 312, !11, i64 320, !11, i64 328, !11, i64 336, !11, i64 344, !11, i64 352, !8, i64 360, !17, i64 368, !11, i64 456, !11, i64 464, !11, i64 472, !11, i64 480, !7, i64 488, !7, i64 492, !18, i64 496, !11, i64 520, !11, i64 528, !11, i64 536, !18, i64 544, !18, i64 568, !19, i64 592, !8, i64 616, !11, i64 680, !7, i64 688, !7, i64 692, !7, i64 696, !7, i64 700, !14, i64 704, !14, i64 712, !11, i64 720}
!14 = !{!"long long", !8, i64 0}
!15 = !{!"short", !8, i64 0}
!16 = !{!"sqlite3InitInfo", !7, i64 0, !8, i64 4, !8, i64 5, !7, i64 6, !7, i64 6, !7, i64 6, !11, i64 8}
!17 = !{!"Lookaside", !7, i64 0, !15, i64 4, !15, i64 6, !8, i64 8, !7, i64 12, !8, i64 16, !11, i64 32, !11, i64 40, !11, i64 48, !11, i64 56, !11, i64 64, !11, i64 72, !11, i64 80}
!18 = !{!"Hash", !7, i64 0, !7, i64 4, !11, i64 8, !11, i64 16}
!19 = !{!"BusyHandler", !11, i64 0, !11, i64 8, !7, i64 16}
!20 = !{!21, !11, i64 0}
!21 = !{!"Db", !11, i64 0, !11, i64 8, !8, i64 16, !8, i64 17, !11, i64 24}
!22 = !{!7, !7, i64 0}
!23 = !{!13, !14, i64 48}
!24 = !{!6, !7, i64 4}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,ReassociatePass,SROAPass,SimplifyCFGPass