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

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

@sgarbf = external dso_local global i32, align 4
@mpresf = external dso_local global i32, align 4
@visible = external dso_local global i32, align 4
@vscreen = external dso_local global ptr, align 8
@pscreen = external dso_local global ptr, align 8
@term = external global %struct.TERM, align 8
@tabsize = external global i32, align 4
@playback = external global i32, align 4
@.str.5 = external hidden unnamed_addr constant [26 x i8], align 1
@curwp = external global ptr, align 8
@curcol = external global i32, align 4
@wheadp = external global ptr, align 8
@blistp = external global ptr, align 8
@bhelpp = external global ptr, align 8
@currow = external global i32, align 4

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

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

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

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

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

18:                                               ; preds = %1
  %19 = load i32, ptr %2, align 4, !tbaa !5
  %20 = icmp ne i32 %19, 0
  br i1 %20, label %21, label %22

21:                                               ; preds = %18
  call void (ptr, ...) @mlwrite(ptr noundef @.str.5)
  br label %23

22:                                               ; preds = %18
  store i32 1, ptr %15, align 4
  br label %567

23:                                               ; preds = %21
  br label %24

24:                                               ; preds = %23, %1
  %25 = load ptr, ptr @curwp, align 8, !tbaa !9
  store ptr %25, ptr %4, align 8, !tbaa !9
  %26 = load ptr, ptr %4, align 8, !tbaa !9
  %27 = getelementptr inbounds %struct.WINDOW, ptr %26, i32 0, i32 2
  %28 = load ptr, ptr %27, align 8, !tbaa !11
  store ptr %28, ptr %3, align 8, !tbaa !9
  br label %29

29:                                               ; preds = %35, %24
  %30 = load ptr, ptr %3, align 8, !tbaa !9
  %31 = load ptr, ptr %4, align 8, !tbaa !9
  %32 = getelementptr inbounds %struct.WINDOW, ptr %31, i32 0, i32 3
  %33 = load ptr, ptr %32, align 8, !tbaa !13
  %34 = icmp ne ptr %30, %33
  br i1 %34, label %35, label %39

35:                                               ; preds = %29
  %36 = load ptr, ptr %3, align 8, !tbaa !9
  %37 = getelementptr inbounds %struct.LINE, ptr %36, i32 0, i32 0
  %38 = load ptr, ptr %37, align 8, !tbaa !14
  store ptr %38, ptr %3, align 8, !tbaa !9
  br label %29, !llvm.loop !17

39:                                               ; preds = %29
  store i32 0, ptr @curcol, align 4, !tbaa !5
  store i32 0, ptr %8, align 4, !tbaa !5
  br label %40

40:                                               ; preds = %77, %39
  %41 = load i32, ptr %8, align 4, !tbaa !5
  %42 = load ptr, ptr %4, align 8, !tbaa !9
  %43 = getelementptr inbounds %struct.WINDOW, ptr %42, i32 0, i32 4
  %44 = load i32, ptr %43, align 8, !tbaa !19
  %45 = icmp slt i32 %41, %44
  br i1 %45, label %46, label %80

46:                                               ; preds = %40
  %47 = load ptr, ptr %3, align 8, !tbaa !9
  %48 = getelementptr inbounds %struct.LINE, ptr %47, i32 0, i32 4
  %49 = load i32, ptr %8, align 4, !tbaa !5
  %50 = add nsw i32 %49, 1
  store i32 %50, ptr %8, align 4, !tbaa !5
  %51 = sext i32 %49 to i64
  %52 = getelementptr inbounds [32768 x i8], ptr %48, i64 0, i64 %51
  %53 = load i8, ptr %52, align 1, !tbaa !20
  %54 = sext i8 %53 to i32
  %55 = and i32 %54, 255
  store i32 %55, ptr %6, align 4, !tbaa !5
  %56 = load i32, ptr %6, align 4, !tbaa !5
  %57 = icmp eq i32 %56, 9
  br i1 %57, label %58, label %67

58:                                               ; preds = %46
  %59 = load i32, ptr @tabsize, align 4, !tbaa !5
  %60 = load i32, ptr @curcol, align 4, !tbaa !5
  %61 = load i32, ptr @tabsize, align 4, !tbaa !5
  %62 = srem i32 %60, %61
  %63 = sub nsw i32 %59, %62
  %64 = sub nsw i32 %63, 1
  %65 = load i32, ptr @curcol, align 4, !tbaa !5
  %66 = add nsw i32 %65, %64
  store i32 %66, ptr @curcol, align 4, !tbaa !5
  br label %77

67:                                               ; preds = %46
  %68 = load i32, ptr %6, align 4, !tbaa !5
  %69 = icmp slt i32 %68, 32
  br i1 %69, label %73, label %70

70:                                               ; preds = %67
  %71 = load i32, ptr %6, align 4, !tbaa !5
  %72 = icmp eq i32 %71, 127
  br i1 %72, label %73, label %76

73:                                               ; preds = %70, %67
  %74 = load i32, ptr @curcol, align 4, !tbaa !5
  %75 = add nsw i32 %74, 1
  store i32 %75, ptr @curcol, align 4, !tbaa !5
  br label %76

76:                                               ; preds = %73, %70
  br label %77

77:                                               ; preds = %76, %58
  %78 = load i32, ptr @curcol, align 4, !tbaa !5
  %79 = add nsw i32 %78, 1
  store i32 %79, ptr @curcol, align 4, !tbaa !5
  br label %40, !llvm.loop !21

80:                                               ; preds = %40
  store i32 0, ptr %11, align 4, !tbaa !5
  %81 = load ptr, ptr %4, align 8, !tbaa !9
  %82 = getelementptr inbounds %struct.WINDOW, ptr %81, i32 0, i32 9
  %83 = load i32, ptr %82, align 4, !tbaa !22
  store i32 %83, ptr %12, align 4, !tbaa !5
  %84 = load i32, ptr %12, align 4, !tbaa !5
  %85 = load i32, ptr @curcol, align 4, !tbaa !5
  %86 = sub nsw i32 %85, %84
  store i32 %86, ptr @curcol, align 4, !tbaa !5
  %87 = load i32, ptr getelementptr inbounds (%struct.TERM, ptr @term, i32 0, i32 1), align 4, !tbaa !23
  %88 = sdiv i32 %87, 2
  store i32 %88, ptr %10, align 4, !tbaa !5
  br label %89

89:                                               ; preds = %98, %80
  %90 = load i32, ptr @curcol, align 4, !tbaa !5
  %91 = load i32, ptr getelementptr inbounds (%struct.TERM, ptr @term, i32 0, i32 1), align 4, !tbaa !23
  %92 = load i32, ptr %12, align 4, !tbaa !5
  %93 = icmp ne i32 %92, 0
  %94 = zext i1 %93 to i64
  %95 = select i1 %93, i32 2, i32 1
  %96 = sub nsw i32 %91, %95
  %97 = icmp sge i32 %90, %96
  br i1 %97, label %98, label %105

98:                                               ; preds = %89
  %99 = load i32, ptr %10, align 4, !tbaa !5
  %100 = load i32, ptr %12, align 4, !tbaa !5
  %101 = add nsw i32 %100, %99
  store i32 %101, ptr %12, align 4, !tbaa !5
  %102 = load i32, ptr %10, align 4, !tbaa !5
  %103 = load i32, ptr @curcol, align 4, !tbaa !5
  %104 = sub nsw i32 %103, %102
  store i32 %104, ptr @curcol, align 4, !tbaa !5
  store i32 1, ptr %11, align 4, !tbaa !5
  br label %89, !llvm.loop !25

105:                                              ; preds = %89
  br label %106

106:                                              ; preds = %109, %105
  %107 = load i32, ptr @curcol, align 4, !tbaa !5
  %108 = icmp slt i32 %107, 0
  br i1 %108, label %109, label %116

109:                                              ; preds = %106
  %110 = load i32, ptr %10, align 4, !tbaa !5
  %111 = load i32, ptr %12, align 4, !tbaa !5
  %112 = sub nsw i32 %111, %110
  store i32 %112, ptr %12, align 4, !tbaa !5
  %113 = load i32, ptr %10, align 4, !tbaa !5
  %114 = load i32, ptr @curcol, align 4, !tbaa !5
  %115 = add nsw i32 %114, %113
  store i32 %115, ptr @curcol, align 4, !tbaa !5
  store i32 1, ptr %11, align 4, !tbaa !5
  br label %106, !llvm.loop !26

116:                                              ; preds = %106
  %117 = load i32, ptr %11, align 4, !tbaa !5
  %118 = icmp ne i32 %117, 0
  br i1 %118, label %119, label %127

119:                                              ; preds = %116
  %120 = load i32, ptr %12, align 4, !tbaa !5
  %121 = load ptr, ptr %4, align 8, !tbaa !9
  %122 = getelementptr inbounds %struct.WINDOW, ptr %121, i32 0, i32 9
  store i32 %120, ptr %122, align 4, !tbaa !22
  %123 = load ptr, ptr %4, align 8, !tbaa !9
  %124 = getelementptr inbounds %struct.WINDOW, ptr %123, i32 0, i32 11
  %125 = load i32, ptr %124, align 4, !tbaa !27
  %126 = or i32 %125, 8
  store i32 %126, ptr %124, align 4, !tbaa !27
  br label %127

127:                                              ; preds = %119, %116
  %128 = load i32, ptr %12, align 4, !tbaa !5
  %129 = icmp ne i32 %128, 0
  br i1 %129, label %130, label %133

130:                                              ; preds = %127
  %131 = load i32, ptr @curcol, align 4, !tbaa !5
  %132 = add nsw i32 %131, 1
  store i32 %132, ptr @curcol, align 4, !tbaa !5
  br label %133

133:                                              ; preds = %130, %127
  %134 = load ptr, ptr @wheadp, align 8, !tbaa !9
  store ptr %134, ptr %4, align 8, !tbaa !9
  br label %135

135:                                              ; preds = %456, %133
  %136 = load ptr, ptr %4, align 8, !tbaa !9
  %137 = icmp ne ptr %136, null
  br i1 %137, label %138, label %460

138:                                              ; preds = %135
  %139 = load i32, ptr @visible, align 4, !tbaa !5
  store i32 %139, ptr %7, align 4, !tbaa !5
  %140 = load ptr, ptr %4, align 8, !tbaa !9
  %141 = getelementptr inbounds %struct.WINDOW, ptr %140, i32 0, i32 1
  %142 = load ptr, ptr %141, align 8, !tbaa !28
  store ptr %142, ptr %14, align 8, !tbaa !9
  %143 = load ptr, ptr %14, align 8, !tbaa !9
  %144 = load ptr, ptr @blistp, align 8, !tbaa !9
  %145 = icmp eq ptr %143, %144
  br i1 %145, label %150, label %146

146:                                              ; preds = %138
  %147 = load ptr, ptr %14, align 8, !tbaa !9
  %148 = load ptr, ptr @bhelpp, align 8, !tbaa !9
  %149 = icmp eq ptr %147, %148
  br i1 %149, label %150, label %151

150:                                              ; preds = %146, %138
  store i32 0, ptr %7, align 4, !tbaa !5
  br label %151

151:                                              ; preds = %150, %146
  %152 = load i32, ptr @sgarbf, align 4, !tbaa !5
  %153 = icmp ne i32 %152, 0
  br i1 %153, label %154, label %159

154:                                              ; preds = %151
  %155 = load ptr, ptr %4, align 8, !tbaa !9
  %156 = getelementptr inbounds %struct.WINDOW, ptr %155, i32 0, i32 11
  %157 = load i32, ptr %156, align 4, !tbaa !27
  %158 = or i32 %157, 8
  store i32 %158, ptr %156, align 4, !tbaa !27
  br label %159

159:                                              ; preds = %154, %151
  %160 = load ptr, ptr %4, align 8, !tbaa !9
  %161 = getelementptr inbounds %struct.WINDOW, ptr %160, i32 0, i32 11
  %162 = load i32, ptr %161, align 4, !tbaa !27
  %163 = icmp ne i32 %162, 0
  br i1 %163, label %164, label %456

164:                                              ; preds = %159
  %165 = load ptr, ptr %4, align 8, !tbaa !9
  %166 = getelementptr inbounds %struct.WINDOW, ptr %165, i32 0, i32 11
  %167 = load i32, ptr %166, align 4, !tbaa !27
  %168 = and i32 %167, 1
  %169 = icmp eq i32 %168, 0
  br i1 %169, label %170, label %204

170:                                              ; preds = %164
  %171 = load ptr, ptr %4, align 8, !tbaa !9
  %172 = getelementptr inbounds %struct.WINDOW, ptr %171, i32 0, i32 2
  %173 = load ptr, ptr %172, align 8, !tbaa !11
  store ptr %173, ptr %3, align 8, !tbaa !9
  store i32 0, ptr %8, align 4, !tbaa !5
  br label %174

174:                                              ; preds = %200, %170
  %175 = load i32, ptr %8, align 4, !tbaa !5
  %176 = load ptr, ptr %4, align 8, !tbaa !9
  %177 = getelementptr inbounds %struct.WINDOW, ptr %176, i32 0, i32 8
  %178 = load i32, ptr %177, align 8, !tbaa !29
  %179 = icmp slt i32 %175, %178
  br i1 %179, label %180, label %203

180:                                              ; preds = %174
  %181 = load ptr, ptr %3, align 8, !tbaa !9
  %182 = load ptr, ptr %4, align 8, !tbaa !9
  %183 = getelementptr inbounds %struct.WINDOW, ptr %182, i32 0, i32 3
  %184 = load ptr, ptr %183, align 8, !tbaa !13
  %185 = icmp eq ptr %181, %184
  br i1 %185, label %186, label %187

186:                                              ; preds = %180
  br label %275

187:                                              ; preds = %180
  %188 = load ptr, ptr %3, align 8, !tbaa !9
  %189 = load ptr, ptr %4, align 8, !tbaa !9
  %190 = getelementptr inbounds %struct.WINDOW, ptr %189, i32 0, i32 1
  %191 = load ptr, ptr %190, align 8, !tbaa !28
  %192 = getelementptr inbounds %struct.BUFFER, ptr %191, i32 0, i32 5
  %193 = load ptr, ptr %192, align 8, !tbaa !30
  %194 = icmp eq ptr %188, %193
  br i1 %194, label %195, label %196

195:                                              ; preds = %187
  br label %203

196:                                              ; preds = %187
  %197 = load ptr, ptr %3, align 8, !tbaa !9
  %198 = getelementptr inbounds %struct.LINE, ptr %197, i32 0, i32 0
  %199 = load ptr, ptr %198, align 8, !tbaa !14
  store ptr %199, ptr %3, align 8, !tbaa !9
  br label %200

200:                                              ; preds = %196
  %201 = load i32, ptr %8, align 4, !tbaa !5
  %202 = add nsw i32 %201, 1
  store i32 %202, ptr %8, align 4, !tbaa !5
  br label %174, !llvm.loop !32

203:                                              ; preds = %195, %174
  br label %204

204:                                              ; preds = %203, %164
  %205 = load ptr, ptr %4, align 8, !tbaa !9
  %206 = getelementptr inbounds %struct.WINDOW, ptr %205, i32 0, i32 10
  %207 = load i32, ptr %206, align 8, !tbaa !33
  store i32 %207, ptr %8, align 4, !tbaa !5
  %208 = load i32, ptr %8, align 4, !tbaa !5
  %209 = icmp sgt i32 %208, 0
  br i1 %209, label %210, label %223

210:                                              ; preds = %204
  %211 = load i32, ptr %8, align 4, !tbaa !5
  %212 = load ptr, ptr %4, align 8, !tbaa !9
  %213 = getelementptr inbounds %struct.WINDOW, ptr %212, i32 0, i32 8
  %214 = load i32, ptr %213, align 8, !tbaa !29
  %215 = icmp sgt i32 %211, %214
  br i1 %215, label %216, label %220

216:                                              ; preds = %210
  %217 = load ptr, ptr %4, align 8, !tbaa !9
  %218 = getelementptr inbounds %struct.WINDOW, ptr %217, i32 0, i32 8
  %219 = load i32, ptr %218, align 8, !tbaa !29
  store i32 %219, ptr %8, align 4, !tbaa !5
  br label %220

220:                                              ; preds = %216, %210
  %221 = load i32, ptr %8, align 4, !tbaa !5
  %222 = add nsw i32 %221, -1
  store i32 %222, ptr %8, align 4, !tbaa !5
  br label %242

223:                                              ; preds = %204
  %224 = load i32, ptr %8, align 4, !tbaa !5
  %225 = icmp slt i32 %224, 0
  br i1 %225, label %226, label %236

226:                                              ; preds = %223
  %227 = load ptr, ptr %4, align 8, !tbaa !9
  %228 = getelementptr inbounds %struct.WINDOW, ptr %227, i32 0, i32 8
  %229 = load i32, ptr %228, align 8, !tbaa !29
  %230 = load i32, ptr %8, align 4, !tbaa !5
  %231 = add nsw i32 %230, %229
  store i32 %231, ptr %8, align 4, !tbaa !5
  %232 = load i32, ptr %8, align 4, !tbaa !5
  %233 = icmp slt i32 %232, 0
  br i1 %233, label %234, label %235

234:                                              ; preds = %226
  store i32 0, ptr %8, align 4, !tbaa !5
  br label %235

235:                                              ; preds = %234, %226
  br label %241

236:                                              ; preds = %223
  %237 = load ptr, ptr %4, align 8, !tbaa !9
  %238 = getelementptr inbounds %struct.WINDOW, ptr %237, i32 0, i32 8
  %239 = load i32, ptr %238, align 8, !tbaa !29
  %240 = sdiv i32 %239, 2
  store i32 %240, ptr %8, align 4, !tbaa !5
  br label %241

241:                                              ; preds = %236, %235
  br label %242

242:                                              ; preds = %241, %220
  %243 = load ptr, ptr %4, align 8, !tbaa !9
  %244 = getelementptr inbounds %struct.WINDOW, ptr %243, i32 0, i32 3
  %245 = load ptr, ptr %244, align 8, !tbaa !13
  store ptr %245, ptr %3, align 8, !tbaa !9
  br label %246

246:                                              ; preds = %261, %242
  %247 = load i32, ptr %8, align 4, !tbaa !5
  %248 = icmp ne i32 %247, 0
  br i1 %248, label %249, label %259

249:                                              ; preds = %246
  %250 = load ptr, ptr %3, align 8, !tbaa !9
  %251 = getelementptr inbounds %struct.LINE, ptr %250, i32 0, i32 1
  %252 = load ptr, ptr %251, align 8, !tbaa !34
  %253 = load ptr, ptr %4, align 8, !tbaa !9
  %254 = getelementptr inbounds %struct.WINDOW, ptr %253, i32 0, i32 1
  %255 = load ptr, ptr %254, align 8, !tbaa !28
  %256 = getelementptr inbounds %struct.BUFFER, ptr %255, i32 0, i32 5
  %257 = load ptr, ptr %256, align 8, !tbaa !30
  %258 = icmp ne ptr %252, %257
  br label %259

259:                                              ; preds = %249, %246
  %260 = phi i1 [ false, %246 ], [ %258, %249 ]
  br i1 %260, label %261, label %267

261:                                              ; preds = %259
  %262 = load i32, ptr %8, align 4, !tbaa !5
  %263 = add nsw i32 %262, -1
  store i32 %263, ptr %8, align 4, !tbaa !5
  %264 = load ptr, ptr %3, align 8, !tbaa !9
  %265 = getelementptr inbounds %struct.LINE, ptr %264, i32 0, i32 1
  %266 = load ptr, ptr %265, align 8, !tbaa !34
  store ptr %266, ptr %3, align 8, !tbaa !9
  br label %246, !llvm.loop !35

267:                                              ; preds = %259
  %268 = load ptr, ptr %3, align 8, !tbaa !9
  %269 = load ptr, ptr %4, align 8, !tbaa !9
  %270 = getelementptr inbounds %struct.WINDOW, ptr %269, i32 0, i32 2
  store ptr %268, ptr %270, align 8, !tbaa !11
  %271 = load ptr, ptr %4, align 8, !tbaa !9
  %272 = getelementptr inbounds %struct.WINDOW, ptr %271, i32 0, i32 11
  %273 = load i32, ptr %272, align 4, !tbaa !27
  %274 = or i32 %273, 8
  store i32 %274, ptr %272, align 4, !tbaa !27
  br label %275

275:                                              ; preds = %267, %186
  %276 = load ptr, ptr %4, align 8, !tbaa !9
  %277 = getelementptr inbounds %struct.WINDOW, ptr %276, i32 0, i32 2
  %278 = load ptr, ptr %277, align 8, !tbaa !11
  store ptr %278, ptr %3, align 8, !tbaa !9
  %279 = load ptr, ptr %4, align 8, !tbaa !9
  %280 = getelementptr inbounds %struct.WINDOW, ptr %279, i32 0, i32 7
  %281 = load i32, ptr %280, align 4, !tbaa !36
  store i32 %281, ptr %8, align 4, !tbaa !5
  br label %282

282:                                              ; preds = %292, %275
  %283 = load i32, ptr %8, align 4, !tbaa !5
  %284 = load ptr, ptr %4, align 8, !tbaa !9
  %285 = getelementptr inbounds %struct.WINDOW, ptr %284, i32 0, i32 7
  %286 = load i32, ptr %285, align 4, !tbaa !36
  %287 = load ptr, ptr %4, align 8, !tbaa !9
  %288 = getelementptr inbounds %struct.WINDOW, ptr %287, i32 0, i32 8
  %289 = load i32, ptr %288, align 8, !tbaa !29
  %290 = add nsw i32 %286, %289
  %291 = icmp slt i32 %283, %290
  br i1 %291, label %292, label %307

292:                                              ; preds = %282
  %293 = load ptr, ptr %4, align 8, !tbaa !9
  %294 = getelementptr inbounds %struct.WINDOW, ptr %293, i32 0, i32 9
  %295 = load i32, ptr %294, align 4, !tbaa !22
  %296 = load ptr, ptr @pscreen, align 8, !tbaa !9
  %297 = load i32, ptr %8, align 4, !tbaa !5
  %298 = sext i32 %297 to i64
  %299 = getelementptr inbounds ptr, ptr %296, i64 %298
  %300 = load ptr, ptr %299, align 8, !tbaa !9
  %301 = getelementptr inbounds %struct.VIDEO, ptr %300, i32 0, i32 0
  store i32 %295, ptr %301, align 4, !tbaa !37
  %302 = load ptr, ptr %3, align 8, !tbaa !9
  %303 = getelementptr inbounds %struct.LINE, ptr %302, i32 0, i32 0
  %304 = load ptr, ptr %303, align 8, !tbaa !14
  store ptr %304, ptr %3, align 8, !tbaa !9
  %305 = load i32, ptr %8, align 4, !tbaa !5
  %306 = add nsw i32 %305, 1
  store i32 %306, ptr %8, align 4, !tbaa !5
  br label %282, !llvm.loop !39

307:                                              ; preds = %282
  %308 = load ptr, ptr %4, align 8, !tbaa !9
  %309 = getelementptr inbounds %struct.WINDOW, ptr %308, i32 0, i32 2
  %310 = load ptr, ptr %309, align 8, !tbaa !11
  store ptr %310, ptr %3, align 8, !tbaa !9
  %311 = load ptr, ptr %4, align 8, !tbaa !9
  %312 = getelementptr inbounds %struct.WINDOW, ptr %311, i32 0, i32 7
  %313 = load i32, ptr %312, align 4, !tbaa !36
  store i32 %313, ptr %8, align 4, !tbaa !5
  %314 = load ptr, ptr %4, align 8, !tbaa !9
  %315 = getelementptr inbounds %struct.WINDOW, ptr %314, i32 0, i32 11
  %316 = load i32, ptr %315, align 4, !tbaa !27
  %317 = and i32 %316, -17
  %318 = icmp eq i32 %317, 4
  br i1 %318, label %319, label %372

319:                                              ; preds = %307
  br label %320

320:                                              ; preds = %326, %319
  %321 = load ptr, ptr %3, align 8, !tbaa !9
  %322 = load ptr, ptr %4, align 8, !tbaa !9
  %323 = getelementptr inbounds %struct.WINDOW, ptr %322, i32 0, i32 3
  %324 = load ptr, ptr %323, align 8, !tbaa !13
  %325 = icmp ne ptr %321, %324
  br i1 %325, label %326, label %332

326:                                              ; preds = %320
  %327 = load i32, ptr %8, align 4, !tbaa !5
  %328 = add nsw i32 %327, 1
  store i32 %328, ptr %8, align 4, !tbaa !5
  %329 = load ptr, ptr %3, align 8, !tbaa !9
  %330 = getelementptr inbounds %struct.LINE, ptr %329, i32 0, i32 0
  %331 = load ptr, ptr %330, align 8, !tbaa !14
  store ptr %331, ptr %3, align 8, !tbaa !9
  br label %320, !llvm.loop !40

332:                                              ; preds = %320
  %333 = load i32, ptr %8, align 4, !tbaa !5
  call void @vtmove(i32 noundef %333, i32 noundef 0)
  %334 = load ptr, ptr @vscreen, align 8, !tbaa !9
  %335 = load i32, ptr %8, align 4, !tbaa !5
  %336 = sext i32 %335 to i64
  %337 = getelementptr inbounds ptr, ptr %334, i64 %336
  %338 = load ptr, ptr %337, align 8, !tbaa !9
  store ptr %338, ptr %13, align 8, !tbaa !9
  %339 = load ptr, ptr %13, align 8, !tbaa !9
  %340 = getelementptr inbounds %struct.VIDEO, ptr %339, i32 0, i32 0
  store i32 0, ptr %340, align 4, !tbaa !37
  %341 = load ptr, ptr %13, align 8, !tbaa !9
  %342 = getelementptr inbounds %struct.VIDEO, ptr %341, i32 0, i32 1
  store ptr %342, ptr %9, align 8, !tbaa !9
  %343 = load ptr, ptr %9, align 8, !tbaa !9
  %344 = load i32, ptr %343, align 4, !tbaa !5
  %345 = or i32 %344, 1
  store i32 %345, ptr %343, align 4, !tbaa !5
  %346 = load ptr, ptr %9, align 8, !tbaa !9
  %347 = load i32, ptr %346, align 4, !tbaa !5
  %348 = and i32 %347, -3
  store i32 %348, ptr %346, align 4, !tbaa !5
  store i32 0, ptr %5, align 4, !tbaa !5
  br label %349

349:                                              ; preds = %367, %332
  %350 = load i32, ptr %5, align 4, !tbaa !5
  %351 = load ptr, ptr %3, align 8, !tbaa !9
  %352 = getelementptr inbounds %struct.LINE, ptr %351, i32 0, i32 3
  %353 = load i16, ptr %352, align 2, !tbaa !41
  %354 = sext i16 %353 to i32
  %355 = and i32 65535, %354
  %356 = icmp slt i32 %350, %355
  br i1 %356, label %357, label %370

357:                                              ; preds = %349
  %358 = load ptr, ptr %3, align 8, !tbaa !9
  %359 = getelementptr inbounds %struct.LINE, ptr %358, i32 0, i32 4
  %360 = load i32, ptr %5, align 4, !tbaa !5
  %361 = sext i32 %360 to i64
  %362 = getelementptr inbounds [32768 x i8], ptr %359, i64 0, i64 %361
  %363 = load i8, ptr %362, align 1, !tbaa !20
  %364 = sext i8 %363 to i32
  %365 = and i32 %364, 255
  %366 = load i32, ptr %7, align 4, !tbaa !5
  call void @vvtputc(i32 noundef %365, i32 noundef %366)
  br label %367

367:                                              ; preds = %357
  %368 = load i32, ptr %5, align 4, !tbaa !5
  %369 = add nsw i32 %368, 1
  store i32 %369, ptr %5, align 4, !tbaa !5
  br label %349, !llvm.loop !42

370:                                              ; preds = %349
  %371 = load i32, ptr %7, align 4, !tbaa !5
  call void @vvtputc(i32 noundef 10, i32 noundef %371)
  call void @vteeol()
  br label %443

372:                                              ; preds = %307
  %373 = load ptr, ptr %4, align 8, !tbaa !9
  %374 = getelementptr inbounds %struct.WINDOW, ptr %373, i32 0, i32 11
  %375 = load i32, ptr %374, align 4, !tbaa !27
  %376 = and i32 %375, 12
  %377 = icmp ne i32 %376, 0
  br i1 %377, label %378, label %442

378:                                              ; preds = %372
  br label %379

379:                                              ; preds = %438, %378
  %380 = load i32, ptr %8, align 4, !tbaa !5
  %381 = load ptr, ptr %4, align 8, !tbaa !9
  %382 = getelementptr inbounds %struct.WINDOW, ptr %381, i32 0, i32 7
  %383 = load i32, ptr %382, align 4, !tbaa !36
  %384 = load ptr, ptr %4, align 8, !tbaa !9
  %385 = getelementptr inbounds %struct.WINDOW, ptr %384, i32 0, i32 8
  %386 = load i32, ptr %385, align 8, !tbaa !29
  %387 = add nsw i32 %383, %386
  %388 = icmp slt i32 %380, %387
  br i1 %388, label %389, label %441

389:                                              ; preds = %379
  %390 = load i32, ptr %8, align 4, !tbaa !5
  call void @vtmove(i32 noundef %390, i32 noundef 0)
  %391 = load ptr, ptr @vscreen, align 8, !tbaa !9
  %392 = load i32, ptr %8, align 4, !tbaa !5
  %393 = sext i32 %392 to i64
  %394 = getelementptr inbounds ptr, ptr %391, i64 %393
  %395 = load ptr, ptr %394, align 8, !tbaa !9
  store ptr %395, ptr %13, align 8, !tbaa !9
  %396 = load ptr, ptr %13, align 8, !tbaa !9
  %397 = getelementptr inbounds %struct.VIDEO, ptr %396, i32 0, i32 0
  store i32 0, ptr %397, align 4, !tbaa !37
  %398 = load ptr, ptr %13, align 8, !tbaa !9
  %399 = getelementptr inbounds %struct.VIDEO, ptr %398, i32 0, i32 1
  store ptr %399, ptr %9, align 8, !tbaa !9
  %400 = load ptr, ptr %9, align 8, !tbaa !9
  %401 = load i32, ptr %400, align 4, !tbaa !5
  %402 = or i32 %401, 1
  store i32 %402, ptr %400, align 4, !tbaa !5
  %403 = load ptr, ptr %9, align 8, !tbaa !9
  %404 = load i32, ptr %403, align 4, !tbaa !5
  %405 = and i32 %404, -3
  store i32 %405, ptr %403, align 4, !tbaa !5
  %406 = load ptr, ptr %3, align 8, !tbaa !9
  %407 = load ptr, ptr %14, align 8, !tbaa !9
  %408 = getelementptr inbounds %struct.BUFFER, ptr %407, i32 0, i32 5
  %409 = load ptr, ptr %408, align 8, !tbaa !30
  %410 = icmp ne ptr %406, %409
  br i1 %410, label %411, label %438

411:                                              ; preds = %389
  store i32 0, ptr %5, align 4, !tbaa !5
  br label %412

412:                                              ; preds = %430, %411
  %413 = load i32, ptr %5, align 4, !tbaa !5
  %414 = load ptr, ptr %3, align 8, !tbaa !9
  %415 = getelementptr inbounds %struct.LINE, ptr %414, i32 0, i32 3
  %416 = load i16, ptr %415, align 2, !tbaa !41
  %417 = sext i16 %416 to i32
  %418 = and i32 65535, %417
  %419 = icmp slt i32 %413, %418
  br i1 %419, label %420, label %433

420:                                              ; preds = %412
  %421 = load ptr, ptr %3, align 8, !tbaa !9
  %422 = getelementptr inbounds %struct.LINE, ptr %421, i32 0, i32 4
  %423 = load i32, ptr %5, align 4, !tbaa !5
  %424 = sext i32 %423 to i64
  %425 = getelementptr inbounds [32768 x i8], ptr %422, i64 0, i64 %424
  %426 = load i8, ptr %425, align 1, !tbaa !20
  %427 = sext i8 %426 to i32
  %428 = and i32 %427, 255
  %429 = load i32, ptr %7, align 4, !tbaa !5
  call void @vvtputc(i32 noundef %428, i32 noundef %429)
  br label %430

430:                                              ; preds = %420
  %431 = load i32, ptr %5, align 4, !tbaa !5
  %432 = add nsw i32 %431, 1
  store i32 %432, ptr %5, align 4, !tbaa !5
  br label %412, !llvm.loop !43

433:                                              ; preds = %412
  %434 = load i32, ptr %7, align 4, !tbaa !5
  call void @vvtputc(i32 noundef 10, i32 noundef %434)
  %435 = load ptr, ptr %3, align 8, !tbaa !9
  %436 = getelementptr inbounds %struct.LINE, ptr %435, i32 0, i32 0
  %437 = load ptr, ptr %436, align 8, !tbaa !14
  store ptr %437, ptr %3, align 8, !tbaa !9
  br label %438

438:                                              ; preds = %433, %389
  call void @vteeol()
  %439 = load i32, ptr %8, align 4, !tbaa !5
  %440 = add nsw i32 %439, 1
  store i32 %440, ptr %8, align 4, !tbaa !5
  br label %379, !llvm.loop !44

441:                                              ; preds = %379
  br label %442

442:                                              ; preds = %441, %372
  br label %443

443:                                              ; preds = %442, %370
  %444 = load ptr, ptr %4, align 8, !tbaa !9
  %445 = getelementptr inbounds %struct.WINDOW, ptr %444, i32 0, i32 11
  %446 = load i32, ptr %445, align 4, !tbaa !27
  %447 = and i32 %446, 16
  %448 = icmp ne i32 %447, 0
  br i1 %448, label %449, label %451

449:                                              ; preds = %443
  %450 = load ptr, ptr %4, align 8, !tbaa !9
  call void @modeline(ptr noundef %450)
  br label %451

451:                                              ; preds = %449, %443
  %452 = load ptr, ptr %4, align 8, !tbaa !9
  %453 = getelementptr inbounds %struct.WINDOW, ptr %452, i32 0, i32 11
  store i32 0, ptr %453, align 4, !tbaa !27
  %454 = load ptr, ptr %4, align 8, !tbaa !9
  %455 = getelementptr inbounds %struct.WINDOW, ptr %454, i32 0, i32 10
  store i32 0, ptr %455, align 8, !tbaa !33
  br label %456

456:                                              ; preds = %451, %159
  %457 = load ptr, ptr %4, align 8, !tbaa !9
  %458 = getelementptr inbounds %struct.WINDOW, ptr %457, i32 0, i32 0
  %459 = load ptr, ptr %458, align 8, !tbaa !45
  store ptr %459, ptr %4, align 8, !tbaa !9
  br label %135, !llvm.loop !46

460:                                              ; preds = %135
  %461 = load i32, ptr @sgarbf, align 4, !tbaa !5
  %462 = icmp ne i32 %461, 0
  br i1 %462, label %463, label %502

463:                                              ; preds = %460
  store i32 0, ptr %8, align 4, !tbaa !5
  br label %464

464:                                              ; preds = %496, %463
  %465 = load i32, ptr %8, align 4, !tbaa !5
  %466 = load i32, ptr @term, align 8, !tbaa !47
  %467 = icmp slt i32 %465, %466
  br i1 %467, label %468, label %499

468:                                              ; preds = %464
  %469 = load ptr, ptr @vscreen, align 8, !tbaa !9
  %470 = load i32, ptr %8, align 4, !tbaa !5
  %471 = sext i32 %470 to i64
  %472 = getelementptr inbounds ptr, ptr %469, i64 %471
  %473 = load ptr, ptr %472, align 8, !tbaa !9
  %474 = getelementptr inbounds %struct.VIDEO, ptr %473, i32 0, i32 1
  %475 = load i32, ptr %474, align 4, !tbaa !48
  %476 = or i32 %475, 1
  store i32 %476, ptr %474, align 4, !tbaa !48
  %477 = load ptr, ptr @pscreen, align 8, !tbaa !9
  %478 = load i32, ptr %8, align 4, !tbaa !5
  %479 = sext i32 %478 to i64
  %480 = getelementptr inbounds ptr, ptr %477, i64 %479
  %481 = load ptr, ptr %480, align 8, !tbaa !9
  store ptr %481, ptr %13, align 8, !tbaa !9
  store i32 0, ptr %5, align 4, !tbaa !5
  br label %482

482:                                              ; preds = %492, %468
  %483 = load i32, ptr %5, align 4, !tbaa !5
  %484 = load i32, ptr getelementptr inbounds (%struct.TERM, ptr @term, i32 0, i32 1), align 4, !tbaa !23
  %485 = icmp slt i32 %483, %484
  br i1 %485, label %486, label %495

486:                                              ; preds = %482
  %487 = load ptr, ptr %13, align 8, !tbaa !9
  %488 = getelementptr inbounds %struct.VIDEO, ptr %487, i32 0, i32 2
  %489 = load i32, ptr %5, align 4, !tbaa !5
  %490 = sext i32 %489 to i64
  %491 = getelementptr inbounds [32768 x i8], ptr %488, i64 0, i64 %490
  store i8 32, ptr %491, align 1, !tbaa !20
  br label %492

492:                                              ; preds = %486
  %493 = load i32, ptr %5, align 4, !tbaa !5
  %494 = add nsw i32 %493, 1
  store i32 %494, ptr %5, align 4, !tbaa !5
  br label %482, !llvm.loop !49

495:                                              ; preds = %482
  br label %496

496:                                              ; preds = %495
  %497 = load i32, ptr %8, align 4, !tbaa !5
  %498 = add nsw i32 %497, 1
  store i32 %498, ptr %8, align 4, !tbaa !5
  br label %464, !llvm.loop !50

499:                                              ; preds = %464
  call void @movecursor(i32 noundef 0, i32 noundef 0)
  %500 = load ptr, ptr getelementptr inbounds (%struct.TERM, ptr @term, i32 0, i32 9), align 8, !tbaa !51
  %501 = call i32 (...) %500()
  store i32 0, ptr @sgarbf, align 4, !tbaa !5
  store i32 0, ptr @mpresf, align 4, !tbaa !5
  br label %502

502:                                              ; preds = %499, %460
  store i32 0, ptr %8, align 4, !tbaa !5
  br label %503

503:                                              ; preds = %539, %502
  %504 = load i32, ptr %8, align 4, !tbaa !5
  %505 = load i32, ptr @term, align 8, !tbaa !47
  %506 = icmp slt i32 %504, %505
  br i1 %506, label %507, label %542

507:                                              ; preds = %503
  %508 = load ptr, ptr @vscreen, align 8, !tbaa !9
  %509 = load i32, ptr %8, align 4, !tbaa !5
  %510 = sext i32 %509 to i64
  %511 = getelementptr inbounds ptr, ptr %508, i64 %510
  %512 = load ptr, ptr %511, align 8, !tbaa !9
  store ptr %512, ptr %13, align 8, !tbaa !9
  %513 = load ptr, ptr %13, align 8, !tbaa !9
  %514 = getelementptr inbounds %struct.VIDEO, ptr %513, i32 0, i32 1
  store ptr %514, ptr %9, align 8, !tbaa !9
  %515 = load ptr, ptr %9, align 8, !tbaa !9
  %516 = load i32, ptr %515, align 4, !tbaa !5
  %517 = and i32 %516, 1
  %518 = icmp ne i32 %517, 0
  br i1 %518, label %522, label %519

519:                                              ; preds = %507
  %520 = load i32, ptr %11, align 4, !tbaa !5
  %521 = icmp ne i32 %520, 0
  br i1 %521, label %522, label %538

522:                                              ; preds = %519, %507
  %523 = load ptr, ptr getelementptr inbounds (%struct.TERM, ptr @term, i32 0, i32 13), align 8, !tbaa !52
  %524 = call i32 (...) %523()
  %525 = icmp ne i32 %524, 0
  br i1 %525, label %526, label %527

526:                                              ; preds = %522
  br label %542

527:                                              ; preds = %522
  %528 = load ptr, ptr %9, align 8, !tbaa !9
  %529 = load i32, ptr %528, align 4, !tbaa !5
  %530 = and i32 %529, -2
  store i32 %530, ptr %528, align 4, !tbaa !5
  %531 = load i32, ptr %8, align 4, !tbaa !5
  %532 = load ptr, ptr %13, align 8, !tbaa !9
  %533 = load ptr, ptr @pscreen, align 8, !tbaa !9
  %534 = load i32, ptr %8, align 4, !tbaa !5
  %535 = sext i32 %534 to i64
  %536 = getelementptr inbounds ptr, ptr %533, i64 %535
  %537 = load ptr, ptr %536, align 8, !tbaa !9
  call void @updateline(i32 noundef %531, ptr noundef %532, ptr noundef %537)
  br label %538

538:                                              ; preds = %527, %519
  br label %539

539:                                              ; preds = %538
  %540 = load i32, ptr %8, align 4, !tbaa !5
  %541 = add nsw i32 %540, 1
  store i32 %541, ptr %8, align 4, !tbaa !5
  br label %503, !llvm.loop !53

542:                                              ; preds = %526, %503
  %543 = load ptr, ptr @curwp, align 8, !tbaa !9
  store ptr %543, ptr %4, align 8, !tbaa !9
  %544 = load ptr, ptr %4, align 8, !tbaa !9
  %545 = getelementptr inbounds %struct.WINDOW, ptr %544, i32 0, i32 2
  %546 = load ptr, ptr %545, align 8, !tbaa !11
  store ptr %546, ptr %3, align 8, !tbaa !9
  %547 = load ptr, ptr %4, align 8, !tbaa !9
  %548 = getelementptr inbounds %struct.WINDOW, ptr %547, i32 0, i32 7
  %549 = load i32, ptr %548, align 4, !tbaa !36
  store i32 %549, ptr @currow, align 4, !tbaa !5
  br label %550

550:                                              ; preds = %556, %542
  %551 = load ptr, ptr %3, align 8, !tbaa !9
  %552 = load ptr, ptr %4, align 8, !tbaa !9
  %553 = getelementptr inbounds %struct.WINDOW, ptr %552, i32 0, i32 3
  %554 = load ptr, ptr %553, align 8, !tbaa !13
  %555 = icmp ne ptr %551, %554
  br i1 %555, label %556, label %562

556:                                              ; preds = %550
  %557 = load i32, ptr @currow, align 4, !tbaa !5
  %558 = add nsw i32 %557, 1
  store i32 %558, ptr @currow, align 4, !tbaa !5
  %559 = load ptr, ptr %3, align 8, !tbaa !9
  %560 = getelementptr inbounds %struct.LINE, ptr %559, i32 0, i32 0
  %561 = load ptr, ptr %560, align 8, !tbaa !14
  store ptr %561, ptr %3, align 8, !tbaa !9
  br label %550, !llvm.loop !54

562:                                              ; preds = %550
  %563 = load i32, ptr @currow, align 4, !tbaa !5
  %564 = load i32, ptr @curcol, align 4, !tbaa !5
  call void @movecursor(i32 noundef %563, i32 noundef %564)
  %565 = load ptr, ptr getelementptr inbounds (%struct.TERM, ptr @term, i32 0, i32 6), align 8, !tbaa !55
  %566 = call i32 (...) %565()
  store i32 0, ptr %15, align 4
  br label %567

567:                                              ; preds = %562, %22
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #2
  %568 = load i32, ptr %15, align 4
  switch i32 %568, label %570 [
    i32 0, label %569
    i32 1, label %569
  ]

569:                                              ; preds = %567, %567
  ret void

570:                                              ; preds = %567
  unreachable
}

; Function Attrs: nounwind uwtable
declare dso_local void @mlwrite(ptr noundef, ...) #1

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

; Function Attrs: nounwind uwtable
declare dso_local void @vteeol() #1

; Function Attrs: nounwind uwtable
declare dso_local void @modeline(ptr noundef) #1

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { 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 16}
!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 = !{!12, !10, i64 24}
!14 = !{!15, !10, i64 0}
!15 = !{!"LINE", !10, i64 0, !10, i64 8, !16, i64 16, !16, i64 18, !7, i64 20}
!16 = !{!"short", !7, i64 0}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = !{!12, !6, i64 32}
!20 = !{!7, !7, i64 0}
!21 = distinct !{!21, !18}
!22 = !{!12, !6, i64 60}
!23 = !{!24, !6, i64 4}
!24 = !{!"", !6, i64 0, !6, i64 4, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96}
!25 = distinct !{!25, !18}
!26 = distinct !{!26, !18}
!27 = !{!12, !6, i64 68}
!28 = !{!12, !10, i64 8}
!29 = !{!12, !6, i64 56}
!30 = !{!31, !10, i64 40}
!31 = !{!"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}
!32 = distinct !{!32, !18}
!33 = !{!12, !6, i64 64}
!34 = !{!15, !10, i64 8}
!35 = distinct !{!35, !18}
!36 = !{!12, !6, i64 52}
!37 = !{!38, !6, i64 0}
!38 = !{!"VIDEO", !6, i64 0, !6, i64 4, !7, i64 8}
!39 = distinct !{!39, !18}
!40 = distinct !{!40, !18}
!41 = !{!15, !16, i64 18}
!42 = distinct !{!42, !18}
!43 = distinct !{!43, !18}
!44 = distinct !{!44, !18}
!45 = !{!12, !10, i64 0}
!46 = distinct !{!46, !18}
!47 = !{!24, !6, i64 0}
!48 = !{!38, !6, i64 4}
!49 = distinct !{!49, !18}
!50 = distinct !{!50, !18}
!51 = !{!24, !10, i64 64}
!52 = !{!24, !10, i64 96}
!53 = distinct !{!53, !18}
!54 = distinct !{!54, !18}
!55 = !{!24, !10, i64 40}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.TERM = type { i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }

@sgarbf = external dso_local local_unnamed_addr global i32, align 4
@mpresf = external dso_local local_unnamed_addr global i32, align 4
@visible = external dso_local local_unnamed_addr global i32, align 4
@vscreen = external dso_local local_unnamed_addr global ptr, align 8
@pscreen = external dso_local local_unnamed_addr global ptr, align 8
@term = external local_unnamed_addr global %struct.TERM, align 8
@tabsize = external local_unnamed_addr global i32, align 4
@playback = external local_unnamed_addr global i32, align 4
@.str.5 = external hidden unnamed_addr constant [26 x i8], align 1
@curwp = external local_unnamed_addr global ptr, align 8
@curcol = external local_unnamed_addr global i32, align 4
@wheadp = external local_unnamed_addr global ptr, align 8
@blistp = external local_unnamed_addr global ptr, align 8
@bhelpp = external local_unnamed_addr global ptr, align 8
@currow = external local_unnamed_addr global i32, align 4

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

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

; Function Attrs: nounwind uwtable
define dso_local void @update(i32 noundef %0) local_unnamed_addr #0 {
  %2 = load i32, ptr @playback, align 4, !tbaa !5
  %3 = icmp eq i32 %2, 1
  br i1 %3, label %4, label %6

4:                                                ; preds = %1
  %.not = icmp eq i32 %0, 0
  br i1 %.not, label %277, label %5

5:                                                ; preds = %4
  tail call void (ptr, ...) @mlwrite(ptr noundef nonnull @.str.5)
  br label %6

6:                                                ; preds = %5, %1
  %7 = load ptr, ptr @curwp, align 8, !tbaa !9
  %8 = getelementptr inbounds i8, ptr %7, i64 16
  %9 = getelementptr inbounds i8, ptr %7, i64 24
  %10 = load ptr, ptr %9, align 8, !tbaa !11
  br label %11

11:                                               ; preds = %11, %6
  %.0.in = phi ptr [ %8, %6 ], [ %.0, %11 ]
  %.0 = load ptr, ptr %.0.in, align 8, !tbaa !9
  %.not168 = icmp eq ptr %.0, %10
  br i1 %.not168, label %.preheader191, label %11, !llvm.loop !13

.preheader191:                                    ; preds = %11
  %12 = getelementptr inbounds i8, ptr %7, i64 32
  store i32 0, ptr @curcol, align 4, !tbaa !5
  %13 = load i32, ptr %12, align 8, !tbaa !15
  %14 = icmp sgt i32 %13, 0
  br i1 %14, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %.preheader191
  %15 = getelementptr inbounds i8, ptr %.0, i64 20
  %16 = load i32, ptr @tabsize, align 4
  %17 = zext nneg i32 %13 to i64
  br label %18

18:                                               ; preds = %.lr.ph, %31
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %31 ]
  %storemerge195 = phi i32 [ 0, %.lr.ph ], [ %32, %31 ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %19 = getelementptr inbounds [32768 x i8], ptr %15, i64 0, i64 %indvars.iv
  %20 = load i8, ptr %19, align 1, !tbaa !16
  %21 = icmp eq i8 %20, 9
  br i1 %21, label %22, label %27

22:                                               ; preds = %18
  %23 = srem i32 %storemerge195, %16
  %24 = xor i32 %23, -1
  %25 = add i32 %16, %storemerge195
  %26 = add i32 %25, %24
  br label %31

27:                                               ; preds = %18
  %28 = icmp ult i8 %20, 32
  %29 = icmp eq i8 %20, 127
  %or.cond = or i1 %28, %29
  %30 = zext i1 %or.cond to i32
  %spec.select330 = add nsw i32 %storemerge195, %30
  br label %31

31:                                               ; preds = %27, %22
  %storemerge194 = phi i32 [ %26, %22 ], [ %spec.select330, %27 ]
  %32 = add nsw i32 %storemerge194, 1
  store i32 %32, ptr @curcol, align 4, !tbaa !5
  %33 = icmp ult i64 %indvars.iv.next, %17
  br i1 %33, label %18, label %._crit_edge, !llvm.loop !17

._crit_edge:                                      ; preds = %31, %.preheader191
  %storemerge.lcssa = phi i32 [ 0, %.preheader191 ], [ %32, %31 ]
  %34 = getelementptr inbounds i8, ptr %7, i64 60
  %35 = load i32, ptr %34, align 4, !tbaa !18
  %36 = sub nsw i32 %storemerge.lcssa, %35
  store i32 %36, ptr @curcol, align 4, !tbaa !5
  %37 = load i32, ptr getelementptr inbounds (i8, ptr @term, i64 4), align 4, !tbaa !19
  %38 = sdiv i32 %37, 2
  %.not169197 = icmp eq i32 %35, 0
  %.neg198 = select i1 %.not169197, i32 -1, i32 -2
  %39 = add i32 %.neg198, %37
  %.not170199 = icmp slt i32 %36, %39
  br i1 %.not170199, label %.preheader190, label %.lr.ph202

..preheader190_crit_edge:                         ; preds = %.lr.ph202
  store i32 %55, ptr @curcol, align 4, !tbaa !5
  br label %.preheader190

.preheader190:                                    ; preds = %..preheader190_crit_edge, %._crit_edge
  %.0142.lcssa = phi i32 [ %54, %..preheader190_crit_edge ], [ %35, %._crit_edge ]
  %.lcssa193 = phi i32 [ %55, %..preheader190_crit_edge ], [ %36, %._crit_edge ]
  %40 = icmp slt i32 %.lcssa193, 0
  br i1 %40, label %.lr.ph208.preheader, label %61

.lr.ph208.preheader:                              ; preds = %.preheader190
  %41 = add i32 %.lcssa193, %38
  %smax = tail call i32 @llvm.smax.i32(i32 %41, i32 0)
  %.lobit = lshr i32 %41, 31
  %42 = add i32 %.lobit, %41
  %43 = sub i32 %smax, %42
  %44 = udiv i32 %43, %38
  %45 = add i32 %.lobit, %44
  %46 = add i32 %45, 1
  %min.iters.check = icmp ult i32 %46, 8
  br i1 %min.iters.check, label %.lr.ph208.preheader345, label %vector.ph

.lr.ph208.preheader345:                           ; preds = %middle.block, %.lr.ph208.preheader
  %.1143207.ph = phi i32 [ %.0142.lcssa, %.lr.ph208.preheader ], [ %52, %middle.block ]
  %.ph = phi i32 [ %.lcssa193, %.lr.ph208.preheader ], [ %ind.end, %middle.block ]
  br label %.lr.ph208

vector.ph:                                        ; preds = %.lr.ph208.preheader
  %n.vec = and i32 %46, -8
  %47 = mul i32 %n.vec, %38
  %ind.end = add i32 %.lcssa193, %47
  %48 = insertelement <4 x i32> <i32 poison, i32 0, i32 0, i32 0>, i32 %.0142.lcssa, i64 0
  %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %38, i64 0
  %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.phi = phi <4 x i32> [ %48, %vector.ph ], [ %49, %vector.body ]
  %vec.phi341 = phi <4 x i32> [ zeroinitializer, %vector.ph ], [ %50, %vector.body ]
  %49 = sub <4 x i32> %vec.phi, %broadcast.splat
  %50 = sub <4 x i32> %vec.phi341, %broadcast.splat
  %index.next = add nuw i32 %index, 8
  %51 = icmp eq i32 %index.next, %n.vec
  br i1 %51, label %middle.block, label %vector.body, !llvm.loop !21

middle.block:                                     ; preds = %vector.body
  %bin.rdx = add <4 x i32> %50, %49
  %52 = tail call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %bin.rdx)
  %cmp.n = icmp eq i32 %46, %n.vec
  br i1 %cmp.n, label %.thread, label %.lr.ph208.preheader345

.lr.ph202:                                        ; preds = %._crit_edge, %.lr.ph202
  %.0142200 = phi i32 [ %54, %.lr.ph202 ], [ %35, %._crit_edge ]
  %53 = phi i32 [ %55, %.lr.ph202 ], [ %36, %._crit_edge ]
  %54 = add nsw i32 %.0142200, %38
  %55 = sub nsw i32 %53, %38
  %.not169 = icmp eq i32 %54, 0
  %.neg = select i1 %.not169, i32 -1, i32 -2
  %56 = add i32 %.neg, %37
  %.not170 = icmp slt i32 %55, %56
  br i1 %.not170, label %..preheader190_crit_edge, label %.lr.ph202, !llvm.loop !24

.lr.ph208:                                        ; preds = %.lr.ph208.preheader345, %.lr.ph208
  %.1143207 = phi i32 [ %58, %.lr.ph208 ], [ %.1143207.ph, %.lr.ph208.preheader345 ]
  %57 = phi i32 [ %59, %.lr.ph208 ], [ %.ph, %.lr.ph208.preheader345 ]
  %58 = sub nsw i32 %.1143207, %38
  %59 = add nsw i32 %57, %38
  %60 = icmp slt i32 %59, 0
  br i1 %60, label %.lr.ph208, label %.thread, !llvm.loop !25

.thread:                                          ; preds = %.lr.ph208, %middle.block
  %.lcssa337 = phi i32 [ %52, %middle.block ], [ %58, %.lr.ph208 ]
  %.lcssa336 = phi i32 [ %ind.end, %middle.block ], [ %59, %.lr.ph208 ]
  store i32 %.lcssa336, ptr @curcol, align 4, !tbaa !5
  br label %62

61:                                               ; preds = %.preheader190
  br i1 %.not170199, label %66, label %62

62:                                               ; preds = %.thread, %61
  %.1143.lcssa318 = phi i32 [ %.lcssa337, %.thread ], [ %.0142.lcssa, %61 ]
  %.lcssa192314 = phi i32 [ %.lcssa336, %.thread ], [ %.lcssa193, %61 ]
  store i32 %.1143.lcssa318, ptr %34, align 4, !tbaa !18
  %63 = getelementptr inbounds i8, ptr %7, i64 68
  %64 = load i32, ptr %63, align 4, !tbaa !26
  %65 = or i32 %64, 8
  store i32 %65, ptr %63, align 4, !tbaa !26
  br label %66

66:                                               ; preds = %62, %61
  %.1143.lcssa319 = phi i32 [ %.1143.lcssa318, %62 ], [ %.0142.lcssa, %61 ]
  %.1145.lcssa317 = phi i32 [ 1, %62 ], [ 0, %61 ]
  %.lcssa192315 = phi i32 [ %.lcssa192314, %62 ], [ %.lcssa193, %61 ]
  %.not171 = icmp eq i32 %.1143.lcssa319, 0
  br i1 %.not171, label %69, label %67

67:                                               ; preds = %66
  %68 = add nuw nsw i32 %.lcssa192315, 1
  store i32 %68, ptr @curcol, align 4, !tbaa !5
  br label %69

69:                                               ; preds = %67, %66
  %.0146250 = load ptr, ptr @wheadp, align 8, !tbaa !9
  %.not172251 = icmp eq ptr %.0146250, null
  br i1 %.not172251, label %._crit_edge255, label %.lr.ph254

.lr.ph254:                                        ; preds = %69, %208
  %.0146252 = phi ptr [ %.0146, %208 ], [ %.0146250, %69 ]
  %70 = getelementptr inbounds i8, ptr %.0146252, i64 8
  %71 = load ptr, ptr %70, align 8, !tbaa !27
  %72 = load ptr, ptr @blistp, align 8, !tbaa !9
  %73 = icmp eq ptr %71, %72
  br i1 %73, label %78, label %74

74:                                               ; preds = %.lr.ph254
  %75 = load i32, ptr @visible, align 4, !tbaa !5
  %76 = load ptr, ptr @bhelpp, align 8, !tbaa !9
  %77 = icmp eq ptr %71, %76
  br i1 %77, label %78, label %79

78:                                               ; preds = %74, %.lr.ph254
  br label %79

79:                                               ; preds = %78, %74
  %.0155 = phi i32 [ 0, %78 ], [ %75, %74 ]
  %80 = load i32, ptr @sgarbf, align 4, !tbaa !5
  %.not177 = icmp eq i32 %80, 0
  %.phi.trans.insert = getelementptr inbounds i8, ptr %.0146252, i64 68
  %.pre = load i32, ptr %.phi.trans.insert, align 4, !tbaa !26
  br i1 %.not177, label %82, label %.thread320

.thread320:                                       ; preds = %79
  %81 = or i32 %.pre, 8
  store i32 %81, ptr %.phi.trans.insert, align 4, !tbaa !26
  br label %83

82:                                               ; preds = %79
  %.not178 = icmp eq i32 %.pre, 0
  br i1 %.not178, label %208, label %83

83:                                               ; preds = %.thread320, %82
  %84 = phi i32 [ %81, %.thread320 ], [ %.pre, %82 ]
  %85 = getelementptr inbounds i8, ptr %.0146252, i64 68
  %86 = and i32 %84, 1
  %87 = icmp eq i32 %86, 0
  br i1 %87, label %88, label %.loopexit188

88:                                               ; preds = %83
  %89 = getelementptr inbounds i8, ptr %.0146252, i64 56
  %90 = load i32, ptr %89, align 8, !tbaa !28
  %91 = icmp sgt i32 %90, 0
  br i1 %91, label %.lr.ph218, label %.loopexit188

.lr.ph218:                                        ; preds = %88
  %92 = getelementptr inbounds i8, ptr %.0146252, i64 16
  %93 = getelementptr inbounds i8, ptr %.0146252, i64 24
  %94 = load ptr, ptr %93, align 8, !tbaa !11
  %95 = getelementptr inbounds i8, ptr %71, i64 40
  br label %96

96:                                               ; preds = %98, %.lr.ph218
  %.1216.in = phi ptr [ %92, %.lr.ph218 ], [ %.1216, %98 ]
  %.1148215 = phi i32 [ 0, %.lr.ph218 ], [ %101, %98 ]
  %.1216 = load ptr, ptr %.1216.in, align 8, !tbaa !9
  %97 = icmp eq ptr %.1216, %94
  br i1 %97, label %.loopexit189, label %98

98:                                               ; preds = %96
  %99 = load ptr, ptr %95, align 8, !tbaa !29
  %100 = icmp eq ptr %.1216, %99
  %101 = add nuw nsw i32 %.1148215, 1
  %exitcond.not = icmp eq i32 %101, %90
  %or.cond331 = select i1 %100, i1 true, i1 %exitcond.not
  br i1 %or.cond331, label %.loopexit188, label %96, !llvm.loop !31

.loopexit188:                                     ; preds = %98, %88, %83
  %102 = getelementptr inbounds i8, ptr %.0146252, i64 64
  %103 = load i32, ptr %102, align 8, !tbaa !32
  %104 = icmp sgt i32 %103, 0
  br i1 %104, label %105, label %109

105:                                              ; preds = %.loopexit188
  %106 = getelementptr inbounds i8, ptr %.0146252, i64 56
  %107 = load i32, ptr %106, align 8, !tbaa !28
  %spec.select = tail call i32 @llvm.smin.i32(i32 %103, i32 %107)
  %108 = add nsw i32 %spec.select, -1
  br label %117

109:                                              ; preds = %.loopexit188
  %110 = icmp slt i32 %103, 0
  %111 = getelementptr inbounds i8, ptr %.0146252, i64 56
  %112 = load i32, ptr %111, align 8, !tbaa !28
  br i1 %110, label %113, label %115

113:                                              ; preds = %109
  %114 = add nsw i32 %112, %103
  %spec.store.select = tail call i32 @llvm.smax.i32(i32 %114, i32 0)
  br label %117

115:                                              ; preds = %109
  %116 = sdiv i32 %112, 2
  br label %117

117:                                              ; preds = %113, %115, %105
  %118 = phi i32 [ %107, %105 ], [ %112, %113 ], [ %112, %115 ]
  %.3150 = phi i32 [ %108, %105 ], [ %spec.store.select, %113 ], [ %116, %115 ]
  %119 = getelementptr inbounds i8, ptr %.0146252, i64 24
  %120 = load ptr, ptr %119, align 8, !tbaa !11
  %.not179220 = icmp eq i32 %.3150, 0
  br i1 %.not179220, label %.critedge, label %.lr.ph224

.lr.ph224:                                        ; preds = %117
  %121 = getelementptr inbounds i8, ptr %71, i64 40
  %122 = load ptr, ptr %121, align 8, !tbaa !29
  br label %125

123:                                              ; preds = %125
  %124 = add nsw i32 %.4151221, -1
  %.not179 = icmp eq i32 %124, 0
  br i1 %.not179, label %.critedge, label %125, !llvm.loop !33

125:                                              ; preds = %.lr.ph224, %123
  %.2222 = phi ptr [ %120, %.lr.ph224 ], [ %127, %123 ]
  %.4151221 = phi i32 [ %.3150, %.lr.ph224 ], [ %124, %123 ]
  %126 = getelementptr inbounds i8, ptr %.2222, i64 8
  %127 = load ptr, ptr %126, align 8, !tbaa !34
  %.not180 = icmp eq ptr %127, %122
  br i1 %.not180, label %.critedge, label %123

.critedge:                                        ; preds = %125, %123, %117
  %.2.lcssa = phi ptr [ %120, %117 ], [ %127, %123 ], [ %.2222, %125 ]
  %128 = getelementptr inbounds i8, ptr %.0146252, i64 16
  store ptr %.2.lcssa, ptr %128, align 8, !tbaa !37
  %129 = or i32 %84, 8
  store i32 %129, ptr %85, align 4, !tbaa !26
  br label %.loopexit189

.loopexit189:                                     ; preds = %96, %.critedge
  %130 = phi ptr [ %120, %.critedge ], [ %94, %96 ]
  %131 = phi i32 [ %129, %.critedge ], [ %84, %96 ]
  %132 = phi i32 [ %118, %.critedge ], [ %90, %96 ]
  %133 = getelementptr inbounds i8, ptr %.0146252, i64 16
  %134 = getelementptr inbounds i8, ptr %.0146252, i64 52
  %135 = load i32, ptr %134, align 4, !tbaa !38
  %136 = getelementptr inbounds i8, ptr %.0146252, i64 56
  %137 = icmp sgt i32 %132, 0
  br i1 %137, label %.lr.ph231, label %._crit_edge232

.lr.ph231:                                        ; preds = %.loopexit189
  %138 = add nsw i32 %132, %135
  %139 = getelementptr inbounds i8, ptr %.0146252, i64 60
  %140 = load i32, ptr %139, align 4, !tbaa !18
  %141 = load ptr, ptr @pscreen, align 8, !tbaa !9
  %142 = sext i32 %135 to i64
  %143 = sext i32 %138 to i64
  br label %144

144:                                              ; preds = %.lr.ph231, %144
  %indvars.iv283 = phi i64 [ %142, %.lr.ph231 ], [ %indvars.iv.next284, %144 ]
  %145 = getelementptr inbounds ptr, ptr %141, i64 %indvars.iv283
  %146 = load ptr, ptr %145, align 8, !tbaa !9
  store i32 %140, ptr %146, align 4, !tbaa !39
  %indvars.iv.next284 = add nsw i64 %indvars.iv283, 1
  %147 = icmp slt i64 %indvars.iv.next284, %143
  br i1 %147, label %144, label %._crit_edge232, !llvm.loop !41

._crit_edge232:                                   ; preds = %144, %.loopexit189
  %148 = load ptr, ptr %133, align 8, !tbaa !37
  %149 = and i32 %131, -17
  %150 = icmp eq i32 %149, 4
  br i1 %150, label %.preheader186, label %171

.preheader186:                                    ; preds = %._crit_edge232
  %.not183239 = icmp eq ptr %148, %130
  br i1 %.not183239, label %._crit_edge243, label %.lr.ph242

.lr.ph242:                                        ; preds = %.preheader186, %.lr.ph242
  %.4241 = phi ptr [ %152, %.lr.ph242 ], [ %148, %.preheader186 ]
  %.6153240 = phi i32 [ %151, %.lr.ph242 ], [ %135, %.preheader186 ]
  %151 = add nsw i32 %.6153240, 1
  %152 = load ptr, ptr %.4241, align 8, !tbaa !42
  %.not183 = icmp eq ptr %152, %130
  br i1 %.not183, label %._crit_edge243, label %.lr.ph242, !llvm.loop !43

._crit_edge243:                                   ; preds = %.lr.ph242, %.preheader186
  %.6153.lcssa = phi i32 [ %135, %.preheader186 ], [ %151, %.lr.ph242 ]
  %.4.lcssa = phi ptr [ %148, %.preheader186 ], [ %152, %.lr.ph242 ]
  tail call void @vtmove(i32 noundef %.6153.lcssa, i32 noundef 0)
  %153 = load ptr, ptr @vscreen, align 8, !tbaa !9
  %154 = sext i32 %.6153.lcssa to i64
  %155 = getelementptr inbounds ptr, ptr %153, i64 %154
  %156 = load ptr, ptr %155, align 8, !tbaa !9
  store i32 0, ptr %156, align 4, !tbaa !39
  %157 = getelementptr inbounds i8, ptr %156, i64 4
  %158 = load i32, ptr %157, align 4, !tbaa !5
  %159 = and i32 %158, -4
  %160 = or disjoint i32 %159, 1
  store i32 %160, ptr %157, align 4, !tbaa !5
  %161 = getelementptr inbounds i8, ptr %.4.lcssa, i64 18
  %162 = load i16, ptr %161, align 2, !tbaa !44
  %.not274 = icmp eq i16 %162, 0
  br i1 %.not274, label %._crit_edge249, label %.lr.ph248

.lr.ph248:                                        ; preds = %._crit_edge243
  %163 = getelementptr inbounds i8, ptr %.4.lcssa, i64 20
  br label %164

164:                                              ; preds = %.lr.ph248, %164
  %indvars.iv292 = phi i64 [ 0, %.lr.ph248 ], [ %indvars.iv.next293, %164 ]
  %165 = getelementptr inbounds [32768 x i8], ptr %163, i64 0, i64 %indvars.iv292
  %166 = load i8, ptr %165, align 1, !tbaa !16
  %167 = zext i8 %166 to i32
  tail call void @vvtputc(i32 noundef %167, i32 noundef %.0155)
  %indvars.iv.next293 = add nuw nsw i64 %indvars.iv292, 1
  %168 = load i16, ptr %161, align 2, !tbaa !44
  %169 = zext i16 %168 to i64
  %170 = icmp ult i64 %indvars.iv.next293, %169
  br i1 %170, label %164, label %._crit_edge249, !llvm.loop !45

._crit_edge249:                                   ; preds = %164, %._crit_edge243
  tail call void @vvtputc(i32 noundef 10, i32 noundef %.0155)
  tail call void @vteeol()
  br label %.loopexit

171:                                              ; preds = %._crit_edge232
  %172 = and i32 %131, 12
  %.not181 = icmp ne i32 %172, 0
  %173 = icmp sgt i32 %132, 0
  %or.cond332 = and i1 %.not181, %173
  br i1 %or.cond332, label %.lr.ph238, label %.loopexit

.lr.ph238:                                        ; preds = %171
  %174 = getelementptr inbounds i8, ptr %71, i64 40
  %175 = sext i32 %135 to i64
  br label %176

176:                                              ; preds = %.lr.ph238, %197
  %indvars.iv289 = phi i64 [ %175, %.lr.ph238 ], [ %indvars.iv.next290, %197 ]
  %.5237 = phi ptr [ %148, %.lr.ph238 ], [ %.6, %197 ]
  %177 = trunc nsw i64 %indvars.iv289 to i32
  tail call void @vtmove(i32 noundef %177, i32 noundef 0)
  %178 = load ptr, ptr @vscreen, align 8, !tbaa !9
  %179 = getelementptr inbounds ptr, ptr %178, i64 %indvars.iv289
  %180 = load ptr, ptr %179, align 8, !tbaa !9
  store i32 0, ptr %180, align 4, !tbaa !39
  %181 = getelementptr inbounds i8, ptr %180, i64 4
  %182 = load i32, ptr %181, align 4, !tbaa !5
  %183 = and i32 %182, -4
  %184 = or disjoint i32 %183, 1
  store i32 %184, ptr %181, align 4, !tbaa !5
  %185 = load ptr, ptr %174, align 8, !tbaa !29
  %.not182 = icmp eq ptr %.5237, %185
  br i1 %.not182, label %197, label %.preheader185

.preheader185:                                    ; preds = %176
  %186 = getelementptr inbounds i8, ptr %.5237, i64 18
  %187 = load i16, ptr %186, align 2, !tbaa !44
  %.not273 = icmp eq i16 %187, 0
  br i1 %.not273, label %._crit_edge235, label %.lr.ph234

.lr.ph234:                                        ; preds = %.preheader185
  %188 = getelementptr inbounds i8, ptr %.5237, i64 20
  br label %189

189:                                              ; preds = %.lr.ph234, %189
  %indvars.iv286 = phi i64 [ 0, %.lr.ph234 ], [ %indvars.iv.next287, %189 ]
  %190 = getelementptr inbounds [32768 x i8], ptr %188, i64 0, i64 %indvars.iv286
  %191 = load i8, ptr %190, align 1, !tbaa !16
  %192 = zext i8 %191 to i32
  tail call void @vvtputc(i32 noundef %192, i32 noundef %.0155)
  %indvars.iv.next287 = add nuw nsw i64 %indvars.iv286, 1
  %193 = load i16, ptr %186, align 2, !tbaa !44
  %194 = zext i16 %193 to i64
  %195 = icmp ult i64 %indvars.iv.next287, %194
  br i1 %195, label %189, label %._crit_edge235, !llvm.loop !46

._crit_edge235:                                   ; preds = %189, %.preheader185
  tail call void @vvtputc(i32 noundef 10, i32 noundef %.0155)
  %196 = load ptr, ptr %.5237, align 8, !tbaa !42
  br label %197

197:                                              ; preds = %._crit_edge235, %176
  %.6 = phi ptr [ %196, %._crit_edge235 ], [ %.5237, %176 ]
  tail call void @vteeol()
  %indvars.iv.next290 = add nsw i64 %indvars.iv289, 1
  %198 = load i32, ptr %134, align 4, !tbaa !38
  %199 = load i32, ptr %136, align 8, !tbaa !28
  %200 = add nsw i32 %199, %198
  %201 = sext i32 %200 to i64
  %202 = icmp slt i64 %indvars.iv.next290, %201
  br i1 %202, label %176, label %.loopexit, !llvm.loop !47

.loopexit:                                        ; preds = %197, %171, %._crit_edge249
  %203 = load i32, ptr %85, align 4, !tbaa !26
  %204 = and i32 %203, 16
  %.not184 = icmp eq i32 %204, 0
  br i1 %.not184, label %206, label %205

205:                                              ; preds = %.loopexit
  tail call void @modeline(ptr noundef nonnull %.0146252)
  br label %206

206:                                              ; preds = %205, %.loopexit
  store i32 0, ptr %85, align 4, !tbaa !26
  %207 = getelementptr inbounds i8, ptr %.0146252, i64 64
  store i32 0, ptr %207, align 8, !tbaa !32
  br label %208

208:                                              ; preds = %206, %82
  %.0146 = load ptr, ptr %.0146252, align 8, !tbaa !9
  %.not172 = icmp eq ptr %.0146, null
  br i1 %.not172, label %._crit_edge255, label %.lr.ph254, !llvm.loop !48

._crit_edge255:                                   ; preds = %208, %69
  %209 = load i32, ptr @sgarbf, align 4, !tbaa !5
  %.not173 = icmp eq i32 %209, 0
  br i1 %.not173, label %236, label %.preheader

.preheader:                                       ; preds = %._crit_edge255
  %210 = load i32, ptr @term, align 8, !tbaa !49
  %211 = icmp sgt i32 %210, 0
  br i1 %211, label %.lr.ph261.preheader, label %._crit_edge262

.lr.ph261.preheader:                              ; preds = %.preheader
  %.pre305 = load i32, ptr getelementptr inbounds (i8, ptr @term, i64 4), align 4, !tbaa !19
  br label %.lr.ph261

.lr.ph261:                                        ; preds = %.lr.ph261.preheader, %._crit_edge259
  %212 = phi i32 [ %210, %.lr.ph261.preheader ], [ %230, %._crit_edge259 ]
  %213 = phi i32 [ %.pre305, %.lr.ph261.preheader ], [ %231, %._crit_edge259 ]
  %indvars.iv298 = phi i64 [ 0, %.lr.ph261.preheader ], [ %indvars.iv.next299, %._crit_edge259 ]
  %214 = load ptr, ptr @vscreen, align 8, !tbaa !9
  %215 = getelementptr inbounds ptr, ptr %214, i64 %indvars.iv298
  %216 = load ptr, ptr %215, align 8, !tbaa !9
  %217 = getelementptr inbounds i8, ptr %216, i64 4
  %218 = load i32, ptr %217, align 4, !tbaa !50
  %219 = or i32 %218, 1
  store i32 %219, ptr %217, align 4, !tbaa !50
  %220 = icmp sgt i32 %213, 0
  br i1 %220, label %.lr.ph258, label %._crit_edge259

.lr.ph258:                                        ; preds = %.lr.ph261
  %221 = load ptr, ptr @pscreen, align 8, !tbaa !9
  %222 = getelementptr inbounds ptr, ptr %221, i64 %indvars.iv298
  %223 = load ptr, ptr %222, align 8, !tbaa !9
  %224 = getelementptr inbounds i8, ptr %223, i64 8
  br label %225

225:                                              ; preds = %.lr.ph258, %225
  %indvars.iv295 = phi i64 [ 0, %.lr.ph258 ], [ %indvars.iv.next296, %225 ]
  %226 = getelementptr inbounds [32768 x i8], ptr %224, i64 0, i64 %indvars.iv295
  store i8 32, ptr %226, align 1, !tbaa !16
  %indvars.iv.next296 = add nuw nsw i64 %indvars.iv295, 1
  %227 = load i32, ptr getelementptr inbounds (i8, ptr @term, i64 4), align 4, !tbaa !19
  %228 = sext i32 %227 to i64
  %229 = icmp slt i64 %indvars.iv.next296, %228
  br i1 %229, label %225, label %._crit_edge259.loopexit, !llvm.loop !51

._crit_edge259.loopexit:                          ; preds = %225
  %.pre306 = load i32, ptr @term, align 8, !tbaa !49
  br label %._crit_edge259

._crit_edge259:                                   ; preds = %._crit_edge259.loopexit, %.lr.ph261
  %230 = phi i32 [ %.pre306, %._crit_edge259.loopexit ], [ %212, %.lr.ph261 ]
  %231 = phi i32 [ %227, %._crit_edge259.loopexit ], [ %213, %.lr.ph261 ]
  %indvars.iv.next299 = add nuw nsw i64 %indvars.iv298, 1
  %232 = sext i32 %230 to i64
  %233 = icmp slt i64 %indvars.iv.next299, %232
  br i1 %233, label %.lr.ph261, label %._crit_edge262, !llvm.loop !52

._crit_edge262:                                   ; preds = %._crit_edge259, %.preheader
  tail call void @movecursor(i32 noundef 0, i32 noundef 0)
  %234 = load ptr, ptr getelementptr inbounds (i8, ptr @term, i64 64), align 8, !tbaa !53
  %235 = tail call i32 (...) %234() #2
  store i32 0, ptr @sgarbf, align 4, !tbaa !5
  store i32 0, ptr @mpresf, align 4, !tbaa !5
  br label %236

236:                                              ; preds = %._crit_edge262, %._crit_edge255
  %237 = load i32, ptr @term, align 8, !tbaa !49
  %238 = icmp sgt i32 %237, 0
  br i1 %238, label %.lr.ph265.preheader, label %._crit_edge266

.lr.ph265.preheader:                              ; preds = %236
  %.pre308 = load ptr, ptr @vscreen, align 8, !tbaa !9
  br label %.lr.ph265

.lr.ph265:                                        ; preds = %.lr.ph265.preheader, %257
  %239 = phi i32 [ %237, %.lr.ph265.preheader ], [ %258, %257 ]
  %240 = phi ptr [ %.pre308, %.lr.ph265.preheader ], [ %259, %257 ]
  %indvars.iv301 = phi i64 [ 0, %.lr.ph265.preheader ], [ %indvars.iv.next302, %257 ]
  %241 = getelementptr inbounds ptr, ptr %240, i64 %indvars.iv301
  %242 = load ptr, ptr %241, align 8, !tbaa !9
  %243 = getelementptr inbounds i8, ptr %242, i64 4
  %244 = load i32, ptr %243, align 4, !tbaa !5
  %245 = and i32 %244, 1
  %246 = or i32 %245, %.1145.lcssa317
  %or.cond3.not = icmp eq i32 %246, 0
  br i1 %or.cond3.not, label %257, label %247

247:                                              ; preds = %.lr.ph265
  %248 = load ptr, ptr getelementptr inbounds (i8, ptr @term, i64 96), align 8, !tbaa !54
  %249 = tail call i32 (...) %248() #2
  %.not175 = icmp eq i32 %249, 0
  br i1 %.not175, label %250, label %._crit_edge266

250:                                              ; preds = %247
  %251 = load i32, ptr %243, align 4, !tbaa !5
  %252 = and i32 %251, -2
  store i32 %252, ptr %243, align 4, !tbaa !5
  %253 = load ptr, ptr @pscreen, align 8, !tbaa !9
  %254 = getelementptr inbounds ptr, ptr %253, i64 %indvars.iv301
  %255 = load ptr, ptr %254, align 8, !tbaa !9
  %256 = trunc nuw nsw i64 %indvars.iv301 to i32
  tail call void @updateline(i32 noundef %256, ptr noundef nonnull %242, ptr noundef %255)
  %.pre307 = load ptr, ptr @vscreen, align 8, !tbaa !9
  %.pre309 = load i32, ptr @term, align 8, !tbaa !49
  br label %257

257:                                              ; preds = %250, %.lr.ph265
  %258 = phi i32 [ %.pre309, %250 ], [ %239, %.lr.ph265 ]
  %259 = phi ptr [ %.pre307, %250 ], [ %240, %.lr.ph265 ]
  %indvars.iv.next302 = add nuw nsw i64 %indvars.iv301, 1
  %260 = sext i32 %258 to i64
  %261 = icmp slt i64 %indvars.iv.next302, %260
  br i1 %261, label %.lr.ph265, label %._crit_edge266, !llvm.loop !55

._crit_edge266:                                   ; preds = %257, %247, %236
  %262 = load ptr, ptr @curwp, align 8, !tbaa !9
  %263 = getelementptr inbounds i8, ptr %262, i64 16
  %264 = load ptr, ptr %263, align 8, !tbaa !37
  %265 = getelementptr inbounds i8, ptr %262, i64 52
  %266 = load i32, ptr %265, align 4, !tbaa !38
  store i32 %266, ptr @currow, align 4, !tbaa !5
  %267 = getelementptr inbounds i8, ptr %262, i64 24
  %268 = load ptr, ptr %267, align 8, !tbaa !11
  %.not176268 = icmp eq ptr %264, %268
  br i1 %.not176268, label %272, label %.lr.ph271

.lr.ph271:                                        ; preds = %._crit_edge266, %.lr.ph271
  %.7269 = phi ptr [ %271, %.lr.ph271 ], [ %264, %._crit_edge266 ]
  %269 = phi i32 [ %270, %.lr.ph271 ], [ %266, %._crit_edge266 ]
  %270 = add nsw i32 %269, 1
  %271 = load ptr, ptr %.7269, align 8, !tbaa !42
  %.not176 = icmp eq ptr %271, %268
  br i1 %.not176, label %._crit_edge272, label %.lr.ph271, !llvm.loop !56

._crit_edge272:                                   ; preds = %.lr.ph271
  store i32 %270, ptr @currow, align 4, !tbaa !5
  br label %272

272:                                              ; preds = %._crit_edge272, %._crit_edge266
  %273 = phi i32 [ %270, %._crit_edge272 ], [ %266, %._crit_edge266 ]
  %274 = load i32, ptr @curcol, align 4, !tbaa !5
  tail call void @movecursor(i32 noundef %273, i32 noundef %274)
  %275 = load ptr, ptr getelementptr inbounds (i8, ptr @term, i64 40), align 8, !tbaa !57
  %276 = tail call i32 (...) %275() #2
  br label %277

277:                                              ; preds = %4, %272
  ret void
}

; Function Attrs: nounwind uwtable
declare dso_local void @mlwrite(ptr noundef, ...) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
declare dso_local void @vteeol() local_unnamed_addr #0

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

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

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smin.i32(i32, i32) #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.vector.reduce.add.v4i32(<4 x i32>) #1

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 speculatable willreturn memory(none) }
attributes #2 = { 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 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!12, !6, i64 32}
!16 = !{!7, !7, i64 0}
!17 = distinct !{!17, !14}
!18 = !{!12, !6, i64 60}
!19 = !{!20, !6, i64 4}
!20 = !{!"", !6, i64 0, !6, i64 4, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96}
!21 = distinct !{!21, !14, !22, !23}
!22 = !{!"llvm.loop.isvectorized", i32 1}
!23 = !{!"llvm.loop.unroll.runtime.disable"}
!24 = distinct !{!24, !14}
!25 = distinct !{!25, !14, !23, !22}
!26 = !{!12, !6, i64 68}
!27 = !{!12, !10, i64 8}
!28 = !{!12, !6, i64 56}
!29 = !{!30, !10, i64 40}
!30 = !{!"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}
!31 = distinct !{!31, !14}
!32 = !{!12, !6, i64 64}
!33 = distinct !{!33, !14}
!34 = !{!35, !10, i64 8}
!35 = !{!"LINE", !10, i64 0, !10, i64 8, !36, i64 16, !36, i64 18, !7, i64 20}
!36 = !{!"short", !7, i64 0}
!37 = !{!12, !10, i64 16}
!38 = !{!12, !6, i64 52}
!39 = !{!40, !6, i64 0}
!40 = !{!"VIDEO", !6, i64 0, !6, i64 4, !7, i64 8}
!41 = distinct !{!41, !14}
!42 = !{!35, !10, i64 0}
!43 = distinct !{!43, !14}
!44 = !{!35, !36, i64 18}
!45 = distinct !{!45, !14}
!46 = distinct !{!46, !14}
!47 = distinct !{!47, !14}
!48 = distinct !{!48, !14}
!49 = !{!20, !6, i64 0}
!50 = !{!40, !6, i64 4}
!51 = distinct !{!51, !14}
!52 = distinct !{!52, !14}
!53 = !{!20, !10, i64 64}
!54 = !{!20, !10, i64 96}
!55 = distinct !{!55, !14}
!56 = distinct !{!56, !14}
!57 = !{!20, !10, i64 40}


; Effective O3 passes: BDCEPass,CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalDCEPass,GlobalOptPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,ReassociatePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass