; LLVM IR from freakout42/macrocalc :: mc/mex (line)

; 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.WINDOW = type { ptr, ptr, ptr, ptr, i32, ptr, i32, i32, i32, i32, i32, i32 }
%struct.BUFFER = type { ptr, ptr, i32, ptr, i32, ptr, i32, i32, [128 x i8], [128 x i8] }
%struct.LINE = type { ptr, ptr, i16, i16, [32768 x i8] }

@wheadp = external global ptr, align 8
@curbp = external global ptr, align 8
@curwp = external global ptr, align 8

; Function Attrs: nounwind uwtable
declare dso_local ptr @lalloc(i32 noundef) #0

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

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

; Function Attrs: nounwind
declare void @free(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local void @lchange(i32 noundef) #0

; Function Attrs: nounwind uwtable
define dso_local i32 @linsert(i32 noundef %0, i32 noundef %1, i32 noundef %2) #0 {
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  store i32 %0, ptr %5, align 4, !tbaa !5
  store i32 %1, ptr %6, align 4, !tbaa !5
  store i32 %2, ptr %7, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #3
  %20 = load i32, ptr %7, align 4, !tbaa !5
  %21 = icmp ne i32 %20, 0
  %22 = xor i1 %21, true
  %23 = zext i1 %22 to i32
  store i32 %23, ptr %17, align 4, !tbaa !5
  call void @lchange(i32 noundef 4)
  %24 = load ptr, ptr @curwp, align 8, !tbaa !9
  %25 = getelementptr inbounds %struct.WINDOW, ptr %24, i32 0, i32 3
  %26 = load ptr, ptr %25, align 8, !tbaa !11
  store ptr %26, ptr %10, align 8, !tbaa !9
  %27 = load ptr, ptr %10, align 8, !tbaa !9
  %28 = load ptr, ptr @curbp, align 8, !tbaa !9
  %29 = getelementptr inbounds %struct.BUFFER, ptr %28, i32 0, i32 5
  %30 = load ptr, ptr %29, align 8, !tbaa !13
  %31 = icmp eq ptr %27, %30
  br i1 %31, label %32, label %75

32:                                               ; preds = %3
  %33 = load i32, ptr %5, align 4, !tbaa !5
  %34 = call ptr @lalloc(i32 noundef %33)
  store ptr %34, ptr %11, align 8, !tbaa !9
  %35 = icmp eq ptr %34, null
  br i1 %35, label %36, label %37

36:                                               ; preds = %32
  store i32 0, ptr %4, align 4
  store i32 1, ptr %19, align 4
  br label %331

37:                                               ; preds = %32
  %38 = load ptr, ptr %10, align 8, !tbaa !9
  %39 = getelementptr inbounds %struct.LINE, ptr %38, i32 0, i32 1
  %40 = load ptr, ptr %39, align 8, !tbaa !15
  store ptr %40, ptr %13, align 8, !tbaa !9
  %41 = load ptr, ptr %11, align 8, !tbaa !9
  %42 = load ptr, ptr %13, align 8, !tbaa !9
  %43 = getelementptr inbounds %struct.LINE, ptr %42, i32 0, i32 0
  store ptr %41, ptr %43, align 8, !tbaa !18
  %44 = load ptr, ptr %10, align 8, !tbaa !9
  %45 = load ptr, ptr %11, align 8, !tbaa !9
  %46 = getelementptr inbounds %struct.LINE, ptr %45, i32 0, i32 0
  store ptr %44, ptr %46, align 8, !tbaa !18
  %47 = load ptr, ptr %11, align 8, !tbaa !9
  %48 = load ptr, ptr %10, align 8, !tbaa !9
  %49 = getelementptr inbounds %struct.LINE, ptr %48, i32 0, i32 1
  store ptr %47, ptr %49, align 8, !tbaa !15
  %50 = load ptr, ptr %13, align 8, !tbaa !9
  %51 = load ptr, ptr %11, align 8, !tbaa !9
  %52 = getelementptr inbounds %struct.LINE, ptr %51, i32 0, i32 1
  store ptr %50, ptr %52, align 8, !tbaa !15
  store i32 0, ptr %12, align 4, !tbaa !5
  br label %53

53:                                               ; preds = %65, %37
  %54 = load i32, ptr %12, align 4, !tbaa !5
  %55 = load i32, ptr %5, align 4, !tbaa !5
  %56 = icmp slt i32 %54, %55
  br i1 %56, label %57, label %68

57:                                               ; preds = %53
  %58 = load i32, ptr %6, align 4, !tbaa !5
  %59 = trunc i32 %58 to i8
  %60 = load ptr, ptr %11, align 8, !tbaa !9
  %61 = getelementptr inbounds %struct.LINE, ptr %60, i32 0, i32 4
  %62 = load i32, ptr %12, align 4, !tbaa !5
  %63 = sext i32 %62 to i64
  %64 = getelementptr inbounds [32768 x i8], ptr %61, i64 0, i64 %63
  store i8 %59, ptr %64, align 1, !tbaa !19
  br label %65

65:                                               ; preds = %57
  %66 = load i32, ptr %12, align 4, !tbaa !5
  %67 = add nsw i32 %66, 1
  store i32 %67, ptr %12, align 4, !tbaa !5
  br label %53, !llvm.loop !20

68:                                               ; preds = %53
  %69 = load ptr, ptr %11, align 8, !tbaa !9
  %70 = load ptr, ptr @curwp, align 8, !tbaa !9
  %71 = getelementptr inbounds %struct.WINDOW, ptr %70, i32 0, i32 3
  store ptr %69, ptr %71, align 8, !tbaa !11
  %72 = load i32, ptr %5, align 4, !tbaa !5
  %73 = load ptr, ptr @curwp, align 8, !tbaa !9
  %74 = getelementptr inbounds %struct.WINDOW, ptr %73, i32 0, i32 4
  store i32 %72, ptr %74, align 8, !tbaa !22
  store i32 1, ptr %4, align 4
  store i32 1, ptr %19, align 4
  br label %331

75:                                               ; preds = %3
  %76 = load ptr, ptr @curwp, align 8, !tbaa !9
  %77 = getelementptr inbounds %struct.WINDOW, ptr %76, i32 0, i32 4
  %78 = load i32, ptr %77, align 8, !tbaa !22
  store i32 %78, ptr %16, align 4, !tbaa !5
  %79 = load i32, ptr %17, align 4, !tbaa !5
  %80 = icmp ne i32 %79, 0
  br i1 %80, label %81, label %89

81:                                               ; preds = %75
  %82 = load ptr, ptr %10, align 8, !tbaa !9
  %83 = getelementptr inbounds %struct.LINE, ptr %82, i32 0, i32 3
  %84 = load i16, ptr %83, align 2, !tbaa !23
  %85 = sext i16 %84 to i32
  %86 = and i32 65535, %85
  %87 = load i32, ptr %5, align 4, !tbaa !5
  %88 = add nsw i32 %86, %87
  store i32 %88, ptr %18, align 4, !tbaa !5
  br label %93

89:                                               ; preds = %75
  %90 = load i32, ptr %16, align 4, !tbaa !5
  %91 = load i32, ptr %5, align 4, !tbaa !5
  %92 = add nsw i32 %90, %91
  store i32 %92, ptr %18, align 4, !tbaa !5
  br label %93

93:                                               ; preds = %89, %81
  %94 = load i32, ptr %18, align 4, !tbaa !5
  %95 = load ptr, ptr %10, align 8, !tbaa !9
  %96 = getelementptr inbounds %struct.LINE, ptr %95, i32 0, i32 2
  %97 = load i16, ptr %96, align 8, !tbaa !24
  %98 = sext i16 %97 to i32
  %99 = and i32 65535, %98
  %100 = icmp sgt i32 %94, %99
  br i1 %100, label %101, label %178

101:                                              ; preds = %93
  %102 = load i32, ptr %18, align 4, !tbaa !5
  %103 = call ptr @lalloc(i32 noundef %102)
  store ptr %103, ptr %11, align 8, !tbaa !9
  %104 = icmp eq ptr %103, null
  br i1 %104, label %105, label %106

105:                                              ; preds = %101
  store i32 0, ptr %4, align 4
  store i32 1, ptr %19, align 4
  br label %331

106:                                              ; preds = %101
  %107 = load ptr, ptr %10, align 8, !tbaa !9
  %108 = getelementptr inbounds %struct.LINE, ptr %107, i32 0, i32 4
  %109 = getelementptr inbounds [32768 x i8], ptr %108, i64 0, i64 0
  store ptr %109, ptr %8, align 8, !tbaa !9
  %110 = load ptr, ptr %11, align 8, !tbaa !9
  %111 = getelementptr inbounds %struct.LINE, ptr %110, i32 0, i32 4
  %112 = getelementptr inbounds [32768 x i8], ptr %111, i64 0, i64 0
  store ptr %112, ptr %9, align 8, !tbaa !9
  %113 = load ptr, ptr %10, align 8, !tbaa !9
  %114 = getelementptr inbounds %struct.LINE, ptr %113, i32 0, i32 4
  %115 = load i32, ptr %16, align 4, !tbaa !5
  %116 = sext i32 %115 to i64
  %117 = getelementptr inbounds [32768 x i8], ptr %114, i64 0, i64 %116
  store ptr %117, ptr %14, align 8, !tbaa !9
  br label %118

118:                                              ; preds = %122, %106
  %119 = load ptr, ptr %8, align 8, !tbaa !9
  %120 = load ptr, ptr %14, align 8, !tbaa !9
  %121 = icmp ult ptr %119, %120
  br i1 %121, label %122, label %128

122:                                              ; preds = %118
  %123 = load ptr, ptr %8, align 8, !tbaa !9
  %124 = getelementptr inbounds i8, ptr %123, i32 1
  store ptr %124, ptr %8, align 8, !tbaa !9
  %125 = load i8, ptr %123, align 1, !tbaa !19
  %126 = load ptr, ptr %9, align 8, !tbaa !9
  %127 = getelementptr inbounds i8, ptr %126, i32 1
  store ptr %127, ptr %9, align 8, !tbaa !9
  store i8 %125, ptr %126, align 1, !tbaa !19
  br label %118, !llvm.loop !25

128:                                              ; preds = %118
  %129 = load i32, ptr %17, align 4, !tbaa !5
  %130 = icmp ne i32 %129, 0
  br i1 %130, label %131, label %156

131:                                              ; preds = %128
  %132 = load i32, ptr %5, align 4, !tbaa !5
  %133 = load ptr, ptr %9, align 8, !tbaa !9
  %134 = sext i32 %132 to i64
  %135 = getelementptr inbounds i8, ptr %133, i64 %134
  store ptr %135, ptr %9, align 8, !tbaa !9
  %136 = load ptr, ptr %10, align 8, !tbaa !9
  %137 = getelementptr inbounds %struct.LINE, ptr %136, i32 0, i32 4
  %138 = load ptr, ptr %10, align 8, !tbaa !9
  %139 = getelementptr inbounds %struct.LINE, ptr %138, i32 0, i32 3
  %140 = load i16, ptr %139, align 2, !tbaa !23
  %141 = sext i16 %140 to i32
  %142 = and i32 65535, %141
  %143 = sext i32 %142 to i64
  %144 = getelementptr inbounds [32768 x i8], ptr %137, i64 0, i64 %143
  store ptr %144, ptr %14, align 8, !tbaa !9
  br label %145

145:                                              ; preds = %149, %131
  %146 = load ptr, ptr %8, align 8, !tbaa !9
  %147 = load ptr, ptr %14, align 8, !tbaa !9
  %148 = icmp ult ptr %146, %147
  br i1 %148, label %149, label %155

149:                                              ; preds = %145
  %150 = load ptr, ptr %8, align 8, !tbaa !9
  %151 = getelementptr inbounds i8, ptr %150, i32 1
  store ptr %151, ptr %8, align 8, !tbaa !9
  %152 = load i8, ptr %150, align 1, !tbaa !19
  %153 = load ptr, ptr %9, align 8, !tbaa !9
  %154 = getelementptr inbounds i8, ptr %153, i32 1
  store ptr %154, ptr %9, align 8, !tbaa !9
  store i8 %152, ptr %153, align 1, !tbaa !19
  br label %145, !llvm.loop !26

155:                                              ; preds = %145
  br label %156

156:                                              ; preds = %155, %128
  %157 = load ptr, ptr %11, align 8, !tbaa !9
  %158 = load ptr, ptr %10, align 8, !tbaa !9
  %159 = getelementptr inbounds %struct.LINE, ptr %158, i32 0, i32 1
  %160 = load ptr, ptr %159, align 8, !tbaa !15
  %161 = getelementptr inbounds %struct.LINE, ptr %160, i32 0, i32 0
  store ptr %157, ptr %161, align 8, !tbaa !18
  %162 = load ptr, ptr %10, align 8, !tbaa !9
  %163 = getelementptr inbounds %struct.LINE, ptr %162, i32 0, i32 0
  %164 = load ptr, ptr %163, align 8, !tbaa !18
  %165 = load ptr, ptr %11, align 8, !tbaa !9
  %166 = getelementptr inbounds %struct.LINE, ptr %165, i32 0, i32 0
  store ptr %164, ptr %166, align 8, !tbaa !18
  %167 = load ptr, ptr %11, align 8, !tbaa !9
  %168 = load ptr, ptr %10, align 8, !tbaa !9
  %169 = getelementptr inbounds %struct.LINE, ptr %168, i32 0, i32 0
  %170 = load ptr, ptr %169, align 8, !tbaa !18
  %171 = getelementptr inbounds %struct.LINE, ptr %170, i32 0, i32 1
  store ptr %167, ptr %171, align 8, !tbaa !15
  %172 = load ptr, ptr %10, align 8, !tbaa !9
  %173 = getelementptr inbounds %struct.LINE, ptr %172, i32 0, i32 1
  %174 = load ptr, ptr %173, align 8, !tbaa !15
  %175 = load ptr, ptr %11, align 8, !tbaa !9
  %176 = getelementptr inbounds %struct.LINE, ptr %175, i32 0, i32 1
  store ptr %174, ptr %176, align 8, !tbaa !15
  %177 = load ptr, ptr %10, align 8, !tbaa !9
  call void @free(ptr noundef %177) #3
  br label %239

178:                                              ; preds = %93
  %179 = load ptr, ptr %10, align 8, !tbaa !9
  store ptr %179, ptr %11, align 8, !tbaa !9
  %180 = load i32, ptr %7, align 4, !tbaa !5
  %181 = icmp ne i32 %180, 0
  br i1 %181, label %182, label %200

182:                                              ; preds = %178
  %183 = load ptr, ptr %11, align 8, !tbaa !9
  %184 = getelementptr inbounds %struct.LINE, ptr %183, i32 0, i32 3
  %185 = load i16, ptr %184, align 2, !tbaa !23
  %186 = sext i16 %185 to i32
  %187 = and i32 65535, %186
  %188 = load i32, ptr %16, align 4, !tbaa !5
  %189 = load i32, ptr %5, align 4, !tbaa !5
  %190 = add nsw i32 %188, %189
  %191 = icmp slt i32 %187, %190
  br i1 %191, label %192, label %199

192:                                              ; preds = %182
  %193 = load i32, ptr %16, align 4, !tbaa !5
  %194 = load i32, ptr %5, align 4, !tbaa !5
  %195 = add nsw i32 %193, %194
  %196 = trunc i32 %195 to i16
  %197 = load ptr, ptr %11, align 8, !tbaa !9
  %198 = getelementptr inbounds %struct.LINE, ptr %197, i32 0, i32 3
  store i16 %196, ptr %198, align 2, !tbaa !23
  br label %199

199:                                              ; preds = %192, %182
  br label %238

200:                                              ; preds = %178
  %201 = load i32, ptr %5, align 4, !tbaa !5
  %202 = load ptr, ptr %11, align 8, !tbaa !9
  %203 = getelementptr inbounds %struct.LINE, ptr %202, i32 0, i32 3
  %204 = load i16, ptr %203, align 2, !tbaa !23
  %205 = sext i16 %204 to i32
  %206 = add nsw i32 %205, %201
  %207 = trunc i32 %206 to i16
  store i16 %207, ptr %203, align 2, !tbaa !23
  %208 = load ptr, ptr %11, align 8, !tbaa !9
  %209 = getelementptr inbounds %struct.LINE, ptr %208, i32 0, i32 4
  %210 = load ptr, ptr %11, align 8, !tbaa !9
  %211 = getelementptr inbounds %struct.LINE, ptr %210, i32 0, i32 3
  %212 = load i16, ptr %211, align 2, !tbaa !23
  %213 = sext i16 %212 to i32
  %214 = and i32 65535, %213
  %215 = sext i32 %214 to i64
  %216 = getelementptr inbounds [32768 x i8], ptr %209, i64 0, i64 %215
  store ptr %216, ptr %9, align 8, !tbaa !9
  %217 = load ptr, ptr %9, align 8, !tbaa !9
  %218 = load i32, ptr %5, align 4, !tbaa !5
  %219 = sext i32 %218 to i64
  %220 = sub i64 0, %219
  %221 = getelementptr inbounds i8, ptr %217, i64 %220
  store ptr %221, ptr %8, align 8, !tbaa !9
  %222 = load ptr, ptr %11, align 8, !tbaa !9
  %223 = getelementptr inbounds %struct.LINE, ptr %222, i32 0, i32 4
  %224 = load i32, ptr %16, align 4, !tbaa !5
  %225 = sext i32 %224 to i64
  %226 = getelementptr inbounds [32768 x i8], ptr %223, i64 0, i64 %225
  store ptr %226, ptr %14, align 8, !tbaa !9
  br label %227

227:                                              ; preds = %231, %200
  %228 = load ptr, ptr %8, align 8, !tbaa !9
  %229 = load ptr, ptr %14, align 8, !tbaa !9
  %230 = icmp ugt ptr %228, %229
  br i1 %230, label %231, label %237

231:                                              ; preds = %227
  %232 = load ptr, ptr %8, align 8, !tbaa !9
  %233 = getelementptr inbounds i8, ptr %232, i32 -1
  store ptr %233, ptr %8, align 8, !tbaa !9
  %234 = load i8, ptr %233, align 1, !tbaa !19
  %235 = load ptr, ptr %9, align 8, !tbaa !9
  %236 = getelementptr inbounds i8, ptr %235, i32 -1
  store ptr %236, ptr %9, align 8, !tbaa !9
  store i8 %234, ptr %236, align 1, !tbaa !19
  br label %227, !llvm.loop !27

237:                                              ; preds = %227
  br label %238

238:                                              ; preds = %237, %199
  br label %239

239:                                              ; preds = %238, %156
  %240 = load ptr, ptr %11, align 8, !tbaa !9
  %241 = getelementptr inbounds %struct.LINE, ptr %240, i32 0, i32 4
  %242 = load i32, ptr %16, align 4, !tbaa !5
  %243 = sext i32 %242 to i64
  %244 = getelementptr inbounds [32768 x i8], ptr %241, i64 0, i64 %243
  store ptr %244, ptr %9, align 8, !tbaa !9
  store i32 0, ptr %12, align 4, !tbaa !5
  br label %245

245:                                              ; preds = %254, %239
  %246 = load i32, ptr %12, align 4, !tbaa !5
  %247 = load i32, ptr %5, align 4, !tbaa !5
  %248 = icmp slt i32 %246, %247
  br i1 %248, label %249, label %257

249:                                              ; preds = %245
  %250 = load i32, ptr %6, align 4, !tbaa !5
  %251 = trunc i32 %250 to i8
  %252 = load ptr, ptr %9, align 8, !tbaa !9
  %253 = getelementptr inbounds i8, ptr %252, i32 1
  store ptr %253, ptr %9, align 8, !tbaa !9
  store i8 %251, ptr %252, align 1, !tbaa !19
  br label %254

254:                                              ; preds = %249
  %255 = load i32, ptr %12, align 4, !tbaa !5
  %256 = add nsw i32 %255, 1
  store i32 %256, ptr %12, align 4, !tbaa !5
  br label %245, !llvm.loop !28

257:                                              ; preds = %245
  %258 = load ptr, ptr @wheadp, align 8, !tbaa !9
  store ptr %258, ptr %15, align 8, !tbaa !9
  br label %259

259:                                              ; preds = %326, %257
  %260 = load ptr, ptr %15, align 8, !tbaa !9
  %261 = icmp ne ptr %260, null
  br i1 %261, label %262, label %330

262:                                              ; preds = %259
  %263 = load ptr, ptr %15, align 8, !tbaa !9
  %264 = getelementptr inbounds %struct.WINDOW, ptr %263, i32 0, i32 2
  %265 = load ptr, ptr %264, align 8, !tbaa !29
  %266 = load ptr, ptr %10, align 8, !tbaa !9
  %267 = icmp eq ptr %265, %266
  br i1 %267, label %268, label %272

268:                                              ; preds = %262
  %269 = load ptr, ptr %11, align 8, !tbaa !9
  %270 = load ptr, ptr %15, align 8, !tbaa !9
  %271 = getelementptr inbounds %struct.WINDOW, ptr %270, i32 0, i32 2
  store ptr %269, ptr %271, align 8, !tbaa !29
  br label %272

272:                                              ; preds = %268, %262
  %273 = load ptr, ptr %15, align 8, !tbaa !9
  %274 = getelementptr inbounds %struct.WINDOW, ptr %273, i32 0, i32 3
  %275 = load ptr, ptr %274, align 8, !tbaa !11
  %276 = load ptr, ptr %10, align 8, !tbaa !9
  %277 = icmp eq ptr %275, %276
  br i1 %277, label %278, label %301

278:                                              ; preds = %272
  %279 = load ptr, ptr %11, align 8, !tbaa !9
  %280 = load ptr, ptr %15, align 8, !tbaa !9
  %281 = getelementptr inbounds %struct.WINDOW, ptr %280, i32 0, i32 3
  store ptr %279, ptr %281, align 8, !tbaa !11
  %282 = load ptr, ptr %15, align 8, !tbaa !9
  %283 = load ptr, ptr @curwp, align 8, !tbaa !9
  %284 = icmp eq ptr %282, %283
  br i1 %284, label %294, label %285

285:                                              ; preds = %278
  %286 = load i32, ptr %17, align 4, !tbaa !5
  %287 = icmp ne i32 %286, 0
  br i1 %287, label %288, label %300

288:                                              ; preds = %285
  %289 = load ptr, ptr %15, align 8, !tbaa !9
  %290 = getelementptr inbounds %struct.WINDOW, ptr %289, i32 0, i32 4
  %291 = load i32, ptr %290, align 8, !tbaa !22
  %292 = load i32, ptr %16, align 4, !tbaa !5
  %293 = icmp sgt i32 %291, %292
  br i1 %293, label %294, label %300

294:                                              ; preds = %288, %278
  %295 = load i32, ptr %5, align 4, !tbaa !5
  %296 = load ptr, ptr %15, align 8, !tbaa !9
  %297 = getelementptr inbounds %struct.WINDOW, ptr %296, i32 0, i32 4
  %298 = load i32, ptr %297, align 8, !tbaa !22
  %299 = add nsw i32 %298, %295
  store i32 %299, ptr %297, align 8, !tbaa !22
  br label %300

300:                                              ; preds = %294, %288, %285
  br label %301

301:                                              ; preds = %300, %272
  %302 = load ptr, ptr %15, align 8, !tbaa !9
  %303 = getelementptr inbounds %struct.WINDOW, ptr %302, i32 0, i32 5
  %304 = load ptr, ptr %303, align 8, !tbaa !30
  %305 = load ptr, ptr %10, align 8, !tbaa !9
  %306 = icmp eq ptr %304, %305
  br i1 %306, label %307, label %326

307:                                              ; preds = %301
  %308 = load ptr, ptr %11, align 8, !tbaa !9
  %309 = load ptr, ptr %15, align 8, !tbaa !9
  %310 = getelementptr inbounds %struct.WINDOW, ptr %309, i32 0, i32 5
  store ptr %308, ptr %310, align 8, !tbaa !30
  %311 = load i32, ptr %17, align 4, !tbaa !5
  %312 = icmp ne i32 %311, 0
  br i1 %312, label %313, label %325

313:                                              ; preds = %307
  %314 = load ptr, ptr %15, align 8, !tbaa !9
  %315 = getelementptr inbounds %struct.WINDOW, ptr %314, i32 0, i32 6
  %316 = load i32, ptr %315, align 8, !tbaa !31
  %317 = load i32, ptr %16, align 4, !tbaa !5
  %318 = icmp sgt i32 %316, %317
  br i1 %318, label %319, label %325

319:                                              ; preds = %313
  %320 = load i32, ptr %5, align 4, !tbaa !5
  %321 = load ptr, ptr %15, align 8, !tbaa !9
  %322 = getelementptr inbounds %struct.WINDOW, ptr %321, i32 0, i32 6
  %323 = load i32, ptr %322, align 8, !tbaa !31
  %324 = add nsw i32 %323, %320
  store i32 %324, ptr %322, align 8, !tbaa !31
  br label %325

325:                                              ; preds = %319, %313, %307
  br label %326

326:                                              ; preds = %325, %301
  %327 = load ptr, ptr %15, align 8, !tbaa !9
  %328 = getelementptr inbounds %struct.WINDOW, ptr %327, i32 0, i32 0
  %329 = load ptr, ptr %328, align 8, !tbaa !32
  store ptr %329, ptr %15, align 8, !tbaa !9
  br label %259, !llvm.loop !33

330:                                              ; preds = %259
  store i32 1, ptr %4, align 4
  store i32 1, ptr %19, align 4
  br label %331

331:                                              ; preds = %330, %105, %68, %36
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #3
  %332 = load i32, ptr %4, align 4
  ret i32 %332
}

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 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !10, i64 24}
!12 = !{!"WINDOW", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !6, i64 32, !10, i64 40, !6, i64 48, !6, i64 52, !6, i64 56, !6, i64 60, !6, i64 64, !6, i64 68}
!13 = !{!14, !10, i64 40}
!14 = !{!"BUFFER", !10, i64 0, !10, i64 8, !6, i64 16, !10, i64 24, !6, i64 32, !10, i64 40, !6, i64 48, !6, i64 52, !7, i64 56, !7, i64 184}
!15 = !{!16, !10, i64 8}
!16 = !{!"LINE", !10, i64 0, !10, i64 8, !17, i64 16, !17, i64 18, !7, i64 20}
!17 = !{!"short", !7, i64 0}
!18 = !{!16, !10, i64 0}
!19 = !{!7, !7, i64 0}
!20 = distinct !{!20, !21}
!21 = !{!"llvm.loop.mustprogress"}
!22 = !{!12, !6, i64 32}
!23 = !{!16, !17, i64 18}
!24 = !{!16, !17, i64 16}
!25 = distinct !{!25, !21}
!26 = distinct !{!26, !21}
!27 = distinct !{!27, !21}
!28 = distinct !{!28, !21}
!29 = !{!12, !10, i64 16}
!30 = !{!12, !10, i64 40}
!31 = !{!12, !6, i64 48}
!32 = !{!12, !10, i64 0}
!33 = distinct !{!33, !21}


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

@wheadp = external local_unnamed_addr global ptr, align 8
@curbp = external local_unnamed_addr global ptr, align 8
@curwp = external local_unnamed_addr global ptr, align 8

; Function Attrs: nounwind uwtable
declare dso_local ptr @lalloc(i32 noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local void @lchange(i32 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 2) i32 @linsert(i32 noundef %0, i32 noundef %1, i32 noundef %2) local_unnamed_addr #0 {
  %.not = icmp eq i32 %2, 0
  tail call void @lchange(i32 noundef 4)
  %4 = load ptr, ptr @curwp, align 8, !tbaa !5
  %5 = getelementptr inbounds i8, ptr %4, i64 24
  %6 = load ptr, ptr %5, align 8, !tbaa !9
  %7 = ptrtoint ptr %6 to i64
  %8 = load ptr, ptr @curbp, align 8, !tbaa !5
  %9 = getelementptr inbounds i8, ptr %8, i64 40
  %10 = load ptr, ptr %9, align 8, !tbaa !12
  %11 = icmp eq ptr %6, %10
  br i1 %11, label %12, label %26

12:                                               ; preds = %3
  %13 = tail call ptr @lalloc(i32 noundef %0)
  %14 = icmp eq ptr %13, null
  br i1 %14, label %.loopexit, label %15

15:                                               ; preds = %12
  %16 = getelementptr inbounds i8, ptr %6, i64 8
  %17 = load ptr, ptr %16, align 8, !tbaa !14
  store ptr %13, ptr %17, align 8, !tbaa !17
  store ptr %6, ptr %13, align 8, !tbaa !17
  store ptr %13, ptr %16, align 8, !tbaa !14
  %18 = getelementptr inbounds i8, ptr %13, i64 8
  store ptr %17, ptr %18, align 8, !tbaa !14
  %19 = icmp sgt i32 %0, 0
  br i1 %19, label %.lr.ph157, label %._crit_edge158

.lr.ph157:                                        ; preds = %15
  %20 = trunc i32 %1 to i8
  %21 = getelementptr inbounds i8, ptr %13, i64 20
  %22 = zext nneg i32 %0 to i64
  tail call void @llvm.memset.p0.i64(ptr nonnull align 1 %21, i8 %20, i64 %22, i1 false), !tbaa !18
  br label %._crit_edge158

._crit_edge158:                                   ; preds = %.lr.ph157, %15
  %23 = load ptr, ptr @curwp, align 8, !tbaa !5
  %24 = getelementptr inbounds i8, ptr %23, i64 24
  store ptr %13, ptr %24, align 8, !tbaa !9
  %25 = getelementptr inbounds i8, ptr %23, i64 32
  store i32 %0, ptr %25, align 8, !tbaa !19
  br label %.loopexit

26:                                               ; preds = %3
  %27 = getelementptr inbounds i8, ptr %4, i64 32
  %28 = load i32, ptr %27, align 8, !tbaa !19
  br i1 %.not, label %29, label %.thread

29:                                               ; preds = %26
  %30 = getelementptr inbounds i8, ptr %6, i64 18
  %31 = load i16, ptr %30, align 2, !tbaa !20
  %32 = zext i16 %31 to i32
  %.0 = add nsw i32 %32, %0
  %33 = getelementptr inbounds i8, ptr %6, i64 16
  %34 = load i16, ptr %33, align 8, !tbaa !21
  %35 = zext i16 %34 to i32
  %36 = icmp sgt i32 %.0, %35
  br i1 %36, label %41, label %96

.thread:                                          ; preds = %26
  %.0125 = add nsw i32 %28, %0
  %37 = getelementptr inbounds i8, ptr %6, i64 16
  %38 = load i16, ptr %37, align 8, !tbaa !21
  %39 = zext i16 %38 to i32
  %40 = icmp sgt i32 %.0125, %39
  br i1 %40, label %41, label %.thread127

41:                                               ; preds = %.thread, %29
  %.0126 = phi i32 [ %.0125, %.thread ], [ %.0, %29 ]
  %42 = tail call ptr @lalloc(i32 noundef %.0126)
  %43 = ptrtoint ptr %42 to i64
  %44 = icmp eq ptr %42, null
  br i1 %44, label %.loopexit, label %45

45:                                               ; preds = %41
  %.ptr = getelementptr i8, ptr %6, i64 20
  %46 = getelementptr i8, ptr %42, i64 20
  %47 = sext i32 %28 to i64
  %48 = getelementptr i8, ptr %6, i64 %47
  %.ptr159 = getelementptr i8, ptr %48, i64 20
  %49 = icmp sgt i32 %28, 0
  br i1 %49, label %.lr.ph138.preheader, label %._crit_edge

.lr.ph138.preheader:                              ; preds = %45
  %50 = add i64 %7, %47
  %51 = add i64 %50, 20
  %52 = add i64 %7, 21
  %umax = tail call i64 @llvm.umax.i64(i64 %51, i64 %52)
  %53 = add i64 %umax, -20
  %54 = sub i64 %53, %7
  %min.iters.check192 = icmp ult i64 %54, 32
  %55 = sub i64 %43, %7
  %diff.check190 = icmp ult i64 %55, 32
  %or.cond = or i1 %min.iters.check192, %diff.check190
  br i1 %or.cond, label %.lr.ph138.preheader258, label %vector.ph193

vector.ph193:                                     ; preds = %.lr.ph138.preheader
  %n.vec195 = and i64 %54, -32
  %ind.end196 = getelementptr i8, ptr %.ptr, i64 %n.vec195
  %ind.end198 = getelementptr i8, ptr %46, i64 %n.vec195
  br label %vector.body200

vector.body200:                                   ; preds = %vector.body200, %vector.ph193
  %index201 = phi i64 [ 0, %vector.ph193 ], [ %index.next208, %vector.body200 ]
  %next.gep202 = getelementptr i8, ptr %.ptr, i64 %index201
  %next.gep204 = getelementptr i8, ptr %46, i64 %index201
  %56 = getelementptr i8, ptr %next.gep202, i64 16
  %wide.load206 = load <16 x i8>, ptr %next.gep202, align 1, !tbaa !18
  %wide.load207 = load <16 x i8>, ptr %56, align 1, !tbaa !18
  %57 = getelementptr i8, ptr %next.gep204, i64 16
  store <16 x i8> %wide.load206, ptr %next.gep204, align 1, !tbaa !18
  store <16 x i8> %wide.load207, ptr %57, align 1, !tbaa !18
  %index.next208 = add nuw i64 %index201, 32
  %58 = icmp eq i64 %index.next208, %n.vec195
  br i1 %58, label %middle.block191, label %vector.body200, !llvm.loop !22

middle.block191:                                  ; preds = %vector.body200
  %cmp.n209 = icmp eq i64 %54, %n.vec195
  br i1 %cmp.n209, label %._crit_edge, label %.lr.ph138.preheader258

.lr.ph138.preheader258:                           ; preds = %middle.block191, %.lr.ph138.preheader
  %.0107137.ph = phi ptr [ %.ptr, %.lr.ph138.preheader ], [ %ind.end196, %middle.block191 ]
  %.0109136.ph = phi ptr [ %46, %.lr.ph138.preheader ], [ %ind.end198, %middle.block191 ]
  br label %.lr.ph138

.lr.ph138:                                        ; preds = %.lr.ph138.preheader258, %.lr.ph138
  %.0107137 = phi ptr [ %59, %.lr.ph138 ], [ %.0107137.ph, %.lr.ph138.preheader258 ]
  %.0109136 = phi ptr [ %61, %.lr.ph138 ], [ %.0109136.ph, %.lr.ph138.preheader258 ]
  %59 = getelementptr inbounds i8, ptr %.0107137, i64 1
  %60 = load i8, ptr %.0107137, align 1, !tbaa !18
  %61 = getelementptr inbounds i8, ptr %.0109136, i64 1
  store i8 %60, ptr %.0109136, align 1, !tbaa !18
  %62 = icmp ult ptr %59, %.ptr159
  br i1 %62, label %.lr.ph138, label %._crit_edge, !llvm.loop !26

._crit_edge:                                      ; preds = %.lr.ph138, %middle.block191, %45
  %.0109.lcssa = phi ptr [ %46, %45 ], [ %ind.end198, %middle.block191 ], [ %61, %.lr.ph138 ]
  %.0107.lcssa = phi ptr [ %.ptr, %45 ], [ %ind.end196, %middle.block191 ], [ %59, %.lr.ph138 ]
  %.0107.lcssa214 = ptrtoint ptr %.0107.lcssa to i64
  %.0109.lcssa211 = ptrtoint ptr %.0109.lcssa to i64
  %.0107.lcssa212 = ptrtoint ptr %.0107.lcssa to i64
  br i1 %.not, label %63, label %.loopexit132

63:                                               ; preds = %._crit_edge
  %64 = getelementptr inbounds i8, ptr %6, i64 18
  %65 = load i16, ptr %64, align 2, !tbaa !20
  %66 = zext i16 %65 to i64
  %67 = getelementptr inbounds [32768 x i8], ptr %.ptr, i64 0, i64 %66
  %68 = icmp ult ptr %.0107.lcssa, %67
  br i1 %68, label %iter.check219, label %.loopexit132

iter.check219:                                    ; preds = %63
  %69 = sext i32 %0 to i64
  %70 = getelementptr i8, ptr %.0109.lcssa, i64 %69
  %71 = add i64 %7, %66
  %72 = add i64 %71, 20
  %73 = sub i64 %72, %.0107.lcssa214
  %min.iters.check217 = icmp ult i64 %73, 8
  br i1 %min.iters.check217, label %.lr.ph143.preheader, label %vector.memcheck210

vector.memcheck210:                               ; preds = %iter.check219
  %74 = add i64 %.0109.lcssa211, %69
  %75 = sub i64 %74, %.0107.lcssa212
  %diff.check213 = icmp ult i64 %75, 32
  br i1 %diff.check213, label %.lr.ph143.preheader, label %vector.main.loop.iter.check221

vector.main.loop.iter.check221:                   ; preds = %vector.memcheck210
  %min.iters.check220 = icmp ult i64 %73, 32
  br i1 %min.iters.check220, label %vec.epilog.ph237, label %vector.ph222

vector.ph222:                                     ; preds = %vector.main.loop.iter.check221
  %n.vec224 = and i64 %73, -32
  br label %vector.body225

vector.body225:                                   ; preds = %vector.body225, %vector.ph222
  %index226 = phi i64 [ 0, %vector.ph222 ], [ %index.next233, %vector.body225 ]
  %next.gep227 = getelementptr i8, ptr %.0107.lcssa, i64 %index226
  %next.gep229 = getelementptr i8, ptr %70, i64 %index226
  %76 = getelementptr i8, ptr %next.gep227, i64 16
  %wide.load231 = load <16 x i8>, ptr %next.gep227, align 1, !tbaa !18
  %wide.load232 = load <16 x i8>, ptr %76, align 1, !tbaa !18
  %77 = getelementptr i8, ptr %next.gep229, i64 16
  store <16 x i8> %wide.load231, ptr %next.gep229, align 1, !tbaa !18
  store <16 x i8> %wide.load232, ptr %77, align 1, !tbaa !18
  %index.next233 = add nuw i64 %index226, 32
  %78 = icmp eq i64 %index.next233, %n.vec224
  br i1 %78, label %middle.block215, label %vector.body225, !llvm.loop !27

middle.block215:                                  ; preds = %vector.body225
  %cmp.n234 = icmp eq i64 %73, %n.vec224
  br i1 %cmp.n234, label %.loopexit132, label %vec.epilog.iter.check238

vec.epilog.iter.check238:                         ; preds = %middle.block215
  %ind.end248 = getelementptr i8, ptr %70, i64 %n.vec224
  %ind.end245 = getelementptr i8, ptr %.0107.lcssa, i64 %n.vec224
  %n.vec.remaining239 = and i64 %73, 24
  %min.epilog.iters.check240 = icmp eq i64 %n.vec.remaining239, 0
  br i1 %min.epilog.iters.check240, label %.lr.ph143.preheader, label %vec.epilog.ph237

vec.epilog.ph237:                                 ; preds = %vector.main.loop.iter.check221, %vec.epilog.iter.check238
  %vec.epilog.resume.val241 = phi i64 [ %n.vec224, %vec.epilog.iter.check238 ], [ 0, %vector.main.loop.iter.check221 ]
  %n.vec243 = and i64 %73, -8
  %ind.end244 = getelementptr i8, ptr %.0107.lcssa, i64 %n.vec243
  %ind.end247 = getelementptr i8, ptr %70, i64 %n.vec243
  br label %vec.epilog.vector.body250

vec.epilog.vector.body250:                        ; preds = %vec.epilog.vector.body250, %vec.epilog.ph237
  %index251 = phi i64 [ %vec.epilog.resume.val241, %vec.epilog.ph237 ], [ %index.next255, %vec.epilog.vector.body250 ]
  %next.gep252 = getelementptr i8, ptr %.0107.lcssa, i64 %index251
  %next.gep253 = getelementptr i8, ptr %70, i64 %index251
  %wide.load254 = load <8 x i8>, ptr %next.gep252, align 1, !tbaa !18
  store <8 x i8> %wide.load254, ptr %next.gep253, align 1, !tbaa !18
  %index.next255 = add nuw i64 %index251, 8
  %79 = icmp eq i64 %index.next255, %n.vec243
  br i1 %79, label %vec.epilog.middle.block235, label %vec.epilog.vector.body250, !llvm.loop !28

vec.epilog.middle.block235:                       ; preds = %vec.epilog.vector.body250
  %cmp.n256 = icmp eq i64 %73, %n.vec243
  br i1 %cmp.n256, label %.loopexit132, label %.lr.ph143.preheader

.lr.ph143.preheader:                              ; preds = %vec.epilog.middle.block235, %vector.memcheck210, %iter.check219, %vec.epilog.iter.check238
  %.1141.ph = phi ptr [ %.0107.lcssa, %iter.check219 ], [ %.0107.lcssa, %vector.memcheck210 ], [ %ind.end245, %vec.epilog.iter.check238 ], [ %ind.end244, %vec.epilog.middle.block235 ]
  %.1110140.ph = phi ptr [ %70, %iter.check219 ], [ %70, %vector.memcheck210 ], [ %ind.end248, %vec.epilog.iter.check238 ], [ %ind.end247, %vec.epilog.middle.block235 ]
  br label %.lr.ph143

.lr.ph143:                                        ; preds = %.lr.ph143.preheader, %.lr.ph143
  %.1141 = phi ptr [ %80, %.lr.ph143 ], [ %.1141.ph, %.lr.ph143.preheader ]
  %.1110140 = phi ptr [ %82, %.lr.ph143 ], [ %.1110140.ph, %.lr.ph143.preheader ]
  %80 = getelementptr inbounds i8, ptr %.1141, i64 1
  %81 = load i8, ptr %.1141, align 1, !tbaa !18
  %82 = getelementptr inbounds i8, ptr %.1110140, i64 1
  store i8 %81, ptr %.1110140, align 1, !tbaa !18
  %83 = icmp ult ptr %80, %67
  br i1 %83, label %.lr.ph143, label %.loopexit132, !llvm.loop !29

.loopexit132:                                     ; preds = %.lr.ph143, %middle.block215, %vec.epilog.middle.block235, %63, %._crit_edge
  %84 = getelementptr inbounds i8, ptr %6, i64 8
  %85 = load ptr, ptr %84, align 8, !tbaa !14
  store ptr %42, ptr %85, align 8, !tbaa !17
  %86 = load ptr, ptr %6, align 8, !tbaa !17
  store ptr %86, ptr %42, align 8, !tbaa !17
  %87 = getelementptr inbounds i8, ptr %86, i64 8
  store ptr %42, ptr %87, align 8, !tbaa !14
  %88 = load ptr, ptr %84, align 8, !tbaa !14
  %89 = getelementptr inbounds i8, ptr %42, i64 8
  store ptr %88, ptr %89, align 8, !tbaa !14
  tail call void @free(ptr noundef %6) #4
  br label %.loopexit133

.thread127:                                       ; preds = %.thread
  %90 = getelementptr inbounds i8, ptr %6, i64 18
  %91 = load i16, ptr %90, align 2, !tbaa !20
  %92 = zext i16 %91 to i32
  %93 = icmp sgt i32 %.0125, %92
  br i1 %93, label %94, label %.loopexit133

94:                                               ; preds = %.thread127
  %95 = trunc i32 %.0125 to i16
  store i16 %95, ptr %90, align 2, !tbaa !20
  br label %.loopexit133

96:                                               ; preds = %29
  %97 = trunc i32 %0 to i16
  %98 = add i16 %31, %97
  store i16 %98, ptr %30, align 2, !tbaa !20
  %99 = getelementptr inbounds i8, ptr %6, i64 20
  %100 = zext i16 %98 to i64
  %101 = getelementptr inbounds [32768 x i8], ptr %99, i64 0, i64 %100
  %102 = sext i32 %0 to i64
  %103 = sub nsw i64 0, %102
  %104 = getelementptr inbounds i8, ptr %101, i64 %103
  %105 = sext i32 %28 to i64
  %106 = getelementptr inbounds [32768 x i8], ptr %99, i64 0, i64 %105
  %107 = icmp ugt ptr %104, %106
  br i1 %107, label %iter.check, label %.loopexit133

iter.check:                                       ; preds = %96
  %108 = add nsw i64 %105, %102
  %109 = sub nsw i64 %100, %108
  %min.iters.check = icmp ult i64 %109, 4
  br i1 %min.iters.check, label %.lr.ph.preheader, label %vector.scevcheck

vector.scevcheck:                                 ; preds = %iter.check
  %110 = add nsw i64 %105, %102
  %111 = xor i64 %110, -1
  %112 = add nsw i64 %111, %100
  %113 = getelementptr i8, ptr %6, i64 %100
  %scevgep = getelementptr i8, ptr %113, i64 19
  %114 = sub nsw i64 0, %112
  %115 = getelementptr i8, ptr %scevgep, i64 %114
  %116 = icmp ugt ptr %115, %scevgep
  %117 = add nuw nsw i64 %100, 19
  %118 = sub nsw i64 %117, %102
  %scevgep165 = getelementptr i8, ptr %6, i64 %118
  %119 = sub nsw i64 0, %112
  %120 = getelementptr i8, ptr %scevgep165, i64 %119
  %121 = icmp ugt ptr %120, %scevgep165
  %122 = or i1 %116, %121
  %diff.check = icmp ult i64 %103, 16
  %or.cond257 = or i1 %122, %diff.check
  br i1 %or.cond257, label %.lr.ph.preheader, label %vector.main.loop.iter.check

vector.main.loop.iter.check:                      ; preds = %vector.scevcheck
  %min.iters.check169 = icmp ult i64 %109, 16
  br i1 %min.iters.check169, label %vec.epilog.ph, label %vector.ph

vector.ph:                                        ; preds = %vector.main.loop.iter.check
  %n.vec = and i64 %109, -16
  %invariant.gep = getelementptr i8, ptr %104, i64 -16
  %invariant.gep261 = getelementptr i8, ptr %101, i64 -16
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %offset.idx = sub i64 0, %index
  %offset.idx170 = sub i64 0, %index
  %gep = getelementptr i8, ptr %invariant.gep, i64 %offset.idx
  %wide.load = load <16 x i8>, ptr %gep, align 1, !tbaa !18
  %gep262 = getelementptr i8, ptr %invariant.gep261, i64 %offset.idx170
  store <16 x i8> %wide.load, ptr %gep262, align 1, !tbaa !18
  %index.next = add nuw i64 %index, 16
  %123 = icmp eq i64 %index.next, %n.vec
  br i1 %123, label %middle.block, label %vector.body, !llvm.loop !30

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %109, %n.vec
  br i1 %cmp.n, label %.loopexit133, label %vec.epilog.iter.check

vec.epilog.iter.check:                            ; preds = %middle.block
  %124 = sub nsw i64 0, %n.vec
  %ind.end177 = getelementptr i8, ptr %101, i64 %124
  %125 = sub nsw i64 0, %n.vec
  %ind.end175 = getelementptr i8, ptr %104, i64 %125
  %n.vec.remaining = and i64 %109, 12
  %min.epilog.iters.check = icmp eq i64 %n.vec.remaining, 0
  br i1 %min.epilog.iters.check, label %.lr.ph.preheader, label %vec.epilog.ph

vec.epilog.ph:                                    ; preds = %vector.main.loop.iter.check, %vec.epilog.iter.check
  %vec.epilog.resume.val = phi i64 [ %n.vec, %vec.epilog.iter.check ], [ 0, %vector.main.loop.iter.check ]
  %n.vec174 = and i64 %109, -4
  %126 = sub nsw i64 0, %n.vec174
  %ind.end = getelementptr i8, ptr %104, i64 %126
  %127 = sub nsw i64 0, %n.vec174
  %ind.end176 = getelementptr i8, ptr %101, i64 %127
  %invariant.gep263 = getelementptr i8, ptr %104, i64 -4
  %invariant.gep265 = getelementptr i8, ptr %101, i64 -4
  br label %vec.epilog.vector.body

vec.epilog.vector.body:                           ; preds = %vec.epilog.vector.body, %vec.epilog.ph
  %index179 = phi i64 [ %vec.epilog.resume.val, %vec.epilog.ph ], [ %index.next187, %vec.epilog.vector.body ]
  %offset.idx180 = sub i64 0, %index179
  %offset.idx182 = sub i64 0, %index179
  %gep264 = getelementptr i8, ptr %invariant.gep263, i64 %offset.idx180
  %wide.load184 = load <4 x i8>, ptr %gep264, align 1, !tbaa !18
  %gep266 = getelementptr i8, ptr %invariant.gep265, i64 %offset.idx182
  store <4 x i8> %wide.load184, ptr %gep266, align 1, !tbaa !18
  %index.next187 = add nuw i64 %index179, 4
  %128 = icmp eq i64 %index.next187, %n.vec174
  br i1 %128, label %vec.epilog.middle.block, label %vec.epilog.vector.body, !llvm.loop !31

vec.epilog.middle.block:                          ; preds = %vec.epilog.vector.body
  %cmp.n188 = icmp eq i64 %109, %n.vec174
  br i1 %cmp.n188, label %.loopexit133, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %vec.epilog.middle.block, %vector.scevcheck, %iter.check, %vec.epilog.iter.check
  %.2135.ph = phi ptr [ %104, %iter.check ], [ %104, %vector.scevcheck ], [ %ind.end175, %vec.epilog.iter.check ], [ %ind.end, %vec.epilog.middle.block ]
  %.2111134.ph = phi ptr [ %101, %iter.check ], [ %101, %vector.scevcheck ], [ %ind.end177, %vec.epilog.iter.check ], [ %ind.end176, %vec.epilog.middle.block ]
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %.2135 = phi ptr [ %129, %.lr.ph ], [ %.2135.ph, %.lr.ph.preheader ]
  %.2111134 = phi ptr [ %131, %.lr.ph ], [ %.2111134.ph, %.lr.ph.preheader ]
  %129 = getelementptr inbounds i8, ptr %.2135, i64 -1
  %130 = load i8, ptr %129, align 1, !tbaa !18
  %131 = getelementptr inbounds i8, ptr %.2111134, i64 -1
  store i8 %130, ptr %131, align 1, !tbaa !18
  %132 = icmp ugt ptr %129, %106
  br i1 %132, label %.lr.ph, label %.loopexit133, !llvm.loop !32

.loopexit133:                                     ; preds = %.lr.ph, %middle.block, %vec.epilog.middle.block, %96, %94, %.thread127, %.loopexit132
  %.0114 = phi ptr [ %42, %.loopexit132 ], [ %6, %94 ], [ %6, %.thread127 ], [ %6, %96 ], [ %6, %vec.epilog.middle.block ], [ %6, %middle.block ], [ %6, %.lr.ph ]
  %133 = icmp sgt i32 %0, 0
  br i1 %133, label %.lr.ph147, label %.preheader

.lr.ph147:                                        ; preds = %.loopexit133
  %134 = getelementptr i8, ptr %.0114, i64 20
  %135 = sext i32 %28 to i64
  %136 = getelementptr [32768 x i8], ptr %134, i64 0, i64 %135
  %137 = trunc i32 %1 to i8
  %138 = zext nneg i32 %0 to i64
  tail call void @llvm.memset.p0.i64(ptr align 1 %136, i8 %137, i64 %138, i1 false), !tbaa !18
  br label %.preheader

.preheader:                                       ; preds = %.lr.ph147, %.loopexit133
  %.0108148 = load ptr, ptr @wheadp, align 8, !tbaa !5
  %.not123149 = icmp eq ptr %.0108148, null
  br i1 %.not123149, label %.loopexit, label %.lr.ph154

.lr.ph154:                                        ; preds = %.preheader
  %139 = load ptr, ptr @curwp, align 8
  br label %140

140:                                              ; preds = %.lr.ph154, %177
  %.0108150 = phi ptr [ %.0108148, %.lr.ph154 ], [ %.0108, %177 ]
  %141 = getelementptr inbounds i8, ptr %.0108150, i64 16
  %142 = load ptr, ptr %141, align 8, !tbaa !33
  %143 = icmp eq ptr %142, %6
  br i1 %143, label %144, label %145

144:                                              ; preds = %140
  store ptr %.0114, ptr %141, align 8, !tbaa !33
  br label %145

145:                                              ; preds = %144, %140
  %146 = getelementptr inbounds i8, ptr %.0108150, i64 24
  %147 = load ptr, ptr %146, align 8, !tbaa !9
  %148 = icmp eq ptr %147, %6
  br i1 %148, label %149, label %160

149:                                              ; preds = %145
  store ptr %.0114, ptr %146, align 8, !tbaa !9
  %150 = icmp eq ptr %.0108150, %139
  br i1 %150, label %._crit_edge162, label %151

._crit_edge162:                                   ; preds = %149
  %.phi.trans.insert = getelementptr inbounds i8, ptr %.0108150, i64 32
  %.pre = load i32, ptr %.phi.trans.insert, align 8, !tbaa !19
  br label %156

151:                                              ; preds = %149
  br i1 %.not, label %152, label %.thread128

152:                                              ; preds = %151
  %153 = getelementptr inbounds i8, ptr %.0108150, i64 32
  %154 = load i32, ptr %153, align 8, !tbaa !19
  %155 = icmp sgt i32 %154, %28
  br i1 %155, label %156, label %.thread130

156:                                              ; preds = %._crit_edge162, %152
  %157 = phi i32 [ %.pre, %._crit_edge162 ], [ %154, %152 ]
  %158 = getelementptr inbounds i8, ptr %.0108150, i64 32
  %159 = add nsw i32 %157, %0
  store i32 %159, ptr %158, align 8, !tbaa !19
  br label %160

160:                                              ; preds = %156, %145
  %161 = getelementptr inbounds i8, ptr %.0108150, i64 40
  %162 = load ptr, ptr %161, align 8, !tbaa !34
  %163 = icmp eq ptr %162, %6
  br i1 %163, label %170, label %177

.thread130:                                       ; preds = %152
  %164 = getelementptr inbounds i8, ptr %.0108150, i64 40
  %165 = load ptr, ptr %164, align 8, !tbaa !34
  %166 = icmp eq ptr %165, %6
  br i1 %166, label %.thread131, label %177

.thread131:                                       ; preds = %.thread130
  store ptr %.0114, ptr %164, align 8, !tbaa !34
  br label %171

.thread128:                                       ; preds = %151
  %167 = getelementptr inbounds i8, ptr %.0108150, i64 40
  %168 = load ptr, ptr %167, align 8, !tbaa !34
  %169 = icmp eq ptr %168, %6
  br i1 %169, label %.thread129, label %177

.thread129:                                       ; preds = %.thread128
  store ptr %.0114, ptr %167, align 8, !tbaa !34
  br label %177

170:                                              ; preds = %160
  store ptr %.0114, ptr %161, align 8, !tbaa !34
  br i1 %.not, label %171, label %177

171:                                              ; preds = %.thread131, %170
  %172 = getelementptr inbounds i8, ptr %.0108150, i64 48
  %173 = load i32, ptr %172, align 8, !tbaa !35
  %174 = icmp sgt i32 %173, %28
  br i1 %174, label %175, label %177

175:                                              ; preds = %171
  %176 = add nsw i32 %173, %0
  store i32 %176, ptr %172, align 8, !tbaa !35
  br label %177

177:                                              ; preds = %.thread130, %.thread129, %.thread128, %170, %171, %175, %160
  %.0108 = load ptr, ptr %.0108150, align 8, !tbaa !5
  %.not123 = icmp eq ptr %.0108, null
  br i1 %.not123, label %.loopexit, label %140, !llvm.loop !36

.loopexit:                                        ; preds = %177, %.preheader, %41, %12, %._crit_edge158
  %.0106 = phi i32 [ 1, %._crit_edge158 ], [ 0, %12 ], [ 0, %41 ], [ 1, %.preheader ], [ 1, %177 ]
  ret i32 %.0106
}

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.umax.i64(i64, i64) #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 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 = { nocallback nofree nounwind willreturn memory(argmem: write) }
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, !6, i64 24}
!10 = !{!"WINDOW", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !11, i64 32, !6, i64 40, !11, i64 48, !11, i64 52, !11, i64 56, !11, i64 60, !11, i64 64, !11, i64 68}
!11 = !{!"int", !7, i64 0}
!12 = !{!13, !6, i64 40}
!13 = !{!"BUFFER", !6, i64 0, !6, i64 8, !11, i64 16, !6, i64 24, !11, i64 32, !6, i64 40, !11, i64 48, !11, i64 52, !7, i64 56, !7, i64 184}
!14 = !{!15, !6, i64 8}
!15 = !{!"LINE", !6, i64 0, !6, i64 8, !16, i64 16, !16, i64 18, !7, i64 20}
!16 = !{!"short", !7, i64 0}
!17 = !{!15, !6, i64 0}
!18 = !{!7, !7, i64 0}
!19 = !{!10, !11, i64 32}
!20 = !{!15, !16, i64 18}
!21 = !{!15, !16, i64 16}
!22 = distinct !{!22, !23, !24, !25}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!"llvm.loop.isvectorized", i32 1}
!25 = !{!"llvm.loop.unroll.runtime.disable"}
!26 = distinct !{!26, !23, !24}
!27 = distinct !{!27, !23, !24, !25}
!28 = distinct !{!28, !23, !24, !25}
!29 = distinct !{!29, !23, !24}
!30 = distinct !{!30, !23, !24, !25}
!31 = distinct !{!31, !23, !24, !25}
!32 = distinct !{!32, !23, !24}
!33 = !{!10, !6, i64 16}
!34 = !{!10, !6, i64 40}
!35 = !{!10, !11, i64 48}
!36 = distinct !{!36, !23}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalDCEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopIdiomRecognizePass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,SROAPass,SimplifyCFGPass,TailCallElimPass