; LLVM IR from tleonhardt/practical_cryptography_engineering :: mbedtls (rsa)

; 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_asn1_buf = type { i32, i64, ptr }
%struct.mbedtls_rsa_context = type { i32, i64, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, %struct.mbedtls_mpi, i32, i32 }
%struct.mbedtls_mpi = type { i32, i64, 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: nounwind uwtable
declare dso_local i32 @mbedtls_rsa_public(ptr noundef, ptr noundef, ptr noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local i32 @mbedtls_rsa_private(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #1

declare ptr @mbedtls_md_info_from_type(i32 noundef) #2

declare zeroext i8 @mbedtls_md_get_size(ptr noundef) #2

; Function Attrs: nounwind willreturn memory(read)
declare i32 @memcmp(ptr noundef, ptr noundef, i64 noundef) #3

; Function Attrs: nounwind uwtable
define dso_local i32 @mbedtls_rsa_rsassa_pkcs1_v15_verify(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, i32 noundef %4, i32 noundef %5, ptr noundef %6, ptr noundef %7) #1 {
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca i64, align 8
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca i32, align 4
  %26 = alloca ptr, align 8
  %27 = alloca %struct.mbedtls_asn1_buf, align 8
  %28 = alloca [1024 x i8], align 16
  %29 = alloca i32, align 4
  store ptr %0, ptr %10, align 8, !tbaa !5
  store ptr %1, ptr %11, align 8, !tbaa !5
  store ptr %2, ptr %12, align 8, !tbaa !5
  store i32 %3, ptr %13, align 4, !tbaa !9
  store i32 %4, ptr %14, align 4, !tbaa !9
  store i32 %5, ptr %15, align 4, !tbaa !9
  store ptr %6, ptr %16, align 8, !tbaa !5
  store ptr %7, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %27) #4
  call void @llvm.lifetime.start.p0(i64 1024, ptr %28) #4
  %30 = load i32, ptr %13, align 4, !tbaa !9
  %31 = icmp eq i32 %30, 1
  br i1 %31, label %32, label %38

32:                                               ; preds = %8
  %33 = load ptr, ptr %10, align 8, !tbaa !5
  %34 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %33, i32 0, i32 15
  %35 = load i32, ptr %34, align 8, !tbaa !11
  %36 = icmp ne i32 %35, 0
  br i1 %36, label %37, label %38

37:                                               ; preds = %32
  store i32 -16512, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

38:                                               ; preds = %32, %8
  %39 = load ptr, ptr %10, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.mbedtls_rsa_context, ptr %39, i32 0, i32 1
  %41 = load i64, ptr %40, align 8, !tbaa !15
  store i64 %41, ptr %20, align 8, !tbaa !16
  %42 = load i64, ptr %20, align 8, !tbaa !16
  %43 = icmp ult i64 %42, 16
  br i1 %43, label %47, label %44

44:                                               ; preds = %38
  %45 = load i64, ptr %20, align 8, !tbaa !16
  %46 = icmp ugt i64 %45, 1024
  br i1 %46, label %47, label %48

47:                                               ; preds = %44, %38
  store i32 -16512, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

48:                                               ; preds = %44
  %49 = load i32, ptr %13, align 4, !tbaa !9
  %50 = icmp eq i32 %49, 0
  br i1 %50, label %51, label %56

51:                                               ; preds = %48
  %52 = load ptr, ptr %10, align 8, !tbaa !5
  %53 = load ptr, ptr %17, align 8, !tbaa !5
  %54 = getelementptr inbounds [1024 x i8], ptr %28, i64 0, i64 0
  %55 = call i32 @mbedtls_rsa_public(ptr noundef %52, ptr noundef %53, ptr noundef %54)
  br label %63

56:                                               ; preds = %48
  %57 = load ptr, ptr %10, align 8, !tbaa !5
  %58 = load ptr, ptr %11, align 8, !tbaa !5
  %59 = load ptr, ptr %12, align 8, !tbaa !5
  %60 = load ptr, ptr %17, align 8, !tbaa !5
  %61 = getelementptr inbounds [1024 x i8], ptr %28, i64 0, i64 0
  %62 = call i32 @mbedtls_rsa_private(ptr noundef %57, ptr noundef %58, ptr noundef %59, ptr noundef %60, ptr noundef %61)
  br label %63

63:                                               ; preds = %56, %51
  %64 = phi i32 [ %55, %51 ], [ %62, %56 ]
  store i32 %64, ptr %18, align 4, !tbaa !9
  %65 = load i32, ptr %18, align 4, !tbaa !9
  %66 = icmp ne i32 %65, 0
  br i1 %66, label %67, label %69

67:                                               ; preds = %63
  %68 = load i32, ptr %18, align 4, !tbaa !9
  store i32 %68, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

69:                                               ; preds = %63
  %70 = getelementptr inbounds [1024 x i8], ptr %28, i64 0, i64 0
  store ptr %70, ptr %22, align 8, !tbaa !5
  %71 = load ptr, ptr %22, align 8, !tbaa !5
  %72 = getelementptr inbounds i8, ptr %71, i32 1
  store ptr %72, ptr %22, align 8, !tbaa !5
  %73 = load i8, ptr %71, align 1, !tbaa !17
  %74 = zext i8 %73 to i32
  %75 = icmp ne i32 %74, 0
  br i1 %75, label %82, label %76

76:                                               ; preds = %69
  %77 = load ptr, ptr %22, align 8, !tbaa !5
  %78 = getelementptr inbounds i8, ptr %77, i32 1
  store ptr %78, ptr %22, align 8, !tbaa !5
  %79 = load i8, ptr %77, align 1, !tbaa !17
  %80 = zext i8 %79 to i32
  %81 = icmp ne i32 %80, 1
  br i1 %81, label %82, label %83

82:                                               ; preds = %76, %69
  store i32 -16640, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

83:                                               ; preds = %76
  br label %84

84:                                               ; preds = %102, %83
  %85 = load ptr, ptr %22, align 8, !tbaa !5
  %86 = load i8, ptr %85, align 1, !tbaa !17
  %87 = zext i8 %86 to i32
  %88 = icmp ne i32 %87, 0
  br i1 %88, label %89, label %105

89:                                               ; preds = %84
  %90 = load ptr, ptr %22, align 8, !tbaa !5
  %91 = getelementptr inbounds [1024 x i8], ptr %28, i64 0, i64 0
  %92 = load i64, ptr %20, align 8, !tbaa !16
  %93 = getelementptr inbounds i8, ptr %91, i64 %92
  %94 = getelementptr inbounds i8, ptr %93, i64 -1
  %95 = icmp uge ptr %90, %94
  br i1 %95, label %101, label %96

96:                                               ; preds = %89
  %97 = load ptr, ptr %22, align 8, !tbaa !5
  %98 = load i8, ptr %97, align 1, !tbaa !17
  %99 = zext i8 %98 to i32
  %100 = icmp ne i32 %99, 255
  br i1 %100, label %101, label %102

101:                                              ; preds = %96, %89
  store i32 -16640, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

102:                                              ; preds = %96
  %103 = load ptr, ptr %22, align 8, !tbaa !5
  %104 = getelementptr inbounds i8, ptr %103, i32 1
  store ptr %104, ptr %22, align 8, !tbaa !5
  br label %84, !llvm.loop !18

105:                                              ; preds = %84
  %106 = load ptr, ptr %22, align 8, !tbaa !5
  %107 = getelementptr inbounds i8, ptr %106, i32 1
  store ptr %107, ptr %22, align 8, !tbaa !5
  %108 = load ptr, ptr %22, align 8, !tbaa !5
  %109 = getelementptr inbounds [1024 x i8], ptr %28, i64 0, i64 0
  %110 = ptrtoint ptr %108 to i64
  %111 = ptrtoint ptr %109 to i64
  %112 = sub i64 %110, %111
  %113 = icmp slt i64 %112, 11
  br i1 %113, label %114, label %115

114:                                              ; preds = %105
  store i32 -16640, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

115:                                              ; preds = %105
  %116 = load i64, ptr %20, align 8, !tbaa !16
  %117 = load ptr, ptr %22, align 8, !tbaa !5
  %118 = getelementptr inbounds [1024 x i8], ptr %28, i64 0, i64 0
  %119 = ptrtoint ptr %117 to i64
  %120 = ptrtoint ptr %118 to i64
  %121 = sub i64 %119, %120
  %122 = sub i64 %116, %121
  store i64 %122, ptr %19, align 8, !tbaa !16
  %123 = load i64, ptr %19, align 8, !tbaa !16
  %124 = load i32, ptr %15, align 4, !tbaa !9
  %125 = zext i32 %124 to i64
  %126 = icmp eq i64 %123, %125
  br i1 %126, label %127, label %139

127:                                              ; preds = %115
  %128 = load i32, ptr %14, align 4, !tbaa !9
  %129 = icmp eq i32 %128, 0
  br i1 %129, label %130, label %139

130:                                              ; preds = %127
  %131 = load ptr, ptr %22, align 8, !tbaa !5
  %132 = load ptr, ptr %16, align 8, !tbaa !5
  %133 = load i32, ptr %15, align 4, !tbaa !9
  %134 = zext i32 %133 to i64
  %135 = call i32 @memcmp(ptr noundef %131, ptr noundef %132, i64 noundef %134) #5
  %136 = icmp eq i32 %135, 0
  br i1 %136, label %137, label %138

137:                                              ; preds = %130
  store i32 0, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

138:                                              ; preds = %130
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

139:                                              ; preds = %127, %115
  %140 = load i32, ptr %14, align 4, !tbaa !9
  %141 = call ptr @mbedtls_md_info_from_type(i32 noundef %140)
  store ptr %141, ptr %26, align 8, !tbaa !5
  %142 = load ptr, ptr %26, align 8, !tbaa !5
  %143 = icmp eq ptr %142, null
  br i1 %143, label %144, label %145

144:                                              ; preds = %139
  store i32 -16512, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

145:                                              ; preds = %139
  %146 = load ptr, ptr %26, align 8, !tbaa !5
  %147 = call zeroext i8 @mbedtls_md_get_size(ptr noundef %146)
  %148 = zext i8 %147 to i32
  store i32 %148, ptr %15, align 4, !tbaa !9
  %149 = load ptr, ptr %22, align 8, !tbaa !5
  %150 = load i64, ptr %19, align 8, !tbaa !16
  %151 = getelementptr inbounds i8, ptr %149, i64 %150
  store ptr %151, ptr %24, align 8, !tbaa !5
  %152 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %152, ptr %23, align 8, !tbaa !5
  %153 = load ptr, ptr %24, align 8, !tbaa !5
  %154 = call i32 @mbedtls_asn1_get_tag(ptr noundef %22, ptr noundef %153, ptr noundef %21, i32 noundef 48)
  store i32 %154, ptr %18, align 4, !tbaa !9
  %155 = icmp ne i32 %154, 0
  br i1 %155, label %156, label %157

156:                                              ; preds = %145
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

157:                                              ; preds = %145
  %158 = load ptr, ptr %22, align 8, !tbaa !5
  %159 = load ptr, ptr %23, align 8, !tbaa !5
  %160 = getelementptr inbounds i8, ptr %159, i64 2
  %161 = icmp ne ptr %158, %160
  br i1 %161, label %167, label %162

162:                                              ; preds = %157
  %163 = load i64, ptr %21, align 8, !tbaa !16
  %164 = add i64 %163, 2
  %165 = load i64, ptr %19, align 8, !tbaa !16
  %166 = icmp ne i64 %164, %165
  br i1 %166, label %167, label %168

167:                                              ; preds = %162, %157
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

168:                                              ; preds = %162
  %169 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %169, ptr %23, align 8, !tbaa !5
  %170 = load ptr, ptr %24, align 8, !tbaa !5
  %171 = call i32 @mbedtls_asn1_get_tag(ptr noundef %22, ptr noundef %170, ptr noundef %21, i32 noundef 48)
  store i32 %171, ptr %18, align 4, !tbaa !9
  %172 = icmp ne i32 %171, 0
  br i1 %172, label %173, label %174

173:                                              ; preds = %168
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

174:                                              ; preds = %168
  %175 = load ptr, ptr %22, align 8, !tbaa !5
  %176 = load ptr, ptr %23, align 8, !tbaa !5
  %177 = getelementptr inbounds i8, ptr %176, i64 2
  %178 = icmp ne ptr %175, %177
  br i1 %178, label %187, label %179

179:                                              ; preds = %174
  %180 = load i64, ptr %21, align 8, !tbaa !16
  %181 = add i64 %180, 6
  %182 = load i32, ptr %15, align 4, !tbaa !9
  %183 = zext i32 %182 to i64
  %184 = add i64 %181, %183
  %185 = load i64, ptr %19, align 8, !tbaa !16
  %186 = icmp ne i64 %184, %185
  br i1 %186, label %187, label %188

187:                                              ; preds = %179, %174
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

188:                                              ; preds = %179
  %189 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %189, ptr %23, align 8, !tbaa !5
  %190 = load ptr, ptr %24, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.mbedtls_asn1_buf, ptr %27, i32 0, i32 1
  %192 = call i32 @mbedtls_asn1_get_tag(ptr noundef %22, ptr noundef %190, ptr noundef %191, i32 noundef 6)
  store i32 %192, ptr %18, align 4, !tbaa !9
  %193 = icmp ne i32 %192, 0
  br i1 %193, label %194, label %195

194:                                              ; preds = %188
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

195:                                              ; preds = %188
  %196 = load ptr, ptr %22, align 8, !tbaa !5
  %197 = load ptr, ptr %23, align 8, !tbaa !5
  %198 = getelementptr inbounds i8, ptr %197, i64 2
  %199 = icmp ne ptr %196, %198
  br i1 %199, label %200, label %201

200:                                              ; preds = %195
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

201:                                              ; preds = %195
  %202 = load ptr, ptr %22, align 8, !tbaa !5
  %203 = getelementptr inbounds %struct.mbedtls_asn1_buf, ptr %27, i32 0, i32 2
  store ptr %202, ptr %203, align 8, !tbaa !20
  %204 = getelementptr inbounds %struct.mbedtls_asn1_buf, ptr %27, i32 0, i32 1
  %205 = load i64, ptr %204, align 8, !tbaa !22
  %206 = load ptr, ptr %22, align 8, !tbaa !5
  %207 = getelementptr inbounds i8, ptr %206, i64 %205
  store ptr %207, ptr %22, align 8, !tbaa !5
  %208 = call i32 @mbedtls_oid_get_md_alg(ptr noundef %27, ptr noundef %25)
  %209 = icmp ne i32 %208, 0
  br i1 %209, label %210, label %211

210:                                              ; preds = %201
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

211:                                              ; preds = %201
  %212 = load i32, ptr %14, align 4, !tbaa !9
  %213 = load i32, ptr %25, align 4, !tbaa !9
  %214 = icmp ne i32 %212, %213
  br i1 %214, label %215, label %216

215:                                              ; preds = %211
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

216:                                              ; preds = %211
  %217 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %217, ptr %23, align 8, !tbaa !5
  %218 = load ptr, ptr %24, align 8, !tbaa !5
  %219 = call i32 @mbedtls_asn1_get_tag(ptr noundef %22, ptr noundef %218, ptr noundef %21, i32 noundef 5)
  store i32 %219, ptr %18, align 4, !tbaa !9
  %220 = icmp ne i32 %219, 0
  br i1 %220, label %221, label %222

221:                                              ; preds = %216
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

222:                                              ; preds = %216
  %223 = load ptr, ptr %22, align 8, !tbaa !5
  %224 = load ptr, ptr %23, align 8, !tbaa !5
  %225 = getelementptr inbounds i8, ptr %224, i64 2
  %226 = icmp ne ptr %223, %225
  br i1 %226, label %227, label %228

227:                                              ; preds = %222
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

228:                                              ; preds = %222
  %229 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %229, ptr %23, align 8, !tbaa !5
  %230 = load ptr, ptr %24, align 8, !tbaa !5
  %231 = call i32 @mbedtls_asn1_get_tag(ptr noundef %22, ptr noundef %230, ptr noundef %21, i32 noundef 4)
  store i32 %231, ptr %18, align 4, !tbaa !9
  %232 = icmp ne i32 %231, 0
  br i1 %232, label %233, label %234

233:                                              ; preds = %228
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

234:                                              ; preds = %228
  %235 = load ptr, ptr %22, align 8, !tbaa !5
  %236 = load ptr, ptr %23, align 8, !tbaa !5
  %237 = getelementptr inbounds i8, ptr %236, i64 2
  %238 = icmp ne ptr %235, %237
  br i1 %238, label %244, label %239

239:                                              ; preds = %234
  %240 = load i64, ptr %21, align 8, !tbaa !16
  %241 = load i32, ptr %15, align 4, !tbaa !9
  %242 = zext i32 %241 to i64
  %243 = icmp ne i64 %240, %242
  br i1 %243, label %244, label %245

244:                                              ; preds = %239, %234
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

245:                                              ; preds = %239
  %246 = load ptr, ptr %22, align 8, !tbaa !5
  %247 = load ptr, ptr %16, align 8, !tbaa !5
  %248 = load i32, ptr %15, align 4, !tbaa !9
  %249 = zext i32 %248 to i64
  %250 = call i32 @memcmp(ptr noundef %246, ptr noundef %247, i64 noundef %249) #5
  %251 = icmp ne i32 %250, 0
  br i1 %251, label %252, label %253

252:                                              ; preds = %245
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

253:                                              ; preds = %245
  %254 = load i32, ptr %15, align 4, !tbaa !9
  %255 = load ptr, ptr %22, align 8, !tbaa !5
  %256 = zext i32 %254 to i64
  %257 = getelementptr inbounds i8, ptr %255, i64 %256
  store ptr %257, ptr %22, align 8, !tbaa !5
  %258 = load ptr, ptr %22, align 8, !tbaa !5
  %259 = load ptr, ptr %24, align 8, !tbaa !5
  %260 = icmp ne ptr %258, %259
  br i1 %260, label %261, label %262

261:                                              ; preds = %253
  store i32 -17280, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

262:                                              ; preds = %253
  store i32 0, ptr %9, align 4
  store i32 1, ptr %29, align 4
  br label %263

263:                                              ; preds = %262, %261, %252, %244, %233, %227, %221, %215, %210, %200, %194, %187, %173, %167, %156, %144, %138, %137, %114, %101, %82, %67, %47, %37
  call void @llvm.lifetime.end.p0(i64 1024, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #4
  %264 = load i32, ptr %9, align 4
  ret i32 %264
}

declare i32 @mbedtls_asn1_get_tag(ptr noundef, ptr noundef, ptr noundef, i32 noundef) #2

declare i32 @mbedtls_oid_get_md_alg(ptr noundef, ptr noundef) #2

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 = { "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 willreturn memory(read) "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 }
attributes #5 = { nounwind willreturn memory(read) }

!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, !10, i64 328}
!12 = !{!"", !10, i64 0, !13, i64 8, !14, i64 16, !14, i64 40, !14, i64 64, !14, i64 88, !14, i64 112, !14, i64 136, !14, i64 160, !14, i64 184, !14, i64 208, !14, i64 232, !14, i64 256, !14, i64 280, !14, i64 304, !10, i64 328, !10, i64 332}
!13 = !{!"long", !7, i64 0}
!14 = !{!"", !10, i64 0, !13, i64 8, !6, i64 16}
!15 = !{!12, !13, i64 8}
!16 = !{!13, !13, i64 0}
!17 = !{!7, !7, i64 0}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!21, !6, i64 16}
!21 = !{!"mbedtls_asn1_buf", !10, i64 0, !13, i64 8, !6, i64 16}
!22 = !{!21, !13, i64 8}


; 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.mbedtls_asn1_buf = type { i32, i64, ptr }

; 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: nounwind uwtable
declare dso_local i32 @mbedtls_rsa_public(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local i32 @mbedtls_rsa_private(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

declare ptr @mbedtls_md_info_from_type(i32 noundef) local_unnamed_addr #2

declare zeroext i8 @mbedtls_md_get_size(ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local i32 @mbedtls_rsa_rsassa_pkcs1_v15_verify(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, i32 noundef %4, i32 noundef %5, ptr nocapture noundef readonly %6, ptr noundef %7) local_unnamed_addr #1 {
  %9 = alloca i64, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca %struct.mbedtls_asn1_buf, align 8
  %13 = alloca [1024 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %12) #4
  call void @llvm.lifetime.start.p0(i64 1024, ptr nonnull %13) #4
  %14 = icmp eq i32 %3, 1
  br i1 %14, label %15, label %18

15:                                               ; preds = %8
  %16 = getelementptr inbounds i8, ptr %0, i64 328
  %17 = load i32, ptr %16, align 8, !tbaa !5
  %.not = icmp eq i32 %17, 0
  br i1 %.not, label %.thread, label %.loopexit

18:                                               ; preds = %8
  %19 = getelementptr inbounds i8, ptr %0, i64 8
  %20 = load i64, ptr %19, align 8, !tbaa !13
  %21 = add i64 %20, -1025
  %or.cond = icmp ult i64 %21, -1009
  br i1 %or.cond, label %.loopexit, label %25

.thread:                                          ; preds = %15
  %22 = getelementptr inbounds i8, ptr %0, i64 8
  %23 = load i64, ptr %22, align 8, !tbaa !13
  %24 = add i64 %23, -1025
  %or.cond89 = icmp ult i64 %24, -1009
  br i1 %or.cond89, label %.loopexit, label %.thread90

25:                                               ; preds = %18
  %26 = icmp eq i32 %3, 0
  br i1 %26, label %27, label %.thread90

27:                                               ; preds = %25
  %28 = call i32 @mbedtls_rsa_public(ptr noundef nonnull %0, ptr noundef %7, ptr noundef nonnull %13)
  br label %31

.thread90:                                        ; preds = %.thread, %25
  %29 = phi i64 [ %20, %25 ], [ %23, %.thread ]
  %30 = call i32 @mbedtls_rsa_private(ptr noundef nonnull %0, ptr noundef %1, ptr noundef %2, ptr noundef %7, ptr noundef nonnull %13)
  br label %31

31:                                               ; preds = %.thread90, %27
  %32 = phi i64 [ %20, %27 ], [ %29, %.thread90 ]
  %33 = phi i32 [ %28, %27 ], [ %30, %.thread90 ]
  %.not61 = icmp eq i32 %33, 0
  br i1 %.not61, label %34, label %.loopexit

34:                                               ; preds = %31
  %35 = load i8, ptr %13, align 16, !tbaa !14
  %.not62 = icmp eq i8 %35, 0
  br i1 %.not62, label %36, label %.loopexit

36:                                               ; preds = %34
  %37 = getelementptr inbounds i8, ptr %13, i64 1
  %38 = getelementptr inbounds i8, ptr %13, i64 2
  %39 = load i8, ptr %37, align 1, !tbaa !14
  %.not63 = icmp eq i8 %39, 1
  br i1 %.not63, label %.preheader, label %.loopexit

.preheader:                                       ; preds = %36
  %40 = load i8, ptr %38, align 2, !tbaa !14
  %.not6492 = icmp eq i8 %40, 0
  br i1 %.not6492, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader
  %41 = getelementptr inbounds i8, ptr %13, i64 %32
  %42 = getelementptr inbounds i8, ptr %41, i64 -1
  br label %43

43:                                               ; preds = %.lr.ph, %46
  %44 = phi i8 [ %40, %.lr.ph ], [ %48, %46 ]
  %45 = phi ptr [ %38, %.lr.ph ], [ %47, %46 ]
  %.not83 = icmp ult ptr %45, %42
  %.not84 = icmp eq i8 %44, -1
  %or.cond85 = and i1 %.not83, %.not84
  br i1 %or.cond85, label %46, label %.loopexit

46:                                               ; preds = %43
  %47 = getelementptr inbounds i8, ptr %45, i64 1
  %48 = load i8, ptr %47, align 1, !tbaa !14
  %.not64 = icmp eq i8 %48, 0
  br i1 %.not64, label %._crit_edge, label %43, !llvm.loop !15

._crit_edge:                                      ; preds = %46, %.preheader
  %.lcssa = phi ptr [ %38, %.preheader ], [ %47, %46 ]
  %49 = getelementptr inbounds i8, ptr %.lcssa, i64 1
  store ptr %49, ptr %10, align 8, !tbaa !17
  %50 = ptrtoint ptr %49 to i64
  %51 = ptrtoint ptr %13 to i64
  %52 = sub i64 %50, %51
  %53 = icmp slt i64 %52, 11
  br i1 %53, label %.loopexit, label %54

54:                                               ; preds = %._crit_edge
  %55 = sub nsw i64 %32, %52
  %56 = zext i32 %5 to i64
  %57 = icmp eq i64 %55, %56
  %58 = icmp eq i32 %4, 0
  %or.cond3 = and i1 %58, %57
  br i1 %or.cond3, label %59, label %61

59:                                               ; preds = %54
  %bcmp82 = call i32 @bcmp(ptr nonnull %49, ptr %6, i64 %55)
  %60 = icmp eq i32 %bcmp82, 0
  %. = select i1 %60, i32 0, i32 -17280
  br label %.loopexit

61:                                               ; preds = %54
  %62 = call ptr @mbedtls_md_info_from_type(i32 noundef %4) #4
  %63 = icmp eq ptr %62, null
  br i1 %63, label %.loopexit, label %64

64:                                               ; preds = %61
  %65 = call zeroext i8 @mbedtls_md_get_size(ptr noundef nonnull %62) #4
  %66 = getelementptr inbounds i8, ptr %49, i64 %55
  %67 = call i32 @mbedtls_asn1_get_tag(ptr noundef nonnull %10, ptr noundef nonnull %66, ptr noundef nonnull %9, i32 noundef 48) #4
  %.not65 = icmp eq i32 %67, 0
  br i1 %.not65, label %68, label %.loopexit

68:                                               ; preds = %64
  %69 = load ptr, ptr %10, align 8, !tbaa !17
  %70 = getelementptr inbounds i8, ptr %.lcssa, i64 3
  %.not66 = icmp eq ptr %69, %70
  br i1 %.not66, label %71, label %.loopexit

71:                                               ; preds = %68
  %72 = load i64, ptr %9, align 8, !tbaa !18
  %73 = add i64 %72, 2
  %.not67 = icmp eq i64 %73, %55
  br i1 %.not67, label %74, label %.loopexit

74:                                               ; preds = %71
  %75 = call i32 @mbedtls_asn1_get_tag(ptr noundef nonnull %10, ptr noundef nonnull %66, ptr noundef nonnull %9, i32 noundef 48) #4
  %.not68 = icmp eq i32 %75, 0
  br i1 %.not68, label %76, label %.loopexit

76:                                               ; preds = %74
  %77 = load ptr, ptr %10, align 8, !tbaa !17
  %78 = getelementptr inbounds i8, ptr %69, i64 2
  %.not69 = icmp eq ptr %77, %78
  br i1 %.not69, label %79, label %.loopexit

79:                                               ; preds = %76
  %80 = load i64, ptr %9, align 8, !tbaa !18
  %81 = zext i8 %65 to i64
  %82 = add nuw nsw i64 %81, 6
  %83 = add i64 %82, %80
  %.not70 = icmp eq i64 %83, %55
  br i1 %.not70, label %84, label %.loopexit

84:                                               ; preds = %79
  %85 = getelementptr inbounds i8, ptr %12, i64 8
  %86 = call i32 @mbedtls_asn1_get_tag(ptr noundef nonnull %10, ptr noundef nonnull %66, ptr noundef nonnull %85, i32 noundef 6) #4
  %.not71 = icmp eq i32 %86, 0
  br i1 %.not71, label %87, label %.loopexit

87:                                               ; preds = %84
  %88 = load ptr, ptr %10, align 8, !tbaa !17
  %89 = getelementptr inbounds i8, ptr %77, i64 2
  %.not72 = icmp eq ptr %88, %89
  br i1 %.not72, label %90, label %.loopexit

90:                                               ; preds = %87
  %91 = getelementptr inbounds i8, ptr %12, i64 16
  store ptr %88, ptr %91, align 8, !tbaa !19
  %92 = load i64, ptr %85, align 8, !tbaa !21
  %93 = getelementptr inbounds i8, ptr %88, i64 %92
  store ptr %93, ptr %10, align 8, !tbaa !17
  %94 = call i32 @mbedtls_oid_get_md_alg(ptr noundef nonnull %12, ptr noundef nonnull %11) #4
  %.not73 = icmp eq i32 %94, 0
  %95 = load i32, ptr %11, align 4
  %.not74 = icmp eq i32 %95, %4
  %or.cond88 = select i1 %.not73, i1 %.not74, i1 false
  br i1 %or.cond88, label %96, label %.loopexit

96:                                               ; preds = %90
  %97 = load ptr, ptr %10, align 8, !tbaa !17
  %98 = call i32 @mbedtls_asn1_get_tag(ptr noundef nonnull %10, ptr noundef nonnull %66, ptr noundef nonnull %9, i32 noundef 5) #4
  %.not75 = icmp eq i32 %98, 0
  br i1 %.not75, label %99, label %.loopexit

99:                                               ; preds = %96
  %100 = load ptr, ptr %10, align 8, !tbaa !17
  %101 = getelementptr inbounds i8, ptr %97, i64 2
  %.not76 = icmp eq ptr %100, %101
  br i1 %.not76, label %102, label %.loopexit

102:                                              ; preds = %99
  %103 = call i32 @mbedtls_asn1_get_tag(ptr noundef nonnull %10, ptr noundef nonnull %66, ptr noundef nonnull %9, i32 noundef 4) #4
  %.not77 = icmp eq i32 %103, 0
  br i1 %.not77, label %104, label %.loopexit

104:                                              ; preds = %102
  %105 = load ptr, ptr %10, align 8, !tbaa !17
  %106 = getelementptr inbounds i8, ptr %100, i64 2
  %.not78 = icmp eq ptr %105, %106
  %107 = load i64, ptr %9, align 8
  %.not79 = icmp eq i64 %107, %81
  %or.cond86 = select i1 %.not78, i1 %.not79, i1 false
  br i1 %or.cond86, label %108, label %.loopexit

108:                                              ; preds = %104
  %bcmp = call i32 @bcmp(ptr %105, ptr %6, i64 %81)
  %.not80 = icmp eq i32 %bcmp, 0
  br i1 %.not80, label %109, label %.loopexit

109:                                              ; preds = %108
  %110 = getelementptr inbounds i8, ptr %105, i64 %81
  %.not81 = icmp eq ptr %110, %66
  %.87 = select i1 %.not81, i32 0, i32 -17280
  br label %.loopexit

.loopexit:                                        ; preds = %43, %.thread, %109, %108, %104, %102, %99, %96, %90, %87, %84, %76, %79, %74, %68, %71, %64, %61, %59, %._crit_edge, %34, %36, %31, %18, %15
  %.0 = phi i32 [ -16512, %15 ], [ -16512, %18 ], [ %33, %31 ], [ -16640, %36 ], [ -16640, %34 ], [ -16640, %._crit_edge ], [ %., %59 ], [ -16512, %61 ], [ -17280, %64 ], [ -17280, %71 ], [ -17280, %68 ], [ -17280, %74 ], [ -17280, %79 ], [ -17280, %76 ], [ -17280, %84 ], [ -17280, %87 ], [ -17280, %90 ], [ -17280, %96 ], [ -17280, %99 ], [ -17280, %102 ], [ -17280, %104 ], [ -17280, %108 ], [ %.87, %109 ], [ -16512, %.thread ], [ -16640, %43 ]
  call void @llvm.lifetime.end.p0(i64 1024, ptr nonnull %13) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %12) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #4
  ret i32 %.0
}

declare i32 @mbedtls_asn1_get_tag(ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

declare i32 @mbedtls_oid_get_md_alg(ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: nofree nounwind willreturn memory(argmem: read)
declare i32 @bcmp(ptr nocapture, ptr nocapture, i64) local_unnamed_addr #3

attributes #0 = { mustprogress 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 = { "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 = { nofree nounwind willreturn memory(argmem: read) }
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 328}
!6 = !{!"", !7, i64 0, !10, i64 8, !11, i64 16, !11, i64 40, !11, i64 64, !11, i64 88, !11, i64 112, !11, i64 136, !11, i64 160, !11, i64 184, !11, i64 208, !11, i64 232, !11, i64 256, !11, i64 280, !11, i64 304, !7, i64 328, !7, i64 332}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"long", !8, i64 0}
!11 = !{!"", !7, i64 0, !10, i64 8, !12, i64 16}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!6, !10, i64 8}
!14 = !{!8, !8, i64 0}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}
!17 = !{!12, !12, i64 0}
!18 = !{!10, !10, i64 0}
!19 = !{!20, !12, i64 16}
!20 = !{!"mbedtls_asn1_buf", !7, i64 0, !10, i64 8, !12, i64 16}
!21 = !{!20, !10, i64 8}


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