; LLVM IR from ARMmbed/mbed-crypto :: library (cipher)

; 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.mbedtls_cipher_context_t = type { ptr, i32, i32, ptr, ptr, [16 x i8], i64, [16 x i8], i64, ptr, ptr }
%struct.mbedtls_cipher_info_t = type { i32, i32, i32, ptr, i32, i32, i32, ptr }
%struct.mbedtls_cipher_base_t = type { i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }

; 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 nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #1

; Function Attrs: nounwind uwtable
define dso_local i32 @mbedtls_cipher_update(ptr noundef %0, ptr noundef %1, i64 noundef %2, ptr noundef %3, ptr noundef %4) #2 {
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i64, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca i64, align 8
  %14 = alloca i32, align 4
  %15 = alloca i64, align 8
  store ptr %0, ptr %7, align 8, !tbaa !5
  store ptr %1, ptr %8, align 8, !tbaa !5
  store i64 %2, ptr %9, align 8, !tbaa !9
  store ptr %3, ptr %10, align 8, !tbaa !5
  store ptr %4, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  store i32 -110, ptr %12, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  br label %16

16:                                               ; preds = %5
  br label %17

17:                                               ; preds = %16
  br label %18

18:                                               ; preds = %17
  br label %19

19:                                               ; preds = %18
  br label %20

20:                                               ; preds = %19
  br label %21

21:                                               ; preds = %20
  br label %22

22:                                               ; preds = %21
  br label %23

23:                                               ; preds = %22
  br label %24

24:                                               ; preds = %23
  br label %25

25:                                               ; preds = %24
  br label %26

26:                                               ; preds = %25
  br label %27

27:                                               ; preds = %26
  %28 = load ptr, ptr %7, align 8, !tbaa !5
  %29 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %28, i32 0, i32 0
  %30 = load ptr, ptr %29, align 8, !tbaa !13
  %31 = icmp eq ptr %30, null
  br i1 %31, label %32, label %33

32:                                               ; preds = %27
  store i32 -24832, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

33:                                               ; preds = %27
  %34 = load ptr, ptr %11, align 8, !tbaa !5
  store i64 0, ptr %34, align 8, !tbaa !9
  %35 = load ptr, ptr %7, align 8, !tbaa !5
  %36 = call i32 @mbedtls_cipher_get_block_size(ptr noundef %35)
  %37 = zext i32 %36 to i64
  store i64 %37, ptr %13, align 8, !tbaa !9
  %38 = load i64, ptr %13, align 8, !tbaa !9
  %39 = icmp eq i64 0, %38
  br i1 %39, label %40, label %41

40:                                               ; preds = %33
  store i32 -25472, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

41:                                               ; preds = %33
  %42 = load ptr, ptr %7, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %42, i32 0, i32 0
  %44 = load ptr, ptr %43, align 8, !tbaa !13
  %45 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %44, i32 0, i32 1
  %46 = load i32, ptr %45, align 4, !tbaa !15
  %47 = icmp eq i32 %46, 1
  br i1 %47, label %48, label %76

48:                                               ; preds = %41
  %49 = load i64, ptr %9, align 8, !tbaa !9
  %50 = load i64, ptr %13, align 8, !tbaa !9
  %51 = icmp ne i64 %49, %50
  br i1 %51, label %52, label %53

52:                                               ; preds = %48
  store i32 -25216, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

53:                                               ; preds = %48
  %54 = load i64, ptr %9, align 8, !tbaa !9
  %55 = load ptr, ptr %11, align 8, !tbaa !5
  store i64 %54, ptr %55, align 8, !tbaa !9
  %56 = load ptr, ptr %7, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %56, i32 0, i32 0
  %58 = load ptr, ptr %57, align 8, !tbaa !13
  %59 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %58, i32 0, i32 7
  %60 = load ptr, ptr %59, align 8, !tbaa !17
  %61 = getelementptr inbounds %struct.mbedtls_cipher_base_t, ptr %60, i32 0, i32 1
  %62 = load ptr, ptr %61, align 8, !tbaa !18
  %63 = load ptr, ptr %7, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %63, i32 0, i32 9
  %65 = load ptr, ptr %64, align 8, !tbaa !20
  %66 = load ptr, ptr %7, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %66, i32 0, i32 2
  %68 = load i32, ptr %67, align 4, !tbaa !21
  %69 = load ptr, ptr %8, align 8, !tbaa !5
  %70 = load ptr, ptr %10, align 8, !tbaa !5
  %71 = call i32 %62(ptr noundef %65, i32 noundef %68, ptr noundef %69, ptr noundef %70)
  store i32 %71, ptr %12, align 4, !tbaa !11
  %72 = icmp ne i32 0, %71
  br i1 %72, label %73, label %75

73:                                               ; preds = %53
  %74 = load i32, ptr %12, align 4, !tbaa !11
  store i32 %74, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

75:                                               ; preds = %53
  store i32 0, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

76:                                               ; preds = %41
  %77 = load ptr, ptr %7, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %77, i32 0, i32 0
  %79 = load ptr, ptr %78, align 8, !tbaa !13
  %80 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %79, i32 0, i32 1
  %81 = load i32, ptr %80, align 4, !tbaa !15
  %82 = icmp eq i32 %81, 6
  br i1 %82, label %83, label %93

83:                                               ; preds = %76
  %84 = load i64, ptr %9, align 8, !tbaa !9
  %85 = load ptr, ptr %11, align 8, !tbaa !5
  store i64 %84, ptr %85, align 8, !tbaa !9
  %86 = load ptr, ptr %7, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %86, i32 0, i32 9
  %88 = load ptr, ptr %87, align 8, !tbaa !20
  %89 = load i64, ptr %9, align 8, !tbaa !9
  %90 = load ptr, ptr %8, align 8, !tbaa !5
  %91 = load ptr, ptr %10, align 8, !tbaa !5
  %92 = call i32 @mbedtls_gcm_update(ptr noundef %88, i64 noundef %89, ptr noundef %90, ptr noundef %91)
  store i32 %92, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

93:                                               ; preds = %76
  %94 = load ptr, ptr %7, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %94, i32 0, i32 0
  %96 = load ptr, ptr %95, align 8, !tbaa !13
  %97 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %96, i32 0, i32 0
  %98 = load i32, ptr %97, align 8, !tbaa !22
  %99 = icmp eq i32 %98, 73
  br i1 %99, label %100, label %110

100:                                              ; preds = %93
  %101 = load i64, ptr %9, align 8, !tbaa !9
  %102 = load ptr, ptr %11, align 8, !tbaa !5
  store i64 %101, ptr %102, align 8, !tbaa !9
  %103 = load ptr, ptr %7, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %103, i32 0, i32 9
  %105 = load ptr, ptr %104, align 8, !tbaa !20
  %106 = load i64, ptr %9, align 8, !tbaa !9
  %107 = load ptr, ptr %8, align 8, !tbaa !5
  %108 = load ptr, ptr %10, align 8, !tbaa !5
  %109 = call i32 @mbedtls_chachapoly_update(ptr noundef %105, i64 noundef %106, ptr noundef %107, ptr noundef %108)
  store i32 %109, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

110:                                              ; preds = %93
  %111 = load ptr, ptr %8, align 8, !tbaa !5
  %112 = load ptr, ptr %10, align 8, !tbaa !5
  %113 = icmp eq ptr %111, %112
  br i1 %113, label %114, label %125

114:                                              ; preds = %110
  %115 = load ptr, ptr %7, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %115, i32 0, i32 6
  %117 = load i64, ptr %116, align 8, !tbaa !23
  %118 = icmp ne i64 %117, 0
  br i1 %118, label %124, label %119

119:                                              ; preds = %114
  %120 = load i64, ptr %9, align 8, !tbaa !9
  %121 = load i64, ptr %13, align 8, !tbaa !9
  %122 = urem i64 %120, %121
  %123 = icmp ne i64 %122, 0
  br i1 %123, label %124, label %125

124:                                              ; preds = %119, %114
  store i32 -24832, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

125:                                              ; preds = %119, %110
  %126 = load ptr, ptr %7, align 8, !tbaa !5
  %127 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %126, i32 0, i32 0
  %128 = load ptr, ptr %127, align 8, !tbaa !13
  %129 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %128, i32 0, i32 1
  %130 = load i32, ptr %129, align 4, !tbaa !15
  %131 = icmp eq i32 %130, 2
  br i1 %131, label %132, label %328

132:                                              ; preds = %125
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  store i64 0, ptr %15, align 8, !tbaa !9
  %133 = load ptr, ptr %7, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %133, i32 0, i32 2
  %135 = load i32, ptr %134, align 4, !tbaa !21
  %136 = icmp eq i32 %135, 0
  br i1 %136, label %137, label %150

137:                                              ; preds = %132
  %138 = load ptr, ptr %7, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %138, i32 0, i32 3
  %140 = load ptr, ptr %139, align 8, !tbaa !24
  %141 = icmp ne ptr null, %140
  br i1 %141, label %142, label %150

142:                                              ; preds = %137
  %143 = load i64, ptr %9, align 8, !tbaa !9
  %144 = load i64, ptr %13, align 8, !tbaa !9
  %145 = load ptr, ptr %7, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %145, i32 0, i32 6
  %147 = load i64, ptr %146, align 8, !tbaa !23
  %148 = sub i64 %144, %147
  %149 = icmp ule i64 %143, %148
  br i1 %149, label %181, label %150

150:                                              ; preds = %142, %137, %132
  %151 = load ptr, ptr %7, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %151, i32 0, i32 2
  %153 = load i32, ptr %152, align 4, !tbaa !21
  %154 = icmp eq i32 %153, 0
  br i1 %154, label %155, label %168

155:                                              ; preds = %150
  %156 = load ptr, ptr %7, align 8, !tbaa !5
  %157 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %156, i32 0, i32 3
  %158 = load ptr, ptr %157, align 8, !tbaa !24
  %159 = icmp eq ptr null, %158
  br i1 %159, label %160, label %168

160:                                              ; preds = %155
  %161 = load i64, ptr %9, align 8, !tbaa !9
  %162 = load i64, ptr %13, align 8, !tbaa !9
  %163 = load ptr, ptr %7, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %163, i32 0, i32 6
  %165 = load i64, ptr %164, align 8, !tbaa !23
  %166 = sub i64 %162, %165
  %167 = icmp ult i64 %161, %166
  br i1 %167, label %181, label %168

168:                                              ; preds = %160, %155, %150
  %169 = load ptr, ptr %7, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %169, i32 0, i32 2
  %171 = load i32, ptr %170, align 4, !tbaa !21
  %172 = icmp eq i32 %171, 1
  br i1 %172, label %173, label %195

173:                                              ; preds = %168
  %174 = load i64, ptr %9, align 8, !tbaa !9
  %175 = load i64, ptr %13, align 8, !tbaa !9
  %176 = load ptr, ptr %7, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %176, i32 0, i32 6
  %178 = load i64, ptr %177, align 8, !tbaa !23
  %179 = sub i64 %175, %178
  %180 = icmp ult i64 %174, %179
  br i1 %180, label %181, label %195

181:                                              ; preds = %173, %160, %142
  %182 = load ptr, ptr %7, align 8, !tbaa !5
  %183 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %182, i32 0, i32 5
  %184 = load ptr, ptr %7, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %184, i32 0, i32 6
  %186 = load i64, ptr %185, align 8, !tbaa !23
  %187 = getelementptr inbounds [16 x i8], ptr %183, i64 0, i64 %186
  %188 = load ptr, ptr %8, align 8, !tbaa !5
  %189 = load i64, ptr %9, align 8, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %187, ptr align 1 %188, i64 %189, i1 false)
  %190 = load i64, ptr %9, align 8, !tbaa !9
  %191 = load ptr, ptr %7, align 8, !tbaa !5
  %192 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %191, i32 0, i32 6
  %193 = load i64, ptr %192, align 8, !tbaa !23
  %194 = add i64 %193, %190
  store i64 %194, ptr %192, align 8, !tbaa !23
  store i32 0, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %327

195:                                              ; preds = %173, %168
  %196 = load ptr, ptr %7, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %196, i32 0, i32 6
  %198 = load i64, ptr %197, align 8, !tbaa !23
  %199 = icmp ne i64 0, %198
  br i1 %199, label %200, label %255

200:                                              ; preds = %195
  %201 = load i64, ptr %13, align 8, !tbaa !9
  %202 = load ptr, ptr %7, align 8, !tbaa !5
  %203 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %202, i32 0, i32 6
  %204 = load i64, ptr %203, align 8, !tbaa !23
  %205 = sub i64 %201, %204
  store i64 %205, ptr %15, align 8, !tbaa !9
  %206 = load ptr, ptr %7, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %206, i32 0, i32 5
  %208 = load ptr, ptr %7, align 8, !tbaa !5
  %209 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %208, i32 0, i32 6
  %210 = load i64, ptr %209, align 8, !tbaa !23
  %211 = getelementptr inbounds [16 x i8], ptr %207, i64 0, i64 %210
  %212 = load ptr, ptr %8, align 8, !tbaa !5
  %213 = load i64, ptr %15, align 8, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %211, ptr align 1 %212, i64 %213, i1 false)
  %214 = load ptr, ptr %7, align 8, !tbaa !5
  %215 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %214, i32 0, i32 0
  %216 = load ptr, ptr %215, align 8, !tbaa !13
  %217 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %216, i32 0, i32 7
  %218 = load ptr, ptr %217, align 8, !tbaa !17
  %219 = getelementptr inbounds %struct.mbedtls_cipher_base_t, ptr %218, i32 0, i32 2
  %220 = load ptr, ptr %219, align 8, !tbaa !25
  %221 = load ptr, ptr %7, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %221, i32 0, i32 9
  %223 = load ptr, ptr %222, align 8, !tbaa !20
  %224 = load ptr, ptr %7, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %224, i32 0, i32 2
  %226 = load i32, ptr %225, align 4, !tbaa !21
  %227 = load i64, ptr %13, align 8, !tbaa !9
  %228 = load ptr, ptr %7, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %228, i32 0, i32 7
  %230 = getelementptr inbounds [16 x i8], ptr %229, i64 0, i64 0
  %231 = load ptr, ptr %7, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %231, i32 0, i32 5
  %233 = getelementptr inbounds [16 x i8], ptr %232, i64 0, i64 0
  %234 = load ptr, ptr %10, align 8, !tbaa !5
  %235 = call i32 %220(ptr noundef %223, i32 noundef %226, i64 noundef %227, ptr noundef %230, ptr noundef %233, ptr noundef %234)
  store i32 %235, ptr %12, align 4, !tbaa !11
  %236 = icmp ne i32 0, %235
  br i1 %236, label %237, label %239

237:                                              ; preds = %200
  %238 = load i32, ptr %12, align 4, !tbaa !11
  store i32 %238, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %327

239:                                              ; preds = %200
  %240 = load i64, ptr %13, align 8, !tbaa !9
  %241 = load ptr, ptr %11, align 8, !tbaa !5
  %242 = load i64, ptr %241, align 8, !tbaa !9
  %243 = add i64 %242, %240
  store i64 %243, ptr %241, align 8, !tbaa !9
  %244 = load i64, ptr %13, align 8, !tbaa !9
  %245 = load ptr, ptr %10, align 8, !tbaa !5
  %246 = getelementptr inbounds i8, ptr %245, i64 %244
  store ptr %246, ptr %10, align 8, !tbaa !5
  %247 = load ptr, ptr %7, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %247, i32 0, i32 6
  store i64 0, ptr %248, align 8, !tbaa !23
  %249 = load i64, ptr %15, align 8, !tbaa !9
  %250 = load ptr, ptr %8, align 8, !tbaa !5
  %251 = getelementptr inbounds i8, ptr %250, i64 %249
  store ptr %251, ptr %8, align 8, !tbaa !5
  %252 = load i64, ptr %15, align 8, !tbaa !9
  %253 = load i64, ptr %9, align 8, !tbaa !9
  %254 = sub i64 %253, %252
  store i64 %254, ptr %9, align 8, !tbaa !9
  br label %255

255:                                              ; preds = %239, %195
  %256 = load i64, ptr %9, align 8, !tbaa !9
  %257 = icmp ne i64 0, %256
  br i1 %257, label %258, label %294

258:                                              ; preds = %255
  %259 = load i64, ptr %9, align 8, !tbaa !9
  %260 = load i64, ptr %13, align 8, !tbaa !9
  %261 = urem i64 %259, %260
  store i64 %261, ptr %15, align 8, !tbaa !9
  %262 = load i64, ptr %15, align 8, !tbaa !9
  %263 = icmp eq i64 %262, 0
  br i1 %263, label %264, label %276

264:                                              ; preds = %258
  %265 = load ptr, ptr %7, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %265, i32 0, i32 2
  %267 = load i32, ptr %266, align 4, !tbaa !21
  %268 = icmp eq i32 %267, 0
  br i1 %268, label %269, label %276

269:                                              ; preds = %264
  %270 = load ptr, ptr %7, align 8, !tbaa !5
  %271 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %270, i32 0, i32 3
  %272 = load ptr, ptr %271, align 8, !tbaa !24
  %273 = icmp ne ptr null, %272
  br i1 %273, label %274, label %276

274:                                              ; preds = %269
  %275 = load i64, ptr %13, align 8, !tbaa !9
  store i64 %275, ptr %15, align 8, !tbaa !9
  br label %276

276:                                              ; preds = %274, %269, %264, %258
  %277 = load ptr, ptr %7, align 8, !tbaa !5
  %278 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %277, i32 0, i32 5
  %279 = getelementptr inbounds [16 x i8], ptr %278, i64 0, i64 0
  %280 = load ptr, ptr %8, align 8, !tbaa !5
  %281 = load i64, ptr %9, align 8, !tbaa !9
  %282 = load i64, ptr %15, align 8, !tbaa !9
  %283 = sub i64 %281, %282
  %284 = getelementptr inbounds i8, ptr %280, i64 %283
  %285 = load i64, ptr %15, align 8, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %279, ptr align 1 %284, i64 %285, i1 false)
  %286 = load i64, ptr %15, align 8, !tbaa !9
  %287 = load ptr, ptr %7, align 8, !tbaa !5
  %288 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %287, i32 0, i32 6
  %289 = load i64, ptr %288, align 8, !tbaa !23
  %290 = add i64 %289, %286
  store i64 %290, ptr %288, align 8, !tbaa !23
  %291 = load i64, ptr %15, align 8, !tbaa !9
  %292 = load i64, ptr %9, align 8, !tbaa !9
  %293 = sub i64 %292, %291
  store i64 %293, ptr %9, align 8, !tbaa !9
  br label %294

294:                                              ; preds = %276, %255
  %295 = load i64, ptr %9, align 8, !tbaa !9
  %296 = icmp ne i64 %295, 0
  br i1 %296, label %297, label %326

297:                                              ; preds = %294
  %298 = load ptr, ptr %7, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %298, i32 0, i32 0
  %300 = load ptr, ptr %299, align 8, !tbaa !13
  %301 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %300, i32 0, i32 7
  %302 = load ptr, ptr %301, align 8, !tbaa !17
  %303 = getelementptr inbounds %struct.mbedtls_cipher_base_t, ptr %302, i32 0, i32 2
  %304 = load ptr, ptr %303, align 8, !tbaa !25
  %305 = load ptr, ptr %7, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %305, i32 0, i32 9
  %307 = load ptr, ptr %306, align 8, !tbaa !20
  %308 = load ptr, ptr %7, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %308, i32 0, i32 2
  %310 = load i32, ptr %309, align 4, !tbaa !21
  %311 = load i64, ptr %9, align 8, !tbaa !9
  %312 = load ptr, ptr %7, align 8, !tbaa !5
  %313 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %312, i32 0, i32 7
  %314 = getelementptr inbounds [16 x i8], ptr %313, i64 0, i64 0
  %315 = load ptr, ptr %8, align 8, !tbaa !5
  %316 = load ptr, ptr %10, align 8, !tbaa !5
  %317 = call i32 %304(ptr noundef %307, i32 noundef %310, i64 noundef %311, ptr noundef %314, ptr noundef %315, ptr noundef %316)
  store i32 %317, ptr %12, align 4, !tbaa !11
  %318 = icmp ne i32 0, %317
  br i1 %318, label %319, label %321

319:                                              ; preds = %297
  %320 = load i32, ptr %12, align 4, !tbaa !11
  store i32 %320, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %327

321:                                              ; preds = %297
  %322 = load i64, ptr %9, align 8, !tbaa !9
  %323 = load ptr, ptr %11, align 8, !tbaa !5
  %324 = load i64, ptr %323, align 8, !tbaa !9
  %325 = add i64 %324, %322
  store i64 %325, ptr %323, align 8, !tbaa !9
  br label %326

326:                                              ; preds = %321, %294
  store i32 0, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %327

327:                                              ; preds = %326, %319, %237, %181
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  br label %503

328:                                              ; preds = %125
  %329 = load ptr, ptr %7, align 8, !tbaa !5
  %330 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %329, i32 0, i32 0
  %331 = load ptr, ptr %330, align 8, !tbaa !13
  %332 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %331, i32 0, i32 1
  %333 = load i32, ptr %332, align 4, !tbaa !15
  %334 = icmp eq i32 %333, 3
  br i1 %334, label %335, label %364

335:                                              ; preds = %328
  %336 = load ptr, ptr %7, align 8, !tbaa !5
  %337 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %336, i32 0, i32 0
  %338 = load ptr, ptr %337, align 8, !tbaa !13
  %339 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %338, i32 0, i32 7
  %340 = load ptr, ptr %339, align 8, !tbaa !17
  %341 = getelementptr inbounds %struct.mbedtls_cipher_base_t, ptr %340, i32 0, i32 3
  %342 = load ptr, ptr %341, align 8, !tbaa !26
  %343 = load ptr, ptr %7, align 8, !tbaa !5
  %344 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %343, i32 0, i32 9
  %345 = load ptr, ptr %344, align 8, !tbaa !20
  %346 = load ptr, ptr %7, align 8, !tbaa !5
  %347 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %346, i32 0, i32 2
  %348 = load i32, ptr %347, align 4, !tbaa !21
  %349 = load i64, ptr %9, align 8, !tbaa !9
  %350 = load ptr, ptr %7, align 8, !tbaa !5
  %351 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %350, i32 0, i32 6
  %352 = load ptr, ptr %7, align 8, !tbaa !5
  %353 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %352, i32 0, i32 7
  %354 = getelementptr inbounds [16 x i8], ptr %353, i64 0, i64 0
  %355 = load ptr, ptr %8, align 8, !tbaa !5
  %356 = load ptr, ptr %10, align 8, !tbaa !5
  %357 = call i32 %342(ptr noundef %345, i32 noundef %348, i64 noundef %349, ptr noundef %351, ptr noundef %354, ptr noundef %355, ptr noundef %356)
  store i32 %357, ptr %12, align 4, !tbaa !11
  %358 = icmp ne i32 0, %357
  br i1 %358, label %359, label %361

359:                                              ; preds = %335
  %360 = load i32, ptr %12, align 4, !tbaa !11
  store i32 %360, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

361:                                              ; preds = %335
  %362 = load i64, ptr %9, align 8, !tbaa !9
  %363 = load ptr, ptr %11, align 8, !tbaa !5
  store i64 %362, ptr %363, align 8, !tbaa !9
  store i32 0, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

364:                                              ; preds = %328
  %365 = load ptr, ptr %7, align 8, !tbaa !5
  %366 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %365, i32 0, i32 0
  %367 = load ptr, ptr %366, align 8, !tbaa !13
  %368 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %367, i32 0, i32 1
  %369 = load i32, ptr %368, align 4, !tbaa !15
  %370 = icmp eq i32 %369, 4
  br i1 %370, label %371, label %397

371:                                              ; preds = %364
  %372 = load ptr, ptr %7, align 8, !tbaa !5
  %373 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %372, i32 0, i32 0
  %374 = load ptr, ptr %373, align 8, !tbaa !13
  %375 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %374, i32 0, i32 7
  %376 = load ptr, ptr %375, align 8, !tbaa !17
  %377 = getelementptr inbounds %struct.mbedtls_cipher_base_t, ptr %376, i32 0, i32 4
  %378 = load ptr, ptr %377, align 8, !tbaa !27
  %379 = load ptr, ptr %7, align 8, !tbaa !5
  %380 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %379, i32 0, i32 9
  %381 = load ptr, ptr %380, align 8, !tbaa !20
  %382 = load i64, ptr %9, align 8, !tbaa !9
  %383 = load ptr, ptr %7, align 8, !tbaa !5
  %384 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %383, i32 0, i32 6
  %385 = load ptr, ptr %7, align 8, !tbaa !5
  %386 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %385, i32 0, i32 7
  %387 = getelementptr inbounds [16 x i8], ptr %386, i64 0, i64 0
  %388 = load ptr, ptr %8, align 8, !tbaa !5
  %389 = load ptr, ptr %10, align 8, !tbaa !5
  %390 = call i32 %378(ptr noundef %381, i64 noundef %382, ptr noundef %384, ptr noundef %387, ptr noundef %388, ptr noundef %389)
  store i32 %390, ptr %12, align 4, !tbaa !11
  %391 = icmp ne i32 0, %390
  br i1 %391, label %392, label %394

392:                                              ; preds = %371
  %393 = load i32, ptr %12, align 4, !tbaa !11
  store i32 %393, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

394:                                              ; preds = %371
  %395 = load i64, ptr %9, align 8, !tbaa !9
  %396 = load ptr, ptr %11, align 8, !tbaa !5
  store i64 %395, ptr %396, align 8, !tbaa !9
  store i32 0, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

397:                                              ; preds = %364
  %398 = load ptr, ptr %7, align 8, !tbaa !5
  %399 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %398, i32 0, i32 0
  %400 = load ptr, ptr %399, align 8, !tbaa !13
  %401 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %400, i32 0, i32 1
  %402 = load i32, ptr %401, align 4, !tbaa !15
  %403 = icmp eq i32 %402, 5
  br i1 %403, label %404, label %433

404:                                              ; preds = %397
  %405 = load ptr, ptr %7, align 8, !tbaa !5
  %406 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %405, i32 0, i32 0
  %407 = load ptr, ptr %406, align 8, !tbaa !13
  %408 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %407, i32 0, i32 7
  %409 = load ptr, ptr %408, align 8, !tbaa !17
  %410 = getelementptr inbounds %struct.mbedtls_cipher_base_t, ptr %409, i32 0, i32 5
  %411 = load ptr, ptr %410, align 8, !tbaa !28
  %412 = load ptr, ptr %7, align 8, !tbaa !5
  %413 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %412, i32 0, i32 9
  %414 = load ptr, ptr %413, align 8, !tbaa !20
  %415 = load i64, ptr %9, align 8, !tbaa !9
  %416 = load ptr, ptr %7, align 8, !tbaa !5
  %417 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %416, i32 0, i32 6
  %418 = load ptr, ptr %7, align 8, !tbaa !5
  %419 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %418, i32 0, i32 7
  %420 = getelementptr inbounds [16 x i8], ptr %419, i64 0, i64 0
  %421 = load ptr, ptr %7, align 8, !tbaa !5
  %422 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %421, i32 0, i32 5
  %423 = getelementptr inbounds [16 x i8], ptr %422, i64 0, i64 0
  %424 = load ptr, ptr %8, align 8, !tbaa !5
  %425 = load ptr, ptr %10, align 8, !tbaa !5
  %426 = call i32 %411(ptr noundef %414, i64 noundef %415, ptr noundef %417, ptr noundef %420, ptr noundef %423, ptr noundef %424, ptr noundef %425)
  store i32 %426, ptr %12, align 4, !tbaa !11
  %427 = icmp ne i32 0, %426
  br i1 %427, label %428, label %430

428:                                              ; preds = %404
  %429 = load i32, ptr %12, align 4, !tbaa !11
  store i32 %429, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

430:                                              ; preds = %404
  %431 = load i64, ptr %9, align 8, !tbaa !9
  %432 = load ptr, ptr %11, align 8, !tbaa !5
  store i64 %431, ptr %432, align 8, !tbaa !9
  store i32 0, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

433:                                              ; preds = %397
  %434 = load ptr, ptr %7, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %434, i32 0, i32 0
  %436 = load ptr, ptr %435, align 8, !tbaa !13
  %437 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %436, i32 0, i32 1
  %438 = load i32, ptr %437, align 4, !tbaa !15
  %439 = icmp eq i32 %438, 9
  br i1 %439, label %440, label %474

440:                                              ; preds = %433
  %441 = load ptr, ptr %7, align 8, !tbaa !5
  %442 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %441, i32 0, i32 6
  %443 = load i64, ptr %442, align 8, !tbaa !23
  %444 = icmp ugt i64 %443, 0
  br i1 %444, label %445, label %446

445:                                              ; preds = %440
  store i32 -24704, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

446:                                              ; preds = %440
  %447 = load ptr, ptr %7, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %447, i32 0, i32 0
  %449 = load ptr, ptr %448, align 8, !tbaa !13
  %450 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %449, i32 0, i32 7
  %451 = load ptr, ptr %450, align 8, !tbaa !17
  %452 = getelementptr inbounds %struct.mbedtls_cipher_base_t, ptr %451, i32 0, i32 6
  %453 = load ptr, ptr %452, align 8, !tbaa !29
  %454 = load ptr, ptr %7, align 8, !tbaa !5
  %455 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %454, i32 0, i32 9
  %456 = load ptr, ptr %455, align 8, !tbaa !20
  %457 = load ptr, ptr %7, align 8, !tbaa !5
  %458 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %457, i32 0, i32 2
  %459 = load i32, ptr %458, align 4, !tbaa !21
  %460 = load i64, ptr %9, align 8, !tbaa !9
  %461 = load ptr, ptr %7, align 8, !tbaa !5
  %462 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %461, i32 0, i32 7
  %463 = getelementptr inbounds [16 x i8], ptr %462, i64 0, i64 0
  %464 = load ptr, ptr %8, align 8, !tbaa !5
  %465 = load ptr, ptr %10, align 8, !tbaa !5
  %466 = call i32 %453(ptr noundef %456, i32 noundef %459, i64 noundef %460, ptr noundef %463, ptr noundef %464, ptr noundef %465)
  store i32 %466, ptr %12, align 4, !tbaa !11
  %467 = load i32, ptr %12, align 4, !tbaa !11
  %468 = icmp ne i32 %467, 0
  br i1 %468, label %469, label %471

469:                                              ; preds = %446
  %470 = load i32, ptr %12, align 4, !tbaa !11
  store i32 %470, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

471:                                              ; preds = %446
  %472 = load i64, ptr %9, align 8, !tbaa !9
  %473 = load ptr, ptr %11, align 8, !tbaa !5
  store i64 %472, ptr %473, align 8, !tbaa !9
  store i32 0, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

474:                                              ; preds = %433
  %475 = load ptr, ptr %7, align 8, !tbaa !5
  %476 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %475, i32 0, i32 0
  %477 = load ptr, ptr %476, align 8, !tbaa !13
  %478 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %477, i32 0, i32 1
  %479 = load i32, ptr %478, align 4, !tbaa !15
  %480 = icmp eq i32 %479, 7
  br i1 %480, label %481, label %502

481:                                              ; preds = %474
  %482 = load ptr, ptr %7, align 8, !tbaa !5
  %483 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %482, i32 0, i32 0
  %484 = load ptr, ptr %483, align 8, !tbaa !13
  %485 = getelementptr inbounds %struct.mbedtls_cipher_info_t, ptr %484, i32 0, i32 7
  %486 = load ptr, ptr %485, align 8, !tbaa !17
  %487 = getelementptr inbounds %struct.mbedtls_cipher_base_t, ptr %486, i32 0, i32 7
  %488 = load ptr, ptr %487, align 8, !tbaa !30
  %489 = load ptr, ptr %7, align 8, !tbaa !5
  %490 = getelementptr inbounds %struct.mbedtls_cipher_context_t, ptr %489, i32 0, i32 9
  %491 = load ptr, ptr %490, align 8, !tbaa !20
  %492 = load i64, ptr %9, align 8, !tbaa !9
  %493 = load ptr, ptr %8, align 8, !tbaa !5
  %494 = load ptr, ptr %10, align 8, !tbaa !5
  %495 = call i32 %488(ptr noundef %491, i64 noundef %492, ptr noundef %493, ptr noundef %494)
  store i32 %495, ptr %12, align 4, !tbaa !11
  %496 = icmp ne i32 0, %495
  br i1 %496, label %497, label %499

497:                                              ; preds = %481
  %498 = load i32, ptr %12, align 4, !tbaa !11
  store i32 %498, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

499:                                              ; preds = %481
  %500 = load i64, ptr %9, align 8, !tbaa !9
  %501 = load ptr, ptr %11, align 8, !tbaa !5
  store i64 %500, ptr %501, align 8, !tbaa !9
  store i32 0, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

502:                                              ; preds = %474
  store i32 -24704, ptr %6, align 4
  store i32 1, ptr %14, align 4
  br label %503

503:                                              ; preds = %502, %499, %497, %471, %469, %445, %430, %428, %394, %392, %361, %359, %327, %124, %100, %83, %75, %73, %52, %40, %32
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  %504 = load i32, ptr %6, align 4
  ret i32 %504
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @mbedtls_cipher_get_block_size(ptr noundef) #3

declare i32 @mbedtls_gcm_update(ptr noundef, i64 noundef, ptr noundef, ptr noundef) #4

declare i32 @mbedtls_chachapoly_update(ptr noundef, i64 noundef, ptr noundef, ptr noundef) #4

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 = { inlinehint 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 #4 = { "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 #5 = { 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 = !{!"long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !6, i64 0}
!14 = !{!"mbedtls_cipher_context_t", !6, i64 0, !12, i64 8, !12, i64 12, !6, i64 16, !6, i64 24, !7, i64 32, !10, i64 48, !7, i64 56, !10, i64 72, !6, i64 80, !6, i64 88}
!15 = !{!16, !12, i64 4}
!16 = !{!"mbedtls_cipher_info_t", !12, i64 0, !12, i64 4, !12, i64 8, !6, i64 16, !12, i64 24, !12, i64 28, !12, i64 32, !6, i64 40}
!17 = !{!16, !6, i64 40}
!18 = !{!19, !6, i64 8}
!19 = !{!"mbedtls_cipher_base_t", !12, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88}
!20 = !{!14, !6, i64 80}
!21 = !{!14, !12, i64 12}
!22 = !{!16, !12, i64 0}
!23 = !{!14, !10, i64 48}
!24 = !{!14, !6, i64 16}
!25 = !{!19, !6, i64 16}
!26 = !{!19, !6, i64 24}
!27 = !{!19, !6, i64 32}
!28 = !{!19, !6, i64 40}
!29 = !{!19, !6, i64 48}
!30 = !{!19, !6, i64 56}


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

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #0

; Function Attrs: nounwind uwtable
define dso_local i32 @mbedtls_cipher_update(ptr noundef %0, ptr noundef %1, i64 noundef %2, ptr noundef %3, ptr nocapture noundef %4) local_unnamed_addr #1 {
  %6 = load ptr, ptr %0, align 8, !tbaa !5
  %7 = icmp eq ptr %6, null
  br i1 %7, label %.thread202, label %8

8:                                                ; preds = %5
  store i64 0, ptr %4, align 8, !tbaa !12
  %9 = tail call i32 @mbedtls_cipher_get_block_size(ptr noundef nonnull %0)
  %10 = zext i32 %9 to i64
  %11 = icmp eq i32 %9, 0
  br i1 %11, label %.thread202, label %12

12:                                               ; preds = %8
  %13 = load ptr, ptr %0, align 8, !tbaa !5
  %14 = getelementptr inbounds i8, ptr %13, i64 4
  %15 = load i32, ptr %14, align 4, !tbaa !13
  switch i32 %15, label %31 [
    i32 1, label %16
    i32 6, label %27
  ]

16:                                               ; preds = %12
  %.not198 = icmp eq i64 %10, %2
  br i1 %.not198, label %17, label %.thread202

17:                                               ; preds = %16
  store i64 %2, ptr %4, align 8, !tbaa !12
  %18 = getelementptr inbounds i8, ptr %13, i64 40
  %19 = load ptr, ptr %18, align 8, !tbaa !15
  %20 = getelementptr inbounds i8, ptr %19, i64 8
  %21 = load ptr, ptr %20, align 8, !tbaa !16
  %22 = getelementptr inbounds i8, ptr %0, i64 80
  %23 = load ptr, ptr %22, align 8, !tbaa !18
  %24 = getelementptr inbounds i8, ptr %0, i64 12
  %25 = load i32, ptr %24, align 4, !tbaa !19
  %26 = tail call i32 %21(ptr noundef %23, i32 noundef %25, ptr noundef %1, ptr noundef %3) #4
  br label %.thread202

27:                                               ; preds = %12
  store i64 %2, ptr %4, align 8, !tbaa !12
  %28 = getelementptr inbounds i8, ptr %0, i64 80
  %29 = load ptr, ptr %28, align 8, !tbaa !18
  %30 = tail call i32 @mbedtls_gcm_update(ptr noundef %29, i64 noundef %2, ptr noundef %1, ptr noundef %3) #4
  br label %.thread202

31:                                               ; preds = %12
  %32 = load i32, ptr %13, align 8, !tbaa !20
  %33 = icmp eq i32 %32, 73
  br i1 %33, label %34, label %38

34:                                               ; preds = %31
  store i64 %2, ptr %4, align 8, !tbaa !12
  %35 = getelementptr inbounds i8, ptr %0, i64 80
  %36 = load ptr, ptr %35, align 8, !tbaa !18
  %37 = tail call i32 @mbedtls_chachapoly_update(ptr noundef %36, i64 noundef %2, ptr noundef %1, ptr noundef %3) #4
  br label %.thread202

38:                                               ; preds = %31
  %39 = icmp eq ptr %1, %3
  br i1 %39, label %40, label %45

40:                                               ; preds = %38
  %41 = getelementptr inbounds i8, ptr %0, i64 48
  %42 = load i64, ptr %41, align 8, !tbaa !21
  %.not = icmp eq i64 %42, 0
  br i1 %.not, label %43, label %.thread202

43:                                               ; preds = %40
  %44 = urem i64 %2, %10
  %.not183 = icmp eq i64 %44, 0
  br i1 %.not183, label %45, label %.thread202

45:                                               ; preds = %43, %38
  switch i32 %15, label %.thread202 [
    i32 2, label %46
    i32 3, label %122
    i32 4, label %135
    i32 5, label %146
    i32 9, label %158
    i32 7, label %173
  ]

46:                                               ; preds = %45
  %47 = getelementptr inbounds i8, ptr %0, i64 12
  %48 = load i32, ptr %47, align 4, !tbaa !19
  switch i32 %48, label %.thread201 [
    i32 0, label %49
    i32 1, label %58
  ]

49:                                               ; preds = %46
  %50 = getelementptr inbounds i8, ptr %0, i64 16
  %51 = load ptr, ptr %50, align 8, !tbaa !22
  %.not190 = icmp eq ptr %51, null
  %52 = getelementptr inbounds i8, ptr %0, i64 48
  %53 = load i64, ptr %52, align 8, !tbaa !21
  %54 = sub i64 %10, %53
  br i1 %.not190, label %56, label %55

55:                                               ; preds = %49
  %.not191 = icmp ult i64 %54, %2
  br i1 %.not191, label %.thread201, label %63

56:                                               ; preds = %49
  %57 = icmp ugt i64 %54, %2
  br i1 %57, label %63, label %.thread201

58:                                               ; preds = %46
  %59 = getelementptr inbounds i8, ptr %0, i64 48
  %60 = load i64, ptr %59, align 8, !tbaa !21
  %61 = sub i64 %10, %60
  %62 = icmp ugt i64 %61, %2
  br i1 %62, label %63, label %.thread201

63:                                               ; preds = %58, %56, %55
  %64 = phi i64 [ %60, %58 ], [ %53, %56 ], [ %53, %55 ]
  %65 = getelementptr inbounds i8, ptr %0, i64 32
  %66 = getelementptr inbounds i8, ptr %0, i64 48
  %67 = getelementptr inbounds [16 x i8], ptr %65, i64 0, i64 %64
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %67, ptr align 1 %1, i64 %2, i1 false)
  %68 = load i64, ptr %66, align 8, !tbaa !21
  %69 = add i64 %68, %2
  store i64 %69, ptr %66, align 8, !tbaa !21
  br label %.thread202

.thread201:                                       ; preds = %55, %46, %56, %58
  %70 = getelementptr inbounds i8, ptr %0, i64 48
  %71 = load i64, ptr %70, align 8, !tbaa !21
  %.not192 = icmp eq i64 %71, 0
  br i1 %.not192, label %92, label %72

72:                                               ; preds = %.thread201
  %73 = sub i64 %10, %71
  %74 = getelementptr inbounds i8, ptr %0, i64 32
  %75 = getelementptr inbounds [16 x i8], ptr %74, i64 0, i64 %71
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %75, ptr align 1 %1, i64 %73, i1 false)
  %76 = load ptr, ptr %0, align 8, !tbaa !5
  %77 = getelementptr inbounds i8, ptr %76, i64 40
  %78 = load ptr, ptr %77, align 8, !tbaa !15
  %79 = getelementptr inbounds i8, ptr %78, i64 16
  %80 = load ptr, ptr %79, align 8, !tbaa !23
  %81 = getelementptr inbounds i8, ptr %0, i64 80
  %82 = load ptr, ptr %81, align 8, !tbaa !18
  %83 = load i32, ptr %47, align 4, !tbaa !19
  %84 = getelementptr inbounds i8, ptr %0, i64 56
  %85 = tail call i32 %80(ptr noundef %82, i32 noundef %83, i64 noundef %10, ptr noundef nonnull %84, ptr noundef nonnull %74, ptr noundef %3) #4
  %.not193 = icmp eq i32 %85, 0
  br i1 %.not193, label %86, label %.thread202

86:                                               ; preds = %72
  %87 = load i64, ptr %4, align 8, !tbaa !12
  %88 = add i64 %87, %10
  store i64 %88, ptr %4, align 8, !tbaa !12
  %89 = getelementptr inbounds i8, ptr %3, i64 %10
  store i64 0, ptr %70, align 8, !tbaa !21
  %90 = getelementptr inbounds i8, ptr %1, i64 %73
  %91 = sub i64 %2, %73
  br label %92

92:                                               ; preds = %86, %.thread201
  %.0166 = phi i64 [ %91, %86 ], [ %2, %.thread201 ]
  %.0165 = phi ptr [ %89, %86 ], [ %3, %.thread201 ]
  %.0164 = phi ptr [ %90, %86 ], [ %1, %.thread201 ]
  %.not194 = icmp eq i64 %.0166, 0
  br i1 %.not194, label %.thread202, label %93

93:                                               ; preds = %92
  %94 = urem i64 %.0166, %10
  %95 = icmp eq i64 %94, 0
  br i1 %95, label %96, label %102

96:                                               ; preds = %93
  %97 = load i32, ptr %47, align 4, !tbaa !19
  %98 = icmp eq i32 %97, 0
  br i1 %98, label %99, label %102

99:                                               ; preds = %96
  %100 = getelementptr inbounds i8, ptr %0, i64 16
  %101 = load ptr, ptr %100, align 8, !tbaa !22
  %.not195 = icmp eq ptr %101, null
  %spec.select = select i1 %.not195, i64 0, i64 %10
  br label %102

102:                                              ; preds = %93, %96, %99
  %.0 = phi i64 [ 0, %96 ], [ %94, %93 ], [ %spec.select, %99 ]
  %103 = getelementptr inbounds i8, ptr %0, i64 32
  %104 = sub i64 %.0166, %.0
  %105 = getelementptr inbounds i8, ptr %.0164, i64 %104
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %103, ptr align 1 %105, i64 %.0, i1 false)
  %106 = load i64, ptr %70, align 8, !tbaa !21
  %107 = add i64 %106, %.0
  store i64 %107, ptr %70, align 8, !tbaa !21
  %.not196 = icmp eq i64 %.0166, %.0
  br i1 %.not196, label %.thread202, label %108

108:                                              ; preds = %102
  %109 = load ptr, ptr %0, align 8, !tbaa !5
  %110 = getelementptr inbounds i8, ptr %109, i64 40
  %111 = load ptr, ptr %110, align 8, !tbaa !15
  %112 = getelementptr inbounds i8, ptr %111, i64 16
  %113 = load ptr, ptr %112, align 8, !tbaa !23
  %114 = getelementptr inbounds i8, ptr %0, i64 80
  %115 = load ptr, ptr %114, align 8, !tbaa !18
  %116 = load i32, ptr %47, align 4, !tbaa !19
  %117 = getelementptr inbounds i8, ptr %0, i64 56
  %118 = tail call i32 %113(ptr noundef %115, i32 noundef %116, i64 noundef %104, ptr noundef nonnull %117, ptr noundef %.0164, ptr noundef %.0165) #4
  %.not197 = icmp eq i32 %118, 0
  br i1 %.not197, label %119, label %.thread202

119:                                              ; preds = %108
  %120 = load i64, ptr %4, align 8, !tbaa !12
  %121 = add i64 %120, %104
  store i64 %121, ptr %4, align 8, !tbaa !12
  br label %.thread202

122:                                              ; preds = %45
  %123 = getelementptr inbounds i8, ptr %13, i64 40
  %124 = load ptr, ptr %123, align 8, !tbaa !15
  %125 = getelementptr inbounds i8, ptr %124, i64 24
  %126 = load ptr, ptr %125, align 8, !tbaa !24
  %127 = getelementptr inbounds i8, ptr %0, i64 80
  %128 = load ptr, ptr %127, align 8, !tbaa !18
  %129 = getelementptr inbounds i8, ptr %0, i64 12
  %130 = load i32, ptr %129, align 4, !tbaa !19
  %131 = getelementptr inbounds i8, ptr %0, i64 48
  %132 = getelementptr inbounds i8, ptr %0, i64 56
  %133 = tail call i32 %126(ptr noundef %128, i32 noundef %130, i64 noundef %2, ptr noundef nonnull %131, ptr noundef nonnull %132, ptr noundef %1, ptr noundef %3) #4
  %.not189 = icmp eq i32 %133, 0
  br i1 %.not189, label %134, label %.thread202

134:                                              ; preds = %122
  store i64 %2, ptr %4, align 8, !tbaa !12
  br label %.thread202

135:                                              ; preds = %45
  %136 = getelementptr inbounds i8, ptr %13, i64 40
  %137 = load ptr, ptr %136, align 8, !tbaa !15
  %138 = getelementptr inbounds i8, ptr %137, i64 32
  %139 = load ptr, ptr %138, align 8, !tbaa !25
  %140 = getelementptr inbounds i8, ptr %0, i64 80
  %141 = load ptr, ptr %140, align 8, !tbaa !18
  %142 = getelementptr inbounds i8, ptr %0, i64 48
  %143 = getelementptr inbounds i8, ptr %0, i64 56
  %144 = tail call i32 %139(ptr noundef %141, i64 noundef %2, ptr noundef nonnull %142, ptr noundef nonnull %143, ptr noundef %1, ptr noundef %3) #4
  %.not188 = icmp eq i32 %144, 0
  br i1 %.not188, label %145, label %.thread202

145:                                              ; preds = %135
  store i64 %2, ptr %4, align 8, !tbaa !12
  br label %.thread202

146:                                              ; preds = %45
  %147 = getelementptr inbounds i8, ptr %13, i64 40
  %148 = load ptr, ptr %147, align 8, !tbaa !15
  %149 = getelementptr inbounds i8, ptr %148, i64 40
  %150 = load ptr, ptr %149, align 8, !tbaa !26
  %151 = getelementptr inbounds i8, ptr %0, i64 80
  %152 = load ptr, ptr %151, align 8, !tbaa !18
  %153 = getelementptr inbounds i8, ptr %0, i64 48
  %154 = getelementptr inbounds i8, ptr %0, i64 56
  %155 = getelementptr inbounds i8, ptr %0, i64 32
  %156 = tail call i32 %150(ptr noundef %152, i64 noundef %2, ptr noundef nonnull %153, ptr noundef nonnull %154, ptr noundef nonnull %155, ptr noundef %1, ptr noundef %3) #4
  %.not187 = icmp eq i32 %156, 0
  br i1 %.not187, label %157, label %.thread202

157:                                              ; preds = %146
  store i64 %2, ptr %4, align 8, !tbaa !12
  br label %.thread202

158:                                              ; preds = %45
  %159 = getelementptr inbounds i8, ptr %0, i64 48
  %160 = load i64, ptr %159, align 8, !tbaa !21
  %.not185 = icmp eq i64 %160, 0
  br i1 %.not185, label %161, label %.thread202

161:                                              ; preds = %158
  %162 = getelementptr inbounds i8, ptr %13, i64 40
  %163 = load ptr, ptr %162, align 8, !tbaa !15
  %164 = getelementptr inbounds i8, ptr %163, i64 48
  %165 = load ptr, ptr %164, align 8, !tbaa !27
  %166 = getelementptr inbounds i8, ptr %0, i64 80
  %167 = load ptr, ptr %166, align 8, !tbaa !18
  %168 = getelementptr inbounds i8, ptr %0, i64 12
  %169 = load i32, ptr %168, align 4, !tbaa !19
  %170 = getelementptr inbounds i8, ptr %0, i64 56
  %171 = tail call i32 %165(ptr noundef %167, i32 noundef %169, i64 noundef %2, ptr noundef nonnull %170, ptr noundef %1, ptr noundef %3) #4
  %.not186 = icmp eq i32 %171, 0
  br i1 %.not186, label %172, label %.thread202

172:                                              ; preds = %161
  store i64 %2, ptr %4, align 8, !tbaa !12
  br label %.thread202

173:                                              ; preds = %45
  %174 = getelementptr inbounds i8, ptr %13, i64 40
  %175 = load ptr, ptr %174, align 8, !tbaa !15
  %176 = getelementptr inbounds i8, ptr %175, i64 56
  %177 = load ptr, ptr %176, align 8, !tbaa !28
  %178 = getelementptr inbounds i8, ptr %0, i64 80
  %179 = load ptr, ptr %178, align 8, !tbaa !18
  %180 = tail call i32 %177(ptr noundef %179, i64 noundef %2, ptr noundef %1, ptr noundef %3) #4
  %.not184 = icmp eq i32 %180, 0
  br i1 %.not184, label %181, label %.thread202

181:                                              ; preds = %173
  store i64 %2, ptr %4, align 8, !tbaa !12
  br label %.thread202

.thread202:                                       ; preds = %92, %45, %173, %161, %158, %146, %135, %122, %63, %72, %108, %119, %102, %40, %43, %17, %16, %8, %5, %181, %172, %157, %145, %134, %34, %27
  %.1 = phi i32 [ %30, %27 ], [ %37, %34 ], [ 0, %134 ], [ 0, %145 ], [ 0, %157 ], [ 0, %172 ], [ 0, %181 ], [ -24832, %5 ], [ -25472, %8 ], [ -25216, %16 ], [ %26, %17 ], [ -24832, %43 ], [ -24832, %40 ], [ 0, %63 ], [ %85, %72 ], [ %118, %108 ], [ 0, %119 ], [ 0, %102 ], [ %133, %122 ], [ %144, %135 ], [ %156, %146 ], [ -24704, %158 ], [ %171, %161 ], [ %180, %173 ], [ -24704, %45 ], [ 0, %92 ]
  ret i32 %.1
}

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

declare i32 @mbedtls_gcm_update(ptr noundef, i64 noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

declare i32 @mbedtls_chachapoly_update(ptr noundef, i64 noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

attributes #0 = { mustprogress nocallback nofree 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 = { inlinehint 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 = { "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 #4 = { 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 = !{!"mbedtls_cipher_context_t", !7, i64 0, !10, i64 8, !10, i64 12, !7, i64 16, !7, i64 24, !8, i64 32, !11, i64 48, !8, i64 56, !11, i64 72, !7, i64 80, !7, i64 88}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"long", !8, i64 0}
!12 = !{!11, !11, i64 0}
!13 = !{!14, !10, i64 4}
!14 = !{!"mbedtls_cipher_info_t", !10, i64 0, !10, i64 4, !10, i64 8, !7, i64 16, !10, i64 24, !10, i64 28, !10, i64 32, !7, i64 40}
!15 = !{!14, !7, i64 40}
!16 = !{!17, !7, i64 8}
!17 = !{!"mbedtls_cipher_base_t", !10, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88}
!18 = !{!6, !7, i64 80}
!19 = !{!6, !10, i64 12}
!20 = !{!14, !10, i64 0}
!21 = !{!6, !11, i64 48}
!22 = !{!6, !7, i64 16}
!23 = !{!17, !7, i64 16}
!24 = !{!17, !7, i64 24}
!25 = !{!17, !7, i64 32}
!26 = !{!17, !7, i64 40}
!27 = !{!17, !7, i64 48}
!28 = !{!17, !7, i64 56}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass,TailCallElimPass