; LLVM IR from devicehive/esp8266-firmware :: firmware-src/sources (snprintf)

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

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

29:                                               ; preds = %368, %4
  %30 = load ptr, ptr %8, align 8, !tbaa !5
  %31 = call signext i8 @irom_char(ptr noundef %30)
  store i8 %31, ptr %12, align 1, !tbaa !11
  %32 = sext i8 %31 to i32
  %33 = icmp ne i32 %32, 0
  br i1 %33, label %34, label %43

34:                                               ; preds = %29
  %35 = load ptr, ptr %6, align 8, !tbaa !5
  %36 = load ptr, ptr %11, align 8, !tbaa !5
  %37 = ptrtoint ptr %35 to i64
  %38 = ptrtoint ptr %36 to i64
  %39 = sub i64 %37, %38
  %40 = load i32, ptr %7, align 4, !tbaa !9
  %41 = zext i32 %40 to i64
  %42 = icmp slt i64 %39, %41
  br label %43

43:                                               ; preds = %34, %29
  %44 = phi i1 [ false, %29 ], [ %42, %34 ]
  br i1 %44, label %45, label %369

45:                                               ; preds = %43
  %46 = load i8, ptr %12, align 1, !tbaa !11
  %47 = sext i8 %46 to i32
  %48 = icmp ne i32 %47, 37
  br i1 %48, label %49, label %55

49:                                               ; preds = %45
  %50 = load i8, ptr %12, align 1, !tbaa !11
  %51 = load ptr, ptr %6, align 8, !tbaa !5
  %52 = getelementptr inbounds i8, ptr %51, i32 1
  store ptr %52, ptr %6, align 8, !tbaa !5
  store i8 %50, ptr %51, align 1, !tbaa !11
  %53 = load ptr, ptr %8, align 8, !tbaa !5
  %54 = getelementptr inbounds i8, ptr %53, i32 1
  store ptr %54, ptr %8, align 8, !tbaa !5
  br label %368

55:                                               ; preds = %45
  %56 = load ptr, ptr %8, align 8, !tbaa !5
  %57 = getelementptr inbounds i8, ptr %56, i64 1
  %58 = call signext i8 @irom_char(ptr noundef %57)
  %59 = sext i8 %58 to i32
  %60 = icmp eq i32 %59, 37
  br i1 %60, label %61, label %66

61:                                               ; preds = %55
  %62 = load ptr, ptr %6, align 8, !tbaa !5
  %63 = getelementptr inbounds i8, ptr %62, i32 1
  store ptr %63, ptr %6, align 8, !tbaa !5
  store i8 37, ptr %62, align 1, !tbaa !11
  %64 = load ptr, ptr %8, align 8, !tbaa !5
  %65 = getelementptr inbounds i8, ptr %64, i64 2
  store ptr %65, ptr %8, align 8, !tbaa !5
  br label %367

66:                                               ; preds = %55
  %67 = load ptr, ptr %8, align 8, !tbaa !5
  %68 = getelementptr inbounds i8, ptr %67, i32 1
  store ptr %68, ptr %8, align 8, !tbaa !5
  %69 = load ptr, ptr %8, align 8, !tbaa !5
  %70 = call signext i8 @irom_char(ptr noundef %69)
  store i8 %70, ptr %12, align 1, !tbaa !11
  %71 = load i8, ptr %12, align 1, !tbaa !11
  %72 = sext i8 %71 to i32
  switch i32 %72, label %363 [
    i32 100, label %73
    i32 105, label %73
    i32 117, label %135
    i32 120, label %135
    i32 88, label %135
    i32 115, label %223
    i32 99, label %262
    i32 102, label %282
  ]

73:                                               ; preds = %66, %66
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #4
  %74 = getelementptr inbounds [32 x i8], ptr %10, i64 0, i64 0
  store ptr %74, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #4
  %75 = load ptr, ptr %9, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.__va_list_tag, ptr %75, i32 0, i32 0
  %77 = load i32, ptr %76, align 8
  %78 = icmp ule i32 %77, 40
  br i1 %78, label %79, label %84

79:                                               ; preds = %73
  %80 = getelementptr inbounds %struct.__va_list_tag, ptr %75, i32 0, i32 3
  %81 = load ptr, ptr %80, align 8
  %82 = getelementptr i8, ptr %81, i32 %77
  %83 = add i32 %77, 8
  store i32 %83, ptr %76, align 8
  br label %88

84:                                               ; preds = %73
  %85 = getelementptr inbounds %struct.__va_list_tag, ptr %75, i32 0, i32 2
  %86 = load ptr, ptr %85, align 8
  %87 = getelementptr i8, ptr %86, i32 8
  store ptr %87, ptr %85, align 8
  br label %88

88:                                               ; preds = %84, %79
  %89 = phi ptr [ %82, %79 ], [ %86, %84 ]
  %90 = load i64, ptr %89, align 8, !tbaa !12
  store i64 %90, ptr %14, align 8, !tbaa !12
  %91 = load i64, ptr %14, align 8, !tbaa !12
  %92 = icmp slt i64 %91, 0
  br i1 %92, label %93, label %98

93:                                               ; preds = %88
  %94 = load i64, ptr %14, align 8, !tbaa !12
  %95 = sub nsw i64 0, %94
  store i64 %95, ptr %14, align 8, !tbaa !12
  %96 = load ptr, ptr %6, align 8, !tbaa !5
  %97 = getelementptr inbounds i8, ptr %96, i32 1
  store ptr %97, ptr %6, align 8, !tbaa !5
  store i8 45, ptr %96, align 1, !tbaa !11
  br label %98

98:                                               ; preds = %93, %88
  br label %99

99:                                               ; preds = %106, %98
  %100 = load i64, ptr %14, align 8, !tbaa !12
  %101 = srem i64 %100, 10
  %102 = add nsw i64 %101, 48
  %103 = trunc i64 %102 to i8
  %104 = load ptr, ptr %13, align 8, !tbaa !5
  %105 = getelementptr inbounds i8, ptr %104, i32 1
  store ptr %105, ptr %13, align 8, !tbaa !5
  store i8 %103, ptr %104, align 1, !tbaa !11
  br label %106

106:                                              ; preds = %99
  %107 = load i64, ptr %14, align 8, !tbaa !12
  %108 = sdiv i64 %107, 10
  store i64 %108, ptr %14, align 8, !tbaa !12
  %109 = icmp sgt i64 %108, 0
  br i1 %109, label %99, label %110, !llvm.loop !14

110:                                              ; preds = %106
  %111 = load ptr, ptr %13, align 8, !tbaa !5
  %112 = getelementptr inbounds i8, ptr %111, i32 -1
  store ptr %112, ptr %13, align 8, !tbaa !5
  br label %113

113:                                              ; preds = %128, %110
  %114 = load ptr, ptr %6, align 8, !tbaa !5
  %115 = load ptr, ptr %11, align 8, !tbaa !5
  %116 = ptrtoint ptr %114 to i64
  %117 = ptrtoint ptr %115 to i64
  %118 = sub i64 %116, %117
  %119 = load i32, ptr %7, align 4, !tbaa !9
  %120 = zext i32 %119 to i64
  %121 = icmp slt i64 %118, %120
  br i1 %121, label %122, label %126

122:                                              ; preds = %113
  %123 = load ptr, ptr %13, align 8, !tbaa !5
  %124 = getelementptr inbounds [32 x i8], ptr %10, i64 0, i64 0
  %125 = icmp uge ptr %123, %124
  br label %126

126:                                              ; preds = %122, %113
  %127 = phi i1 [ false, %113 ], [ %125, %122 ]
  br i1 %127, label %128, label %134

128:                                              ; preds = %126
  %129 = load ptr, ptr %13, align 8, !tbaa !5
  %130 = getelementptr inbounds i8, ptr %129, i32 -1
  store ptr %130, ptr %13, align 8, !tbaa !5
  %131 = load i8, ptr %129, align 1, !tbaa !11
  %132 = load ptr, ptr %6, align 8, !tbaa !5
  %133 = getelementptr inbounds i8, ptr %132, i32 1
  store ptr %133, ptr %6, align 8, !tbaa !5
  store i8 %131, ptr %132, align 1, !tbaa !11
  br label %113, !llvm.loop !16

134:                                              ; preds = %126
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #4
  br label %364

135:                                              ; preds = %66, %66, %66
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #4
  %136 = load i8, ptr %12, align 1, !tbaa !11
  %137 = sext i8 %136 to i32
  %138 = icmp eq i32 %137, 117
  %139 = zext i1 %138 to i64
  %140 = select i1 %138, i32 10, i32 16
  store i32 %140, ptr %15, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  %141 = getelementptr inbounds [32 x i8], ptr %10, i64 0, i64 0
  store ptr %141, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %142 = load ptr, ptr %9, align 8, !tbaa !5
  %143 = getelementptr inbounds %struct.__va_list_tag, ptr %142, i32 0, i32 0
  %144 = load i32, ptr %143, align 8
  %145 = icmp ule i32 %144, 40
  br i1 %145, label %146, label %151

146:                                              ; preds = %135
  %147 = getelementptr inbounds %struct.__va_list_tag, ptr %142, i32 0, i32 3
  %148 = load ptr, ptr %147, align 8
  %149 = getelementptr i8, ptr %148, i32 %144
  %150 = add i32 %144, 8
  store i32 %150, ptr %143, align 8
  br label %155

151:                                              ; preds = %135
  %152 = getelementptr inbounds %struct.__va_list_tag, ptr %142, i32 0, i32 2
  %153 = load ptr, ptr %152, align 8
  %154 = getelementptr i8, ptr %153, i32 8
  store ptr %154, ptr %152, align 8
  br label %155

155:                                              ; preds = %151, %146
  %156 = phi ptr [ %149, %146 ], [ %153, %151 ]
  %157 = load i64, ptr %156, align 8, !tbaa !12
  store i64 %157, ptr %17, align 8, !tbaa !12
  br label %158

158:                                              ; preds = %192, %155
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #4
  %159 = load i64, ptr %17, align 8, !tbaa !12
  %160 = load i32, ptr %15, align 4, !tbaa !9
  %161 = zext i32 %160 to i64
  %162 = urem i64 %159, %161
  %163 = trunc i64 %162 to i32
  store i32 %163, ptr %18, align 4, !tbaa !9
  %164 = load i32, ptr %18, align 4, !tbaa !9
  %165 = icmp ult i32 %164, 10
  br i1 %165, label %166, label %172

166:                                              ; preds = %158
  %167 = load i32, ptr %18, align 4, !tbaa !9
  %168 = add i32 %167, 48
  %169 = trunc i32 %168 to i8
  %170 = load ptr, ptr %16, align 8, !tbaa !5
  %171 = getelementptr inbounds i8, ptr %170, i32 1
  store ptr %171, ptr %16, align 8, !tbaa !5
  store i8 %169, ptr %170, align 1, !tbaa !11
  br label %191

172:                                              ; preds = %158
  %173 = load i8, ptr %12, align 1, !tbaa !11
  %174 = sext i8 %173 to i32
  %175 = icmp eq i32 %174, 120
  br i1 %175, label %176, label %183

176:                                              ; preds = %172
  %177 = load i32, ptr %18, align 4, !tbaa !9
  %178 = sub i32 %177, 10
  %179 = add i32 %178, 97
  %180 = trunc i32 %179 to i8
  %181 = load ptr, ptr %16, align 8, !tbaa !5
  %182 = getelementptr inbounds i8, ptr %181, i32 1
  store ptr %182, ptr %16, align 8, !tbaa !5
  store i8 %180, ptr %181, align 1, !tbaa !11
  br label %190

183:                                              ; preds = %172
  %184 = load i32, ptr %18, align 4, !tbaa !9
  %185 = sub i32 %184, 10
  %186 = add i32 %185, 65
  %187 = trunc i32 %186 to i8
  %188 = load ptr, ptr %16, align 8, !tbaa !5
  %189 = getelementptr inbounds i8, ptr %188, i32 1
  store ptr %189, ptr %16, align 8, !tbaa !5
  store i8 %187, ptr %188, align 1, !tbaa !11
  br label %190

190:                                              ; preds = %183, %176
  br label %191

191:                                              ; preds = %190, %166
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #4
  br label %192

192:                                              ; preds = %191
  %193 = load i32, ptr %15, align 4, !tbaa !9
  %194 = zext i32 %193 to i64
  %195 = load i64, ptr %17, align 8, !tbaa !12
  %196 = udiv i64 %195, %194
  store i64 %196, ptr %17, align 8, !tbaa !12
  %197 = icmp ugt i64 %196, 0
  br i1 %197, label %158, label %198, !llvm.loop !17

198:                                              ; preds = %192
  %199 = load ptr, ptr %16, align 8, !tbaa !5
  %200 = getelementptr inbounds i8, ptr %199, i32 -1
  store ptr %200, ptr %16, align 8, !tbaa !5
  br label %201

201:                                              ; preds = %216, %198
  %202 = load ptr, ptr %6, align 8, !tbaa !5
  %203 = load ptr, ptr %11, align 8, !tbaa !5
  %204 = ptrtoint ptr %202 to i64
  %205 = ptrtoint ptr %203 to i64
  %206 = sub i64 %204, %205
  %207 = load i32, ptr %7, align 4, !tbaa !9
  %208 = zext i32 %207 to i64
  %209 = icmp slt i64 %206, %208
  br i1 %209, label %210, label %214

210:                                              ; preds = %201
  %211 = load ptr, ptr %16, align 8, !tbaa !5
  %212 = getelementptr inbounds [32 x i8], ptr %10, i64 0, i64 0
  %213 = icmp uge ptr %211, %212
  br label %214

214:                                              ; preds = %210, %201
  %215 = phi i1 [ false, %201 ], [ %213, %210 ]
  br i1 %215, label %216, label %222

216:                                              ; preds = %214
  %217 = load ptr, ptr %16, align 8, !tbaa !5
  %218 = getelementptr inbounds i8, ptr %217, i32 -1
  store ptr %218, ptr %16, align 8, !tbaa !5
  %219 = load i8, ptr %217, align 1, !tbaa !11
  %220 = load ptr, ptr %6, align 8, !tbaa !5
  %221 = getelementptr inbounds i8, ptr %220, i32 1
  store ptr %221, ptr %6, align 8, !tbaa !5
  store i8 %219, ptr %220, align 1, !tbaa !11
  br label %201, !llvm.loop !18

222:                                              ; preds = %214
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  br label %364

223:                                              ; preds = %66
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  %224 = load ptr, ptr %9, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.__va_list_tag, ptr %224, i32 0, i32 0
  %226 = load i32, ptr %225, align 8
  %227 = icmp ule i32 %226, 40
  br i1 %227, label %228, label %233

228:                                              ; preds = %223
  %229 = getelementptr inbounds %struct.__va_list_tag, ptr %224, i32 0, i32 3
  %230 = load ptr, ptr %229, align 8
  %231 = getelementptr i8, ptr %230, i32 %226
  %232 = add i32 %226, 8
  store i32 %232, ptr %225, align 8
  br label %237

233:                                              ; preds = %223
  %234 = getelementptr inbounds %struct.__va_list_tag, ptr %224, i32 0, i32 2
  %235 = load ptr, ptr %234, align 8
  %236 = getelementptr i8, ptr %235, i32 8
  store ptr %236, ptr %234, align 8
  br label %237

237:                                              ; preds = %233, %228
  %238 = phi ptr [ %231, %228 ], [ %235, %233 ]
  %239 = load ptr, ptr %238, align 8, !tbaa !5
  store ptr %239, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %20) #4
  br label %240

240:                                              ; preds = %257, %237
  %241 = load ptr, ptr %19, align 8, !tbaa !5
  %242 = getelementptr inbounds i8, ptr %241, i32 1
  store ptr %242, ptr %19, align 8, !tbaa !5
  %243 = call signext i8 @irom_char(ptr noundef %241)
  store i8 %243, ptr %20, align 1, !tbaa !11
  %244 = sext i8 %243 to i32
  %245 = icmp ne i32 %244, 0
  br i1 %245, label %246, label %255

246:                                              ; preds = %240
  %247 = load ptr, ptr %6, align 8, !tbaa !5
  %248 = load ptr, ptr %11, align 8, !tbaa !5
  %249 = ptrtoint ptr %247 to i64
  %250 = ptrtoint ptr %248 to i64
  %251 = sub i64 %249, %250
  %252 = load i32, ptr %7, align 4, !tbaa !9
  %253 = zext i32 %252 to i64
  %254 = icmp slt i64 %251, %253
  br label %255

255:                                              ; preds = %246, %240
  %256 = phi i1 [ false, %240 ], [ %254, %246 ]
  br i1 %256, label %257, label %261

257:                                              ; preds = %255
  %258 = load i8, ptr %20, align 1, !tbaa !11
  %259 = load ptr, ptr %6, align 8, !tbaa !5
  %260 = getelementptr inbounds i8, ptr %259, i32 1
  store ptr %260, ptr %6, align 8, !tbaa !5
  store i8 %258, ptr %259, align 1, !tbaa !11
  br label %240, !llvm.loop !19

261:                                              ; preds = %255
  call void @llvm.lifetime.end.p0(i64 1, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  br label %364

262:                                              ; preds = %66
  %263 = load ptr, ptr %9, align 8, !tbaa !5
  %264 = getelementptr inbounds %struct.__va_list_tag, ptr %263, i32 0, i32 0
  %265 = load i32, ptr %264, align 8
  %266 = icmp ule i32 %265, 40
  br i1 %266, label %267, label %272

267:                                              ; preds = %262
  %268 = getelementptr inbounds %struct.__va_list_tag, ptr %263, i32 0, i32 3
  %269 = load ptr, ptr %268, align 8
  %270 = getelementptr i8, ptr %269, i32 %265
  %271 = add i32 %265, 8
  store i32 %271, ptr %264, align 8
  br label %276

272:                                              ; preds = %262
  %273 = getelementptr inbounds %struct.__va_list_tag, ptr %263, i32 0, i32 2
  %274 = load ptr, ptr %273, align 8
  %275 = getelementptr i8, ptr %274, i32 8
  store ptr %275, ptr %273, align 8
  br label %276

276:                                              ; preds = %272, %267
  %277 = phi ptr [ %270, %267 ], [ %274, %272 ]
  %278 = load i32, ptr %277, align 4, !tbaa !9
  %279 = trunc i32 %278 to i8
  %280 = load ptr, ptr %6, align 8, !tbaa !5
  %281 = getelementptr inbounds i8, ptr %280, i32 1
  store ptr %281, ptr %6, align 8, !tbaa !5
  store i8 %279, ptr %280, align 1, !tbaa !11
  br label %364

282:                                              ; preds = %66
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  %283 = getelementptr inbounds [32 x i8], ptr %10, i64 0, i64 0
  store ptr %283, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  %284 = load ptr, ptr %9, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct.__va_list_tag, ptr %284, i32 0, i32 1
  %286 = load i32, ptr %285, align 4
  %287 = icmp ule i32 %286, 160
  br i1 %287, label %288, label %293

288:                                              ; preds = %282
  %289 = getelementptr inbounds %struct.__va_list_tag, ptr %284, i32 0, i32 3
  %290 = load ptr, ptr %289, align 8
  %291 = getelementptr i8, ptr %290, i32 %286
  %292 = add i32 %286, 16
  store i32 %292, ptr %285, align 4
  br label %297

293:                                              ; preds = %282
  %294 = getelementptr inbounds %struct.__va_list_tag, ptr %284, i32 0, i32 2
  %295 = load ptr, ptr %294, align 8
  %296 = getelementptr i8, ptr %295, i32 8
  store ptr %296, ptr %294, align 8
  br label %297

297:                                              ; preds = %293, %288
  %298 = phi ptr [ %291, %288 ], [ %295, %293 ]
  %299 = load double, ptr %298, align 8, !tbaa !20
  store double %299, ptr %22, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  %300 = load double, ptr %22, align 8, !tbaa !20
  %301 = fcmp oge double %300, 0.000000e+00
  br i1 %301, label %302, label %306

302:                                              ; preds = %297
  %303 = load double, ptr %22, align 8, !tbaa !20
  %304 = call double @llvm.fmuladd.f64(double %303, double 1.000000e+04, double 5.000000e-01)
  %305 = fptosi double %304 to i64
  store i64 %305, ptr %23, align 8, !tbaa !12
  br label %313

306:                                              ; preds = %297
  %307 = load double, ptr %22, align 8, !tbaa !20
  %308 = fneg double %307
  %309 = call double @llvm.fmuladd.f64(double %308, double 1.000000e+04, double 5.000000e-01)
  %310 = fptosi double %309 to i64
  store i64 %310, ptr %23, align 8, !tbaa !12
  %311 = load ptr, ptr %6, align 8, !tbaa !5
  %312 = getelementptr inbounds i8, ptr %311, i32 1
  store ptr %312, ptr %6, align 8, !tbaa !5
  store i8 45, ptr %311, align 1, !tbaa !11
  br label %313

313:                                              ; preds = %306, %302
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #4
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %314

314:                                              ; preds = %336, %313
  %315 = load i64, ptr %23, align 8, !tbaa !12
  %316 = srem i64 %315, 10
  %317 = add nsw i64 %316, 48
  %318 = trunc i64 %317 to i8
  %319 = load ptr, ptr %21, align 8, !tbaa !5
  %320 = getelementptr inbounds i8, ptr %319, i32 1
  store ptr %320, ptr %21, align 8, !tbaa !5
  store i8 %318, ptr %319, align 1, !tbaa !11
  %321 = load i32, ptr %24, align 4, !tbaa !9
  %322 = add nsw i32 %321, 1
  store i32 %322, ptr %24, align 4, !tbaa !9
  %323 = load i32, ptr %24, align 4, !tbaa !9
  %324 = icmp eq i32 %323, 4
  br i1 %324, label %325, label %328

325:                                              ; preds = %314
  %326 = load ptr, ptr %21, align 8, !tbaa !5
  %327 = getelementptr inbounds i8, ptr %326, i32 1
  store ptr %327, ptr %21, align 8, !tbaa !5
  store i8 46, ptr %326, align 1, !tbaa !11
  br label %328

328:                                              ; preds = %325, %314
  br label %329

329:                                              ; preds = %328
  %330 = load i64, ptr %23, align 8, !tbaa !12
  %331 = sdiv i64 %330, 10
  store i64 %331, ptr %23, align 8, !tbaa !12
  %332 = icmp sgt i64 %331, 0
  br i1 %332, label %336, label %333

333:                                              ; preds = %329
  %334 = load i32, ptr %24, align 4, !tbaa !9
  %335 = icmp slt i32 %334, 5
  br label %336

336:                                              ; preds = %333, %329
  %337 = phi i1 [ true, %329 ], [ %335, %333 ]
  br i1 %337, label %314, label %338, !llvm.loop !22

338:                                              ; preds = %336
  %339 = load ptr, ptr %21, align 8, !tbaa !5
  %340 = getelementptr inbounds i8, ptr %339, i32 -1
  store ptr %340, ptr %21, align 8, !tbaa !5
  br label %341

341:                                              ; preds = %356, %338
  %342 = load ptr, ptr %6, align 8, !tbaa !5
  %343 = load ptr, ptr %11, align 8, !tbaa !5
  %344 = ptrtoint ptr %342 to i64
  %345 = ptrtoint ptr %343 to i64
  %346 = sub i64 %344, %345
  %347 = load i32, ptr %7, align 4, !tbaa !9
  %348 = zext i32 %347 to i64
  %349 = icmp slt i64 %346, %348
  br i1 %349, label %350, label %354

350:                                              ; preds = %341
  %351 = load ptr, ptr %21, align 8, !tbaa !5
  %352 = getelementptr inbounds [32 x i8], ptr %10, i64 0, i64 0
  %353 = icmp uge ptr %351, %352
  br label %354

354:                                              ; preds = %350, %341
  %355 = phi i1 [ false, %341 ], [ %353, %350 ]
  br i1 %355, label %356, label %362

356:                                              ; preds = %354
  %357 = load ptr, ptr %21, align 8, !tbaa !5
  %358 = getelementptr inbounds i8, ptr %357, i32 -1
  store ptr %358, ptr %21, align 8, !tbaa !5
  %359 = load i8, ptr %357, align 1, !tbaa !11
  %360 = load ptr, ptr %6, align 8, !tbaa !5
  %361 = getelementptr inbounds i8, ptr %360, i32 1
  store ptr %361, ptr %6, align 8, !tbaa !5
  store i8 %359, ptr %360, align 1, !tbaa !11
  br label %341, !llvm.loop !23

362:                                              ; preds = %354
  call void @llvm.lifetime.end.p0(i64 4, 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
  br label %364

363:                                              ; preds = %66
  store i32 -1, ptr %5, align 4
  store i32 1, ptr %25, align 4
  br label %377

364:                                              ; preds = %362, %276, %261, %222, %134
  %365 = load ptr, ptr %8, align 8, !tbaa !5
  %366 = getelementptr inbounds i8, ptr %365, i32 1
  store ptr %366, ptr %8, align 8, !tbaa !5
  br label %367

367:                                              ; preds = %364, %61
  br label %368

368:                                              ; preds = %367, %49
  br label %29, !llvm.loop !24

369:                                              ; preds = %43
  %370 = load ptr, ptr %6, align 8, !tbaa !5
  store i8 0, ptr %370, align 1, !tbaa !11
  %371 = load ptr, ptr %6, align 8, !tbaa !5
  %372 = load ptr, ptr %11, align 8, !tbaa !5
  %373 = ptrtoint ptr %371 to i64
  %374 = ptrtoint ptr %372 to i64
  %375 = sub i64 %373, %374
  %376 = trunc i64 %375 to i32
  store i32 %376, ptr %5, align 4
  store i32 1, ptr %25, align 4
  br label %377

377:                                              ; preds = %369, %363
  call void @llvm.lifetime.end.p0(i64 1, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr %10) #4
  %378 = load i32, ptr %5, align 4
  ret i32 %378
}

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden signext i8 @irom_char(ptr noundef) #2

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #3

attributes #0 = { 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 #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"long", !7, i64 0}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = distinct !{!16, !15}
!17 = distinct !{!17, !15}
!18 = distinct !{!18, !15}
!19 = distinct !{!19, !15}
!20 = !{!21, !21, i64 0}
!21 = !{!"double", !7, i64 0}
!22 = distinct !{!22, !15}
!23 = distinct !{!23, !15}
!24 = distinct !{!24, !15}


; 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: nounwind uwtable
define dso_local i32 @vsnprintf(ptr noundef %0, i32 noundef %1, ptr noundef %2, ptr nocapture noundef %3) local_unnamed_addr #0 {
  %5 = alloca [32 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %5) #5
  %6 = tail call signext i8 @irom_char(ptr noundef %2)
  %.not146 = icmp eq i8 %6, 0
  br i1 %.not146, label %..critedge_crit_edge, label %.lr.ph149

..critedge_crit_edge:                             ; preds = %4
  %.pre = ptrtoint ptr %0 to i64
  br label %.critedge

.lr.ph149:                                        ; preds = %4
  %7 = add i32 %1, -1
  %8 = ptrtoint ptr %0 to i64
  %9 = zext i32 %7 to i64
  %10 = getelementptr inbounds i8, ptr %3, i64 4
  %11 = getelementptr inbounds i8, ptr %3, i64 8
  %12 = getelementptr inbounds i8, ptr %3, i64 16
  %13 = getelementptr inbounds i8, ptr %5, i64 1
  %14 = getelementptr inbounds i8, ptr %5, i64 2
  %15 = getelementptr inbounds i8, ptr %5, i64 3
  %16 = getelementptr inbounds i8, ptr %5, i64 4
  %17 = getelementptr inbounds i8, ptr %5, i64 5
  %18 = add i64 %8, %9
  %19 = add i64 %8, %9
  %20 = add i64 %8, -1
  %21 = add i64 %8, -1
  %22 = add i64 %8, %9
  %23 = add i64 %8, %9
  %invariant.gep = getelementptr i8, ptr %5, i64 6
  %invariant.gep305 = getelementptr i8, ptr %5, i64 1
  %invariant.gep307 = getelementptr i8, ptr %5, i64 1
  br label %24

24:                                               ; preds = %.lr.ph149, %.critedge2
  %25 = phi i8 [ %6, %.lr.ph149 ], [ %244, %.critedge2 ]
  %.089148 = phi ptr [ %0, %.lr.ph149 ], [ %.8, %.critedge2 ]
  %.097147 = phi ptr [ %2, %.lr.ph149 ], [ %243, %.critedge2 ]
  %26 = ptrtoint ptr %.089148 to i64
  %27 = sub i64 %26, %8
  %28 = icmp slt i64 %27, %9
  br i1 %28, label %29, label %.critedge

29:                                               ; preds = %24
  %.not117 = icmp eq i8 %25, 37
  br i1 %.not117, label %30, label %.critedge2.sink.split

30:                                               ; preds = %29
  %31 = getelementptr inbounds i8, ptr %.097147, i64 1
  %32 = call signext i8 @irom_char(ptr noundef nonnull %31)
  %33 = icmp eq i8 %32, 37
  br i1 %33, label %.critedge2.sink.split, label %34

34:                                               ; preds = %30
  %35 = call signext i8 @irom_char(ptr noundef nonnull %31)
  switch i8 %35, label %.loopexit [
    i8 100, label %36
    i8 105, label %36
    i8 117, label %85
    i8 120, label %85
    i8 88, label %85
    i8 115, label %136
    i8 99, label %158
    i8 102, label %173
  ]

36:                                               ; preds = %34, %34
  %37 = load i32, ptr %3, align 8
  %38 = icmp ult i32 %37, 41
  br i1 %38, label %39, label %44

39:                                               ; preds = %36
  %40 = load ptr, ptr %12, align 8
  %41 = zext nneg i32 %37 to i64
  %42 = getelementptr i8, ptr %40, i64 %41
  %43 = add nuw nsw i32 %37, 8
  store i32 %43, ptr %3, align 8
  br label %47

44:                                               ; preds = %36
  %45 = load ptr, ptr %11, align 8
  %46 = getelementptr i8, ptr %45, i64 8
  store ptr %46, ptr %11, align 8
  br label %47

47:                                               ; preds = %44, %39
  %48 = phi ptr [ %42, %39 ], [ %45, %44 ]
  %49 = load i64, ptr %48, align 8, !tbaa !5
  %50 = icmp slt i64 %49, 0
  br i1 %50, label %51, label %54

51:                                               ; preds = %47
  %52 = sub nsw i64 0, %49
  %53 = getelementptr inbounds i8, ptr %.089148, i64 1
  store i8 45, ptr %.089148, align 1, !tbaa !9
  br label %54

54:                                               ; preds = %51, %47
  %.099 = phi i64 [ %52, %51 ], [ %49, %47 ]
  %.190 = phi ptr [ %53, %51 ], [ %.089148, %47 ]
  br label %55

55:                                               ; preds = %55, %54
  %indvar = phi i64 [ %indvar.next, %55 ], [ 0, %54 ]
  %.0101 = phi ptr [ %59, %55 ], [ %5, %54 ]
  %.1100 = phi i64 [ %60, %55 ], [ %.099, %54 ]
  %56 = urem i64 %.1100, 10
  %57 = trunc nuw nsw i64 %56 to i8
  %58 = or disjoint i8 %57, 48
  %59 = getelementptr inbounds i8, ptr %.0101, i64 1
  store i8 %58, ptr %.0101, align 1, !tbaa !9
  %60 = udiv i64 %.1100, 10
  %.not120 = icmp ult i64 %.1100, 10
  %indvar.next = add i64 %indvar, 1
  br i1 %.not120, label %.preheader, label %55, !llvm.loop !10

.preheader:                                       ; preds = %55
  %61 = ptrtoint ptr %.190 to i64
  %62 = sub i64 %61, %8
  %63 = icmp slt i64 %62, %9
  %64 = icmp uge ptr %.0101, %5
  %65 = and i1 %63, %64
  br i1 %65, label %.lr.ph144.preheader, label %.critedge2

.lr.ph144.preheader:                              ; preds = %.preheader
  %66 = xor i64 %61, -1
  %67 = add i64 %19, %66
  %umin201 = call i64 @llvm.umin.i64(i64 %indvar, i64 %67)
  %68 = add i64 %umin201, 1
  %min.iters.check = icmp ult i64 %68, 32
  br i1 %min.iters.check, label %.lr.ph144.preheader283, label %vector.memcheck

vector.memcheck:                                  ; preds = %.lr.ph144.preheader
  %scevgep = getelementptr i8, ptr %.190, i64 1
  %69 = xor i64 %61, -1
  %70 = add i64 %18, %69
  %umin = call i64 @llvm.umin.i64(i64 %indvar, i64 %70)
  %scevgep197 = getelementptr i8, ptr %scevgep, i64 %umin
  %71 = sub i64 0, %umin
  %scevgep198 = getelementptr i8, ptr %.0101, i64 %71
  %gep308 = getelementptr i8, ptr %invariant.gep307, i64 %indvar
  %bound0 = icmp ult ptr %.190, %gep308
  %bound1 = icmp ult ptr %scevgep198, %scevgep197
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph144.preheader283, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %68, -32
  %ind.end = getelementptr i8, ptr %.190, i64 %n.vec
  %72 = sub i64 0, %n.vec
  %ind.end202 = getelementptr i8, ptr %.0101, i64 %72
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %next.gep = getelementptr i8, ptr %.190, i64 %index
  %offset.idx = sub i64 0, %index
  %next.gep205 = getelementptr i8, ptr %.0101, i64 %offset.idx
  %73 = getelementptr i8, ptr %next.gep205, i64 -15
  %74 = getelementptr i8, ptr %next.gep205, i64 -31
  %wide.load = load <16 x i8>, ptr %73, align 1, !tbaa !9, !alias.scope !12
  %reverse = shufflevector <16 x i8> %wide.load, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %wide.load207 = load <16 x i8>, ptr %74, align 1, !tbaa !9, !alias.scope !12
  %reverse208 = shufflevector <16 x i8> %wide.load207, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %75 = getelementptr i8, ptr %next.gep, i64 16
  store <16 x i8> %reverse, ptr %next.gep, align 1, !tbaa !9, !alias.scope !15, !noalias !12
  store <16 x i8> %reverse208, ptr %75, align 1, !tbaa !9, !alias.scope !15, !noalias !12
  %index.next = add nuw i64 %index, 32
  %76 = icmp eq i64 %index.next, %n.vec
  br i1 %76, label %middle.block, label %vector.body, !llvm.loop !17

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %68, %n.vec
  br i1 %cmp.n, label %.critedge2, label %.lr.ph144.preheader283

.lr.ph144.preheader283:                           ; preds = %middle.block, %vector.memcheck, %.lr.ph144.preheader
  %.291143.ph = phi ptr [ %.190, %vector.memcheck ], [ %.190, %.lr.ph144.preheader ], [ %ind.end, %middle.block ]
  %.1102142.ph = phi ptr [ %.0101, %vector.memcheck ], [ %.0101, %.lr.ph144.preheader ], [ %ind.end202, %middle.block ]
  br label %.lr.ph144

.lr.ph144:                                        ; preds = %.lr.ph144.preheader283, %.lr.ph144
  %.291143 = phi ptr [ %79, %.lr.ph144 ], [ %.291143.ph, %.lr.ph144.preheader283 ]
  %.1102142 = phi ptr [ %77, %.lr.ph144 ], [ %.1102142.ph, %.lr.ph144.preheader283 ]
  %77 = getelementptr inbounds i8, ptr %.1102142, i64 -1
  %78 = load i8, ptr %.1102142, align 1, !tbaa !9
  %79 = getelementptr inbounds i8, ptr %.291143, i64 1
  store i8 %78, ptr %.291143, align 1, !tbaa !9
  %80 = ptrtoint ptr %79 to i64
  %81 = sub i64 %80, %8
  %82 = icmp slt i64 %81, %9
  %83 = icmp uge ptr %77, %5
  %84 = select i1 %82, i1 %83, i1 false
  br i1 %84, label %.lr.ph144, label %.critedge2, !llvm.loop !20

85:                                               ; preds = %34, %34, %34
  %86 = icmp eq i8 %35, 117
  %87 = load i32, ptr %3, align 8
  %88 = icmp ult i32 %87, 41
  br i1 %88, label %89, label %94

89:                                               ; preds = %85
  %90 = load ptr, ptr %12, align 8
  %91 = zext nneg i32 %87 to i64
  %92 = getelementptr i8, ptr %90, i64 %91
  %93 = add nuw nsw i32 %87, 8
  store i32 %93, ptr %3, align 8
  br label %97

94:                                               ; preds = %85
  %95 = load ptr, ptr %11, align 8
  %96 = getelementptr i8, ptr %95, i64 8
  store ptr %96, ptr %11, align 8
  br label %97

97:                                               ; preds = %94, %89
  %98 = phi ptr [ %92, %89 ], [ %95, %94 ]
  %99 = load i64, ptr %98, align 8, !tbaa !5
  %100 = select i1 %86, i64 10, i64 16
  %101 = icmp eq i8 %35, 120
  br label %102

102:                                              ; preds = %114, %97
  %indvar211 = phi i64 [ %indvar.next212, %114 ], [ 0, %97 ]
  %.094 = phi ptr [ %.195, %114 ], [ %5, %97 ]
  %.093 = phi i64 [ %104, %114 ], [ %99, %97 ]
  %103 = urem i64 %.093, %100
  %104 = udiv i64 %.093, %100
  %105 = icmp ult i64 %103, 10
  %106 = trunc nuw nsw i64 %103 to i8
  br i1 %105, label %107, label %109

107:                                              ; preds = %102
  %108 = or disjoint i8 %106, 48
  br label %114

109:                                              ; preds = %102
  br i1 %101, label %110, label %112

110:                                              ; preds = %109
  %111 = add nuw nsw i8 %106, 87
  br label %114

112:                                              ; preds = %109
  %113 = add nuw nsw i8 %106, 55
  br label %114

114:                                              ; preds = %110, %112, %107
  %.sink = phi i8 [ %111, %110 ], [ %113, %112 ], [ %108, %107 ]
  store i8 %.sink, ptr %.094, align 1, !tbaa !9
  %.195 = getelementptr inbounds i8, ptr %.094, i64 1
  %.not119 = icmp ugt i64 %100, %.093
  %indvar.next212 = add i64 %indvar211, 1
  br i1 %.not119, label %.preheader123, label %102, !llvm.loop !21

.preheader123:                                    ; preds = %114
  %.not172 = icmp ult ptr %.094, %5
  br i1 %.not172, label %.critedge2, label %.lr.ph140.preheader

.lr.ph140.preheader:                              ; preds = %.preheader123
  %reass.sub = sub i64 %26, %8
  %115 = add i64 %reass.sub, 1
  %smax221 = call i64 @llvm.smax.i64(i64 %115, i64 %9)
  %116 = add i64 %21, %smax221
  %117 = sub i64 %116, %26
  %umin222 = call i64 @llvm.umin.i64(i64 %indvar211, i64 %117)
  %118 = add i64 %umin222, 1
  %min.iters.check225 = icmp ult i64 %118, 32
  br i1 %min.iters.check225, label %.lr.ph140.preheader284, label %vector.memcheck209

vector.memcheck209:                               ; preds = %.lr.ph140.preheader
  %scevgep210 = getelementptr i8, ptr %.089148, i64 1
  %reass.sub282 = sub i64 %26, %8
  %119 = add i64 %reass.sub282, 1
  %smax = call i64 @llvm.smax.i64(i64 %119, i64 %9)
  %120 = add i64 %20, %smax
  %121 = sub i64 %120, %26
  %umin213 = call i64 @llvm.umin.i64(i64 %indvar211, i64 %121)
  %scevgep214 = getelementptr i8, ptr %scevgep210, i64 %umin213
  %122 = sub i64 0, %umin213
  %scevgep215 = getelementptr i8, ptr %.094, i64 %122
  %gep306 = getelementptr i8, ptr %invariant.gep305, i64 %indvar211
  %bound0217 = icmp ult ptr %.089148, %gep306
  %bound1218 = icmp ult ptr %scevgep215, %scevgep214
  %found.conflict219 = and i1 %bound0217, %bound1218
  br i1 %found.conflict219, label %.lr.ph140.preheader284, label %vector.ph226

vector.ph226:                                     ; preds = %vector.memcheck209
  %n.vec228 = and i64 %118, -32
  %ind.end229 = getelementptr i8, ptr %.089148, i64 %n.vec228
  %123 = sub i64 0, %n.vec228
  %ind.end231 = getelementptr i8, ptr %.094, i64 %123
  br label %vector.body233

vector.body233:                                   ; preds = %vector.body233, %vector.ph226
  %index234 = phi i64 [ 0, %vector.ph226 ], [ %index.next244, %vector.body233 ]
  %next.gep235 = getelementptr i8, ptr %.089148, i64 %index234
  %offset.idx237 = sub i64 0, %index234
  %next.gep238 = getelementptr i8, ptr %.094, i64 %offset.idx237
  %124 = getelementptr i8, ptr %next.gep238, i64 -15
  %125 = getelementptr i8, ptr %next.gep238, i64 -31
  %wide.load240 = load <16 x i8>, ptr %124, align 1, !tbaa !9, !alias.scope !22
  %reverse241 = shufflevector <16 x i8> %wide.load240, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %wide.load242 = load <16 x i8>, ptr %125, align 1, !tbaa !9, !alias.scope !22
  %reverse243 = shufflevector <16 x i8> %wide.load242, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %126 = getelementptr i8, ptr %next.gep235, i64 16
  store <16 x i8> %reverse241, ptr %next.gep235, align 1, !tbaa !9, !alias.scope !25, !noalias !22
  store <16 x i8> %reverse243, ptr %126, align 1, !tbaa !9, !alias.scope !25, !noalias !22
  %index.next244 = add nuw i64 %index234, 32
  %127 = icmp eq i64 %index.next244, %n.vec228
  br i1 %127, label %middle.block223, label %vector.body233, !llvm.loop !27

middle.block223:                                  ; preds = %vector.body233
  %cmp.n245 = icmp eq i64 %118, %n.vec228
  br i1 %cmp.n245, label %.critedge2, label %.lr.ph140.preheader284

.lr.ph140.preheader284:                           ; preds = %middle.block223, %vector.memcheck209, %.lr.ph140.preheader
  %.3139.ph = phi ptr [ %.089148, %vector.memcheck209 ], [ %.089148, %.lr.ph140.preheader ], [ %ind.end229, %middle.block223 ]
  %.296138.ph = phi ptr [ %.094, %vector.memcheck209 ], [ %.094, %.lr.ph140.preheader ], [ %ind.end231, %middle.block223 ]
  br label %.lr.ph140

.lr.ph140:                                        ; preds = %.lr.ph140.preheader284, %.lr.ph140
  %.3139 = phi ptr [ %130, %.lr.ph140 ], [ %.3139.ph, %.lr.ph140.preheader284 ]
  %.296138 = phi ptr [ %128, %.lr.ph140 ], [ %.296138.ph, %.lr.ph140.preheader284 ]
  %128 = getelementptr inbounds i8, ptr %.296138, i64 -1
  %129 = load i8, ptr %.296138, align 1, !tbaa !9
  %130 = getelementptr inbounds i8, ptr %.3139, i64 1
  store i8 %129, ptr %.3139, align 1, !tbaa !9
  %131 = ptrtoint ptr %130 to i64
  %132 = sub i64 %131, %8
  %133 = icmp slt i64 %132, %9
  %134 = icmp uge ptr %128, %5
  %135 = select i1 %133, i1 %134, i1 false
  br i1 %135, label %.lr.ph140, label %.critedge2, !llvm.loop !28

136:                                              ; preds = %34
  %137 = load i32, ptr %3, align 8
  %138 = icmp ult i32 %137, 41
  br i1 %138, label %139, label %144

139:                                              ; preds = %136
  %140 = load ptr, ptr %12, align 8
  %141 = zext nneg i32 %137 to i64
  %142 = getelementptr i8, ptr %140, i64 %141
  %143 = add nuw nsw i32 %137, 8
  store i32 %143, ptr %3, align 8
  br label %147

144:                                              ; preds = %136
  %145 = load ptr, ptr %11, align 8
  %146 = getelementptr i8, ptr %145, i64 8
  store ptr %146, ptr %11, align 8
  br label %147

147:                                              ; preds = %144, %139
  %148 = phi ptr [ %142, %139 ], [ %145, %144 ]
  %149 = load ptr, ptr %148, align 8, !tbaa !29
  %150 = call signext i8 @irom_char(ptr noundef %149)
  %.not118132.not = icmp eq i8 %150, 0
  br i1 %.not118132.not, label %.critedge2, label %.lr.ph136

.lr.ph136:                                        ; preds = %147, %.lr.ph136
  %151 = phi i8 [ %154, %.lr.ph136 ], [ %150, %147 ]
  %.4135 = phi ptr [ %153, %.lr.ph136 ], [ %.089148, %147 ]
  %.092134 = phi ptr [ %152, %.lr.ph136 ], [ %149, %147 ]
  %152 = getelementptr inbounds i8, ptr %.092134, i64 1
  %153 = getelementptr inbounds i8, ptr %.4135, i64 1
  store i8 %151, ptr %.4135, align 1, !tbaa !9
  %154 = call signext i8 @irom_char(ptr noundef nonnull %152)
  %.not118 = icmp ne i8 %154, 0
  %155 = ptrtoint ptr %153 to i64
  %156 = sub i64 %155, %8
  %157 = icmp slt i64 %156, %9
  %or.cond = select i1 %.not118, i1 %157, i1 false
  br i1 %or.cond, label %.lr.ph136, label %.critedge2, !llvm.loop !31

158:                                              ; preds = %34
  %159 = load i32, ptr %3, align 8
  %160 = icmp ult i32 %159, 41
  br i1 %160, label %161, label %166

161:                                              ; preds = %158
  %162 = load ptr, ptr %12, align 8
  %163 = zext nneg i32 %159 to i64
  %164 = getelementptr i8, ptr %162, i64 %163
  %165 = add nuw nsw i32 %159, 8
  store i32 %165, ptr %3, align 8
  br label %169

166:                                              ; preds = %158
  %167 = load ptr, ptr %11, align 8
  %168 = getelementptr i8, ptr %167, i64 8
  store ptr %168, ptr %11, align 8
  br label %169

169:                                              ; preds = %166, %161
  %170 = phi ptr [ %164, %161 ], [ %167, %166 ]
  %171 = load i32, ptr %170, align 4, !tbaa !32
  %172 = trunc i32 %171 to i8
  br label %.critedge2.sink.split

173:                                              ; preds = %34
  %174 = load i32, ptr %10, align 4
  %175 = icmp ult i32 %174, 161
  br i1 %175, label %176, label %181

176:                                              ; preds = %173
  %177 = load ptr, ptr %12, align 8
  %178 = zext nneg i32 %174 to i64
  %179 = getelementptr i8, ptr %177, i64 %178
  %180 = add nuw nsw i32 %174, 16
  store i32 %180, ptr %10, align 4
  br label %184

181:                                              ; preds = %173
  %182 = load ptr, ptr %11, align 8
  %183 = getelementptr i8, ptr %182, i64 8
  store ptr %183, ptr %11, align 8
  br label %184

184:                                              ; preds = %181, %176
  %185 = phi ptr [ %179, %176 ], [ %182, %181 ]
  %186 = load double, ptr %185, align 8, !tbaa !34
  %187 = fcmp ult double %186, 0.000000e+00
  br i1 %187, label %190, label %188

188:                                              ; preds = %184
  %189 = call double @llvm.fmuladd.f64(double %186, double 1.000000e+04, double 5.000000e-01)
  br label %.peel.next163

190:                                              ; preds = %184
  %191 = fneg double %186
  %192 = call double @llvm.fmuladd.f64(double %191, double 1.000000e+04, double 5.000000e-01)
  %193 = getelementptr inbounds i8, ptr %.089148, i64 1
  store i8 45, ptr %.089148, align 1, !tbaa !9
  br label %.peel.next163

.peel.next163:                                    ; preds = %188, %190
  %.5 = phi ptr [ %.089148, %188 ], [ %193, %190 ]
  %.085.in = phi double [ %189, %188 ], [ %192, %190 ]
  %.085 = fptosi double %.085.in to i64
  %194 = srem i64 %.085, 10
  %195 = trunc nsw i64 %194 to i8
  %196 = add nsw i8 %195, 48
  store i8 %196, ptr %5, align 16, !tbaa !9
  %197 = sdiv i64 %.085, 10
  %198 = srem i64 %197, 10
  %199 = trunc nsw i64 %198 to i8
  %200 = add nsw i8 %199, 48
  store i8 %200, ptr %13, align 1, !tbaa !9
  %201 = sdiv i64 %.085, 100
  %202 = srem i64 %201, 10
  %203 = trunc nsw i64 %202 to i8
  %204 = add nsw i8 %203, 48
  store i8 %204, ptr %14, align 2, !tbaa !9
  %205 = sdiv i64 %.085, 1000
  %206 = srem i64 %205, 10
  %207 = trunc nsw i64 %206 to i8
  %208 = add nsw i8 %207, 48
  store i8 %208, ptr %15, align 1, !tbaa !9
  store i8 46, ptr %16, align 4, !tbaa !9
  %209 = sdiv i64 %.085, 10000
  br label %210

210:                                              ; preds = %.peel.next163, %210
  %indvar248 = phi i64 [ 0, %.peel.next163 ], [ %indvar.next249, %210 ]
  %.087 = phi ptr [ %17, %.peel.next163 ], [ %214, %210 ]
  %.1 = phi i64 [ %209, %.peel.next163 ], [ %215, %210 ]
  %211 = srem i64 %.1, 10
  %212 = trunc nsw i64 %211 to i8
  %213 = add nsw i8 %212, 48
  store i8 %213, ptr %.087, align 1, !tbaa !9
  %214 = getelementptr inbounds i8, ptr %.087, i64 1
  %215 = udiv i64 %.1, 10
  %216 = icmp sgt i64 %.1, 9
  %indvar.next249 = add i64 %indvar248, 1
  br i1 %216, label %210, label %.preheader126, !llvm.loop !36

.preheader126:                                    ; preds = %210
  %217 = ptrtoint ptr %.5 to i64
  %218 = sub i64 %217, %8
  %219 = icmp slt i64 %218, %9
  %220 = icmp uge ptr %.087, %5
  %221 = and i1 %219, %220
  br i1 %221, label %.lr.ph.preheader, label %.critedge2

.lr.ph.preheader:                                 ; preds = %.preheader126
  %222 = add i64 %indvar248, 5
  %223 = xor i64 %217, -1
  %224 = add i64 %23, %223
  %umin258 = call i64 @llvm.umin.i64(i64 %222, i64 %224)
  %225 = add i64 %umin258, 1
  %min.iters.check261 = icmp ult i64 %225, 32
  br i1 %min.iters.check261, label %.lr.ph.preheader287, label %vector.memcheck246

vector.memcheck246:                               ; preds = %.lr.ph.preheader
  %scevgep247 = getelementptr i8, ptr %.5, i64 1
  %226 = add i64 %indvar248, 5
  %227 = xor i64 %217, -1
  %228 = add i64 %22, %227
  %umin250 = call i64 @llvm.umin.i64(i64 %226, i64 %228)
  %scevgep251 = getelementptr i8, ptr %scevgep247, i64 %umin250
  %229 = sub i64 0, %umin250
  %scevgep252 = getelementptr i8, ptr %.087, i64 %229
  %gep = getelementptr i8, ptr %invariant.gep, i64 %indvar248
  %bound0254 = icmp ult ptr %.5, %gep
  %bound1255 = icmp ult ptr %scevgep252, %scevgep251
  %found.conflict256 = and i1 %bound0254, %bound1255
  br i1 %found.conflict256, label %.lr.ph.preheader287, label %vector.ph262

vector.ph262:                                     ; preds = %vector.memcheck246
  %n.vec264 = and i64 %225, -32
  %230 = sub i64 0, %n.vec264
  %ind.end265 = getelementptr i8, ptr %.087, i64 %230
  %ind.end267 = getelementptr i8, ptr %.5, i64 %n.vec264
  br label %vector.body269

vector.body269:                                   ; preds = %vector.body269, %vector.ph262
  %index270 = phi i64 [ 0, %vector.ph262 ], [ %index.next280, %vector.body269 ]
  %offset.idx271 = sub i64 0, %index270
  %next.gep272 = getelementptr i8, ptr %.087, i64 %offset.idx271
  %next.gep274 = getelementptr i8, ptr %.5, i64 %index270
  %231 = getelementptr i8, ptr %next.gep272, i64 -15
  %232 = getelementptr i8, ptr %next.gep272, i64 -31
  %wide.load276 = load <16 x i8>, ptr %231, align 1, !tbaa !9, !alias.scope !38
  %reverse277 = shufflevector <16 x i8> %wide.load276, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %wide.load278 = load <16 x i8>, ptr %232, align 1, !tbaa !9, !alias.scope !38
  %reverse279 = shufflevector <16 x i8> %wide.load278, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %233 = getelementptr i8, ptr %next.gep274, i64 16
  store <16 x i8> %reverse277, ptr %next.gep274, align 1, !tbaa !9, !alias.scope !41, !noalias !38
  store <16 x i8> %reverse279, ptr %233, align 1, !tbaa !9, !alias.scope !41, !noalias !38
  %index.next280 = add nuw i64 %index270, 32
  %234 = icmp eq i64 %index.next280, %n.vec264
  br i1 %234, label %middle.block259, label %vector.body269, !llvm.loop !43

middle.block259:                                  ; preds = %vector.body269
  %cmp.n281 = icmp eq i64 %225, %n.vec264
  br i1 %cmp.n281, label %.critedge2, label %.lr.ph.preheader287

.lr.ph.preheader287:                              ; preds = %middle.block259, %vector.memcheck246, %.lr.ph.preheader
  %.2131.ph = phi ptr [ %.087, %vector.memcheck246 ], [ %.087, %.lr.ph.preheader ], [ %ind.end265, %middle.block259 ]
  %.6130.ph = phi ptr [ %.5, %vector.memcheck246 ], [ %.5, %.lr.ph.preheader ], [ %ind.end267, %middle.block259 ]
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader287, %.lr.ph
  %.2131 = phi ptr [ %.2, %.lr.ph ], [ %.2131.ph, %.lr.ph.preheader287 ]
  %.6130 = phi ptr [ %236, %.lr.ph ], [ %.6130.ph, %.lr.ph.preheader287 ]
  %235 = load i8, ptr %.2131, align 1, !tbaa !9
  %236 = getelementptr inbounds i8, ptr %.6130, i64 1
  store i8 %235, ptr %.6130, align 1, !tbaa !9
  %.2 = getelementptr inbounds i8, ptr %.2131, i64 -1
  %237 = ptrtoint ptr %236 to i64
  %238 = sub i64 %237, %8
  %239 = icmp slt i64 %238, %9
  %240 = icmp uge ptr %.2, %5
  %241 = select i1 %239, i1 %240, i1 false
  br i1 %241, label %.lr.ph, label %.critedge2, !llvm.loop !44

.critedge2.sink.split:                            ; preds = %30, %29, %169
  %.sink185 = phi i8 [ %172, %169 ], [ %25, %29 ], [ 37, %30 ]
  %.sink184.ph = phi i64 [ 2, %169 ], [ 1, %29 ], [ 2, %30 ]
  %242 = getelementptr inbounds i8, ptr %.089148, i64 1
  store i8 %.sink185, ptr %.089148, align 1, !tbaa !9
  br label %.critedge2

.critedge2:                                       ; preds = %.lr.ph, %.lr.ph136, %.lr.ph140, %.lr.ph144, %middle.block259, %middle.block223, %middle.block, %.critedge2.sink.split, %.preheader, %.preheader123, %147, %.preheader126
  %.sink184 = phi i64 [ 2, %.preheader126 ], [ 2, %147 ], [ 2, %.preheader123 ], [ 2, %.preheader ], [ %.sink184.ph, %.critedge2.sink.split ], [ 2, %middle.block ], [ 2, %middle.block223 ], [ 2, %middle.block259 ], [ 2, %.lr.ph144 ], [ 2, %.lr.ph140 ], [ 2, %.lr.ph136 ], [ 2, %.lr.ph ]
  %.8 = phi ptr [ %.5, %.preheader126 ], [ %.089148, %147 ], [ %.089148, %.preheader123 ], [ %.190, %.preheader ], [ %242, %.critedge2.sink.split ], [ %ind.end, %middle.block ], [ %ind.end229, %middle.block223 ], [ %ind.end267, %middle.block259 ], [ %79, %.lr.ph144 ], [ %130, %.lr.ph140 ], [ %153, %.lr.ph136 ], [ %236, %.lr.ph ]
  %243 = getelementptr inbounds i8, ptr %.097147, i64 %.sink184
  %244 = call signext i8 @irom_char(ptr noundef nonnull %243)
  %.not = icmp eq i8 %244, 0
  br i1 %.not, label %..critedge.loopexit_crit_edge, label %24, !llvm.loop !45

..critedge.loopexit_crit_edge:                    ; preds = %.critedge2
  %.pre171 = ptrtoint ptr %.8 to i64
  br label %.critedge

.critedge:                                        ; preds = %24, %..critedge.loopexit_crit_edge, %..critedge_crit_edge
  %.pre-phi170 = phi i64 [ %.pre, %..critedge_crit_edge ], [ %.pre171, %..critedge.loopexit_crit_edge ], [ %26, %24 ]
  %.pre-phi = phi i64 [ %.pre, %..critedge_crit_edge ], [ %8, %..critedge.loopexit_crit_edge ], [ %8, %24 ]
  %.089.lcssa = phi ptr [ %0, %..critedge_crit_edge ], [ %.8, %..critedge.loopexit_crit_edge ], [ %.089148, %24 ]
  store i8 0, ptr %.089.lcssa, align 1, !tbaa !9
  %245 = sub i64 %.pre-phi170, %.pre-phi
  %246 = trunc i64 %245 to i32
  br label %.loopexit

.loopexit:                                        ; preds = %34, %.critedge
  %.086 = phi i32 [ %246, %.critedge ], [ -1, %34 ]
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %5) #5
  ret i32 %.086
}

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden signext i8 @irom_char(ptr noundef) local_unnamed_addr #2

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.umin.i64(i64, i64) #4

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.smax.i64(i64, i64) #4

attributes #0 = { 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 #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = !{!"long", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!7, !7, i64 0}
!10 = distinct !{!10, !11}
!11 = !{!"llvm.loop.mustprogress"}
!12 = !{!13}
!13 = distinct !{!13, !14}
!14 = distinct !{!14, !"LVerDomain"}
!15 = !{!16}
!16 = distinct !{!16, !14}
!17 = distinct !{!17, !11, !18, !19}
!18 = !{!"llvm.loop.isvectorized", i32 1}
!19 = !{!"llvm.loop.unroll.runtime.disable"}
!20 = distinct !{!20, !11, !18}
!21 = distinct !{!21, !11}
!22 = !{!23}
!23 = distinct !{!23, !24}
!24 = distinct !{!24, !"LVerDomain"}
!25 = !{!26}
!26 = distinct !{!26, !24}
!27 = distinct !{!27, !11, !18, !19}
!28 = distinct !{!28, !11, !18}
!29 = !{!30, !30, i64 0}
!30 = !{!"any pointer", !7, i64 0}
!31 = distinct !{!31, !11}
!32 = !{!33, !33, i64 0}
!33 = !{!"int", !7, i64 0}
!34 = !{!35, !35, i64 0}
!35 = !{!"double", !7, i64 0}
!36 = distinct !{!36, !11, !37}
!37 = !{!"llvm.loop.peeled.count", i32 4}
!38 = !{!39}
!39 = distinct !{!39, !40}
!40 = distinct !{!40, !"LVerDomain"}
!41 = !{!42}
!42 = distinct !{!42, !40}
!43 = distinct !{!43, !11, !18, !19}
!44 = distinct !{!44, !11, !18}
!45 = distinct !{!45, !11}


; Effective O3 passes: BDCEPass,CorrelatedValuePropagationPass,DivRemPairsPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopFullUnrollPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass