; LLVM IR from freakout42/macrocalc :: arx/src (cur_gmnu)

; 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._win_st = type { i16, i16, i16, i16, i16, i16, i16, i32, i32, i8, i8, i8, i8, i8, i8, i8, i8, i8, i32, ptr, i16, i16, i32, i32, ptr, %struct.pdat, i16 }
%struct.pdat = type { i16, i16, i16, i16, i16, i16 }

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

35:                                               ; preds = %326, %5
  %36 = load ptr, ptr %6, align 8, !tbaa !5
  %37 = load i32, ptr %7, align 4, !tbaa !9
  %38 = load i32, ptr %8, align 4, !tbaa !9
  %39 = call i32 @wmove(ptr noundef %36, i32 noundef %37, i32 noundef %38)
  store i32 0, ptr %12, align 4, !tbaa !9
  %40 = load ptr, ptr %10, align 8, !tbaa !5
  %41 = getelementptr inbounds [255 x ptr], ptr %24, i64 0, i64 0
  store ptr %40, ptr %41, align 16, !tbaa !5
  %42 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %42, ptr %17, align 8, !tbaa !5
  br label %43

43:                                               ; preds = %153, %35
  %44 = load ptr, ptr %17, align 8, !tbaa !5
  %45 = load i8, ptr %44, align 1, !tbaa !11
  %46 = icmp ne i8 %45, 0
  br i1 %46, label %47, label %156

47:                                               ; preds = %43
  %48 = call ptr @__ctype_b_loc() #10
  %49 = load ptr, ptr %48, align 8, !tbaa !5
  %50 = load ptr, ptr %17, align 8, !tbaa !5
  %51 = load i8, ptr %50, align 1, !tbaa !11
  %52 = sext i8 %51 to i32
  %53 = sext i32 %52 to i64
  %54 = getelementptr inbounds i16, ptr %49, i64 %53
  %55 = load i16, ptr %54, align 2, !tbaa !12
  %56 = zext i16 %55 to i32
  %57 = and i32 %56, 256
  %58 = icmp ne i32 %57, 0
  br i1 %58, label %71, label %59

59:                                               ; preds = %47
  %60 = call ptr @__ctype_b_loc() #10
  %61 = load ptr, ptr %60, align 8, !tbaa !5
  %62 = load ptr, ptr %17, align 8, !tbaa !5
  %63 = load i8, ptr %62, align 1, !tbaa !11
  %64 = sext i8 %63 to i32
  %65 = sext i32 %64 to i64
  %66 = getelementptr inbounds i16, ptr %61, i64 %65
  %67 = load i16, ptr %66, align 2, !tbaa !12
  %68 = zext i16 %67 to i32
  %69 = and i32 %68, 4
  %70 = icmp ne i32 %69, 0
  br i1 %70, label %71, label %104

71:                                               ; preds = %59, %47
  %72 = load ptr, ptr %17, align 8, !tbaa !5
  %73 = load i8, ptr %72, align 1, !tbaa !11
  %74 = load i32, ptr %12, align 4, !tbaa !9
  %75 = sext i32 %74 to i64
  %76 = getelementptr inbounds [255 x i8], ptr %23, i64 0, i64 %75
  store i8 %73, ptr %76, align 1, !tbaa !11
  %77 = load ptr, ptr %6, align 8, !tbaa !5
  %78 = call i32 @cur_satt(ptr noundef %77, i32 noundef 131072)
  %79 = load i32, ptr %12, align 4, !tbaa !9
  %80 = load i32, ptr %11, align 4, !tbaa !9
  %81 = icmp eq i32 %79, %80
  br i1 %81, label %82, label %103

82:                                               ; preds = %71
  %83 = load ptr, ptr %6, align 8, !tbaa !5
  %84 = icmp ne ptr null, %83
  br i1 %84, label %85, label %90

85:                                               ; preds = %82
  %86 = load ptr, ptr %6, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct._win_st, ptr %86, i32 0, i32 0
  %88 = load i16, ptr %87, align 8, !tbaa !14
  %89 = sext i16 %88 to i32
  br label %91

90:                                               ; preds = %82
  br label %91

91:                                               ; preds = %90, %85
  %92 = phi i32 [ %89, %85 ], [ -1, %90 ]
  store i32 %92, ptr %20, align 4, !tbaa !9
  %93 = load ptr, ptr %6, align 8, !tbaa !5
  %94 = icmp ne ptr null, %93
  br i1 %94, label %95, label %100

95:                                               ; preds = %91
  %96 = load ptr, ptr %6, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct._win_st, ptr %96, i32 0, i32 1
  %98 = load i16, ptr %97, align 2, !tbaa !18
  %99 = sext i16 %98 to i32
  br label %101

100:                                              ; preds = %91
  br label %101

101:                                              ; preds = %100, %95
  %102 = phi i32 [ %99, %95 ], [ -1, %100 ]
  store i32 %102, ptr %21, align 4, !tbaa !9
  br label %103

103:                                              ; preds = %101, %71
  br label %115

104:                                              ; preds = %59
  %105 = load i32, ptr %12, align 4, !tbaa !9
  %106 = load i32, ptr %11, align 4, !tbaa !9
  %107 = icmp eq i32 %105, %106
  br i1 %107, label %108, label %111

108:                                              ; preds = %104
  %109 = load ptr, ptr %6, align 8, !tbaa !5
  %110 = call i32 @cur_satt(ptr noundef %109, i32 noundef 262144)
  br label %114

111:                                              ; preds = %104
  %112 = load ptr, ptr %6, align 8, !tbaa !5
  %113 = call i32 @cur_satt(ptr noundef %112, i32 noundef 0)
  br label %114

114:                                              ; preds = %111, %108
  br label %115

115:                                              ; preds = %114, %103
  %116 = load ptr, ptr %17, align 8, !tbaa !5
  %117 = load i8, ptr %116, align 1, !tbaa !11
  %118 = sext i8 %117 to i32
  %119 = icmp eq i32 %118, 32
  br i1 %119, label %120, label %133

120:                                              ; preds = %115
  %121 = load ptr, ptr %6, align 8, !tbaa !5
  %122 = call i32 @cur_satt(ptr noundef %121, i32 noundef 0)
  %123 = load i32, ptr %12, align 4, !tbaa !9
  %124 = add nsw i32 %123, 1
  store i32 %124, ptr %12, align 4, !tbaa !9
  %125 = load i32, ptr %12, align 4, !tbaa !9
  %126 = sext i32 %125 to i64
  %127 = getelementptr inbounds [255 x i8], ptr %23, i64 0, i64 %126
  store i8 1, ptr %127, align 1, !tbaa !11
  %128 = load ptr, ptr %17, align 8, !tbaa !5
  %129 = getelementptr inbounds i8, ptr %128, i64 1
  %130 = load i32, ptr %12, align 4, !tbaa !9
  %131 = sext i32 %130 to i64
  %132 = getelementptr inbounds [255 x ptr], ptr %24, i64 0, i64 %131
  store ptr %129, ptr %132, align 8, !tbaa !5
  br label %133

133:                                              ; preds = %120, %115
  %134 = load ptr, ptr %17, align 8, !tbaa !5
  %135 = load ptr, ptr %22, align 8, !tbaa !5
  %136 = icmp uge ptr %134, %135
  br i1 %136, label %137, label %152

137:                                              ; preds = %133
  %138 = load ptr, ptr %17, align 8, !tbaa !5
  %139 = load ptr, ptr %22, align 8, !tbaa !5
  %140 = ptrtoint ptr %138 to i64
  %141 = ptrtoint ptr %139 to i64
  %142 = sub i64 %140, %141
  %143 = load i32, ptr %9, align 4, !tbaa !9
  %144 = sext i32 %143 to i64
  %145 = icmp slt i64 %142, %144
  br i1 %145, label %146, label %152

146:                                              ; preds = %137
  %147 = load ptr, ptr %6, align 8, !tbaa !5
  %148 = load ptr, ptr %17, align 8, !tbaa !5
  %149 = load i8, ptr %148, align 1, !tbaa !11
  %150 = sext i8 %149 to i32
  %151 = call i32 @waddch(ptr noundef %147, i32 noundef %150)
  br label %152

152:                                              ; preds = %146, %137, %133
  br label %153

153:                                              ; preds = %152
  %154 = load ptr, ptr %17, align 8, !tbaa !5
  %155 = getelementptr inbounds i8, ptr %154, i32 1
  store ptr %155, ptr %17, align 8, !tbaa !5
  br label %43, !llvm.loop !19

156:                                              ; preds = %43
  %157 = load i32, ptr %12, align 4, !tbaa !9
  store i32 %157, ptr %13, align 4, !tbaa !9
  %158 = load ptr, ptr %6, align 8, !tbaa !5
  %159 = call i32 @cur_satt(ptr noundef %158, i32 noundef 0)
  %160 = load ptr, ptr %6, align 8, !tbaa !5
  %161 = load i32, ptr %20, align 4, !tbaa !9
  %162 = load i32, ptr %21, align 4, !tbaa !9
  %163 = call i32 @wmove(ptr noundef %160, i32 noundef %161, i32 noundef %162)
  %164 = load ptr, ptr %6, align 8, !tbaa !5
  %165 = call i32 @cur_getk(ptr noundef %164)
  store i32 %165, ptr %15, align 4, !tbaa !9
  %166 = load i32, ptr %15, align 4, !tbaa !9
  %167 = icmp sle i32 %166, 255
  br i1 %167, label %168, label %205

168:                                              ; preds = %156
  %169 = call ptr @__ctype_b_loc() #10
  %170 = load ptr, ptr %169, align 8, !tbaa !5
  %171 = load i32, ptr %15, align 4, !tbaa !9
  %172 = sext i32 %171 to i64
  %173 = getelementptr inbounds i16, ptr %170, i64 %172
  %174 = load i16, ptr %173, align 2, !tbaa !12
  %175 = zext i16 %174 to i32
  %176 = and i32 %175, 1024
  %177 = icmp ne i32 %176, 0
  br i1 %177, label %178, label %205

178:                                              ; preds = %168
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #8
  %179 = load i32, ptr %15, align 4, !tbaa !9
  %180 = call i1 @llvm.is.constant.i32(i32 %179)
  br i1 %180, label %181, label %199

181:                                              ; preds = %178
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #8
  %182 = load i32, ptr %15, align 4, !tbaa !9
  store i32 %182, ptr %26, align 4, !tbaa !9
  %183 = load i32, ptr %26, align 4, !tbaa !9
  %184 = icmp slt i32 %183, -128
  br i1 %184, label %188, label %185

185:                                              ; preds = %181
  %186 = load i32, ptr %26, align 4, !tbaa !9
  %187 = icmp sgt i32 %186, 255
  br i1 %187, label %188, label %190

188:                                              ; preds = %185, %181
  %189 = load i32, ptr %26, align 4, !tbaa !9
  br label %197

190:                                              ; preds = %185
  %191 = call ptr @__ctype_toupper_loc() #10
  %192 = load ptr, ptr %191, align 8, !tbaa !5
  %193 = load i32, ptr %26, align 4, !tbaa !9
  %194 = sext i32 %193 to i64
  %195 = getelementptr inbounds i32, ptr %192, i64 %194
  %196 = load i32, ptr %195, align 4, !tbaa !9
  br label %197

197:                                              ; preds = %190, %188
  %198 = phi i32 [ %189, %188 ], [ %196, %190 ]
  store i32 %198, ptr %25, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #8
  br label %202

199:                                              ; preds = %178
  %200 = load i32, ptr %15, align 4, !tbaa !9
  %201 = call i32 @toupper(i32 noundef %200) #9
  store i32 %201, ptr %25, align 4, !tbaa !9
  br label %202

202:                                              ; preds = %199, %197
  %203 = load i32, ptr %25, align 4, !tbaa !9
  store i32 %203, ptr %27, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #8
  %204 = load i32, ptr %27, align 4, !tbaa !9
  store i32 %204, ptr %15, align 4, !tbaa !9
  br label %205

205:                                              ; preds = %202, %168, %156
  %206 = load i32, ptr %15, align 4, !tbaa !9
  switch i32 %206, label %224 [
    i32 261, label %207
    i32 260, label %214
    i32 27, label %223
    i32 343, label %243
  ]

207:                                              ; preds = %205
  %208 = load i32, ptr %11, align 4, !tbaa !9
  %209 = add nsw i32 %208, 1
  store i32 %209, ptr %11, align 4, !tbaa !9
  %210 = load i32, ptr %13, align 4, !tbaa !9
  %211 = icmp sgt i32 %209, %210
  br i1 %211, label %212, label %213

212:                                              ; preds = %207
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %213

213:                                              ; preds = %212, %207
  br label %244

214:                                              ; preds = %205
  %215 = load i32, ptr %11, align 4, !tbaa !9
  %216 = icmp sgt i32 %215, 0
  br i1 %216, label %217, label %220

217:                                              ; preds = %214
  %218 = load i32, ptr %11, align 4, !tbaa !9
  %219 = add nsw i32 %218, -1
  store i32 %219, ptr %11, align 4, !tbaa !9
  br label %222

220:                                              ; preds = %214
  %221 = load i32, ptr %13, align 4, !tbaa !9
  store i32 %221, ptr %11, align 4, !tbaa !9
  br label %222

222:                                              ; preds = %220, %217
  br label %244

223:                                              ; preds = %205
  store i32 27, ptr %16, align 4, !tbaa !9
  br label %244

224:                                              ; preds = %205
  store i32 0, ptr %14, align 4, !tbaa !9
  br label %225

225:                                              ; preds = %239, %224
  %226 = load i32, ptr %14, align 4, !tbaa !9
  %227 = icmp slt i32 %226, 255
  br i1 %227, label %228, label %242

228:                                              ; preds = %225
  %229 = load i32, ptr %14, align 4, !tbaa !9
  %230 = sext i32 %229 to i64
  %231 = getelementptr inbounds [255 x i8], ptr %23, i64 0, i64 %230
  %232 = load i8, ptr %231, align 1, !tbaa !11
  %233 = sext i8 %232 to i32
  %234 = load i32, ptr %15, align 4, !tbaa !9
  %235 = icmp eq i32 %233, %234
  br i1 %235, label %236, label %238

236:                                              ; preds = %228
  %237 = load i32, ptr %14, align 4, !tbaa !9
  store i32 %237, ptr %11, align 4, !tbaa !9
  store i32 343, ptr %16, align 4, !tbaa !9
  br label %242

238:                                              ; preds = %228
  br label %239

239:                                              ; preds = %238
  %240 = load i32, ptr %14, align 4, !tbaa !9
  %241 = add nsw i32 %240, 1
  store i32 %241, ptr %14, align 4, !tbaa !9
  br label %225, !llvm.loop !21

242:                                              ; preds = %236, %225
  br label %244

243:                                              ; preds = %205
  store i32 343, ptr %16, align 4, !tbaa !9
  br label %244

244:                                              ; preds = %243, %242, %223, %222, %213
  %245 = load i32, ptr %11, align 4, !tbaa !9
  %246 = sext i32 %245 to i64
  %247 = getelementptr inbounds [255 x ptr], ptr %24, i64 0, i64 %246
  %248 = load ptr, ptr %247, align 8, !tbaa !5
  %249 = call ptr @strchr(ptr noundef %248, i32 noundef 32) #9
  store ptr %249, ptr %18, align 8, !tbaa !5
  %250 = load ptr, ptr %18, align 8, !tbaa !5
  %251 = icmp eq ptr %250, null
  br i1 %251, label %252, label %254

252:                                              ; preds = %244
  %253 = load ptr, ptr %19, align 8, !tbaa !5
  store ptr %253, ptr %18, align 8, !tbaa !5
  br label %257

254:                                              ; preds = %244
  %255 = load ptr, ptr %18, align 8, !tbaa !5
  %256 = getelementptr inbounds i8, ptr %255, i32 -1
  store ptr %256, ptr %18, align 8, !tbaa !5
  br label %257

257:                                              ; preds = %254, %252
  %258 = load i32, ptr %11, align 4, !tbaa !9
  %259 = icmp eq i32 %258, 0
  br i1 %259, label %260, label %262

260:                                              ; preds = %257
  %261 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %261, ptr %22, align 8, !tbaa !5
  br label %325

262:                                              ; preds = %257
  %263 = load i32, ptr %11, align 4, !tbaa !9
  %264 = sext i32 %263 to i64
  %265 = getelementptr inbounds [255 x ptr], ptr %24, i64 0, i64 %264
  %266 = load ptr, ptr %265, align 8, !tbaa !5
  %267 = load ptr, ptr %22, align 8, !tbaa !5
  %268 = icmp ult ptr %266, %267
  br i1 %268, label %269, label %288

269:                                              ; preds = %262
  %270 = load ptr, ptr %18, align 8, !tbaa !5
  %271 = load i32, ptr %9, align 4, !tbaa !9
  %272 = sext i32 %271 to i64
  %273 = sub i64 0, %272
  %274 = getelementptr inbounds i8, ptr %270, i64 %273
  %275 = load ptr, ptr %10, align 8, !tbaa !5
  %276 = icmp ult ptr %274, %275
  br i1 %276, label %277, label %279

277:                                              ; preds = %269
  %278 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %278, ptr %22, align 8, !tbaa !5
  br label %287

279:                                              ; preds = %269
  %280 = load ptr, ptr %18, align 8, !tbaa !5
  %281 = load i32, ptr %9, align 4, !tbaa !9
  %282 = sext i32 %281 to i64
  %283 = sub i64 0, %282
  %284 = getelementptr inbounds i8, ptr %280, i64 %283
  %285 = call ptr @strchr(ptr noundef %284, i32 noundef 32) #9
  %286 = getelementptr inbounds i8, ptr %285, i64 1
  store ptr %286, ptr %22, align 8, !tbaa !5
  br label %287

287:                                              ; preds = %279, %277
  br label %324

288:                                              ; preds = %262
  %289 = load ptr, ptr %18, align 8, !tbaa !5
  %290 = load ptr, ptr %22, align 8, !tbaa !5
  %291 = load i32, ptr %9, align 4, !tbaa !9
  %292 = sext i32 %291 to i64
  %293 = getelementptr inbounds i8, ptr %290, i64 %292
  %294 = icmp uge ptr %289, %293
  br i1 %294, label %295, label %323

295:                                              ; preds = %288
  %296 = load i32, ptr %11, align 4, !tbaa !9
  %297 = sext i32 %296 to i64
  %298 = getelementptr inbounds [255 x ptr], ptr %24, i64 0, i64 %297
  %299 = load ptr, ptr %298, align 8, !tbaa !5
  %300 = load i32, ptr %9, align 4, !tbaa !9
  %301 = sext i32 %300 to i64
  %302 = getelementptr inbounds i8, ptr %299, i64 %301
  %303 = load ptr, ptr %19, align 8, !tbaa !5
  %304 = icmp ugt ptr %302, %303
  br i1 %304, label %305, label %317

305:                                              ; preds = %295
  %306 = load ptr, ptr %19, align 8, !tbaa !5
  %307 = load i32, ptr %9, align 4, !tbaa !9
  %308 = sext i32 %307 to i64
  %309 = sub i64 0, %308
  %310 = getelementptr inbounds i8, ptr %306, i64 %309
  %311 = call ptr @strchr(ptr noundef %310, i32 noundef 32) #9
  %312 = getelementptr inbounds i8, ptr %311, i64 1
  store ptr %312, ptr %22, align 8, !tbaa !5
  %313 = load ptr, ptr %6, align 8, !tbaa !5
  %314 = load i32, ptr %7, align 4, !tbaa !9
  %315 = load i32, ptr %8, align 4, !tbaa !9
  %316 = load i32, ptr %9, align 4, !tbaa !9
  call void @clear_menu(ptr noundef %313, i32 noundef %314, i32 noundef %315, i32 noundef %316)
  br label %322

317:                                              ; preds = %295
  %318 = load i32, ptr %11, align 4, !tbaa !9
  %319 = sext i32 %318 to i64
  %320 = getelementptr inbounds [255 x ptr], ptr %24, i64 0, i64 %319
  %321 = load ptr, ptr %320, align 8, !tbaa !5
  store ptr %321, ptr %22, align 8, !tbaa !5
  br label %322

322:                                              ; preds = %317, %305
  br label %323

323:                                              ; preds = %322, %288
  br label %324

324:                                              ; preds = %323, %287
  br label %325

325:                                              ; preds = %324, %260
  br label %326

326:                                              ; preds = %325
  %327 = load i32, ptr %16, align 4, !tbaa !9
  %328 = icmp eq i32 %327, 0
  br i1 %328, label %35, label %329, !llvm.loop !22

329:                                              ; preds = %326
  %330 = load ptr, ptr %6, align 8, !tbaa !5
  %331 = load i32, ptr %7, align 4, !tbaa !9
  %332 = load i32, ptr %8, align 4, !tbaa !9
  %333 = load i32, ptr %9, align 4, !tbaa !9
  call void @clear_menu(ptr noundef %330, i32 noundef %331, i32 noundef %332, i32 noundef %333)
  %334 = load i32, ptr %16, align 4, !tbaa !9
  %335 = icmp eq i32 %334, 343
  br i1 %335, label %336, label %340

336:                                              ; preds = %329
  %337 = load i32, ptr %11, align 4, !tbaa !9
  %338 = add nsw i32 %337, 1
  %339 = sub nsw i32 0, %338
  br label %348

340:                                              ; preds = %329
  %341 = load i32, ptr %16, align 4, !tbaa !9
  %342 = icmp eq i32 %341, 27
  br i1 %342, label %343, label %344

343:                                              ; preds = %340
  br label %346

344:                                              ; preds = %340
  %345 = load i32, ptr %16, align 4, !tbaa !9
  br label %346

346:                                              ; preds = %344, %343
  %347 = phi i32 [ 0, %343 ], [ %345, %344 ]
  br label %348

348:                                              ; preds = %346, %336
  %349 = phi i32 [ %339, %336 ], [ %347, %346 ]
  call void @llvm.lifetime.end.p0(i64 2040, ptr %24) #8
  call void @llvm.lifetime.end.p0(i64 255, ptr %23) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #8
  ret i32 %349
}

; 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 nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #2

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

declare i32 @wmove(ptr noundef, i32 noundef, i32 noundef) #4

; Function Attrs: nounwind willreturn memory(none)
declare ptr @__ctype_b_loc() #5

declare i32 @cur_satt(ptr noundef, i32 noundef) #4

declare i32 @waddch(ptr noundef, i32 noundef) #4

declare i32 @cur_getk(ptr noundef) #4

; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none)
declare i1 @llvm.is.constant.i32(i32) #6

; Function Attrs: nounwind willreturn memory(none)
declare ptr @__ctype_toupper_loc() #5

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

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare i32 @toupper(i32 noundef) #7

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

; Function Attrs: nounwind uwtable
declare hidden void @clear_menu(ptr noundef, i32 noundef, i32 noundef, i32 noundef) #0

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 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #3 = { nounwind willreturn memory(read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { nounwind willreturn memory(none) "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 #6 = { convergent nocallback nofree nosync nounwind willreturn memory(none) }
attributes #7 = { inlinehint nounwind willreturn memory(read) 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 #8 = { nounwind }
attributes #9 = { nounwind willreturn memory(read) }
attributes #10 = { nounwind willreturn memory(none) }

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

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


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

; Function Attrs: nounwind uwtable
define dso_local i32 @cur_gmnu(ptr noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, ptr noundef %4) local_unnamed_addr #0 {
  %6 = alloca [255 x i8], align 16
  %7 = alloca [255 x ptr], align 16
  call void @llvm.lifetime.start.p0(i64 255, ptr nonnull %6) #7
  call void @llvm.lifetime.start.p0(i64 2040, ptr nonnull %7) #7
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(255) %6, i8 0, i64 255, i1 false)
  %8 = tail call i64 @strlen(ptr noundef nonnull dereferenceable(1) %4) #8
  %9 = getelementptr inbounds i8, ptr %4, i64 %8
  %10 = getelementptr inbounds i8, ptr %9, i64 -1
  %.not133 = icmp eq ptr %0, null
  %11 = getelementptr inbounds i8, ptr %0, i64 2
  %12 = sext i32 %3 to i64
  %13 = sub nsw i64 0, %12
  %14 = getelementptr inbounds i8, ptr %10, i64 %13
  br label %15

15:                                               ; preds = %132, %5
  %.0109 = phi i32 [ 0, %5 ], [ %.1110.lcssa, %132 ]
  %.0107 = phi i32 [ 0, %5 ], [ %.1108.lcssa, %132 ]
  %.0105 = phi ptr [ %4, %5 ], [ %.1106, %132 ]
  %.0 = phi i32 [ 0, %5 ], [ %.1, %132 ]
  %16 = tail call i32 @wmove(ptr noundef %0, i32 noundef %1, i32 noundef %2) #7
  store ptr %4, ptr %7, align 16, !tbaa !5
  %17 = load i8, ptr %4, align 1, !tbaa !9
  %.not139 = icmp eq i8 %17, 0
  br i1 %.not139, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %15
  %18 = tail call ptr @__ctype_b_loc() #9
  %19 = ptrtoint ptr %.0105 to i64
  br label %20

20:                                               ; preds = %.lr.ph, %60
  %21 = phi i8 [ %17, %.lr.ph ], [ %62, %60 ]
  %.0102143 = phi i32 [ 0, %.lr.ph ], [ %.1103, %60 ]
  %.1108142 = phi i32 [ %.0107, %.lr.ph ], [ %.2, %60 ]
  %.1110141 = phi i32 [ %.0109, %.lr.ph ], [ %.2111, %60 ]
  %.0114140 = phi ptr [ %4, %.lr.ph ], [ %61, %60 ]
  %22 = load ptr, ptr %18, align 8, !tbaa !5
  %23 = sext i8 %21 to i64
  %24 = getelementptr inbounds i16, ptr %22, i64 %23
  %25 = load i16, ptr %24, align 2, !tbaa !10
  %26 = and i16 %25, 260
  %or.cond = icmp eq i16 %26, 0
  br i1 %or.cond, label %37, label %27

27:                                               ; preds = %20
  %28 = sext i32 %.0102143 to i64
  %29 = getelementptr inbounds [255 x i8], ptr %6, i64 0, i64 %28
  store i8 %21, ptr %29, align 1, !tbaa !9
  %30 = tail call i32 @cur_satt(ptr noundef %0, i32 noundef 131072) #7
  %31 = icmp ne i32 %.0102143, %.0
  %brmerge = or i1 %31, %.not133
  %.1110141.mux = select i1 %31, i32 %.1110141, i32 -1
  %.1108142.mux = select i1 %31, i32 %.1108142, i32 -1
  br i1 %brmerge, label %.thread, label %32

32:                                               ; preds = %27
  %33 = load i16, ptr %0, align 8, !tbaa !12
  %34 = sext i16 %33 to i32
  %35 = load i16, ptr %11, align 2, !tbaa !17
  %36 = sext i16 %35 to i32
  br label %.thread

37:                                               ; preds = %20
  %38 = icmp eq i32 %.0102143, %.0
  br i1 %38, label %39, label %41

39:                                               ; preds = %37
  %40 = tail call i32 @cur_satt(ptr noundef %0, i32 noundef 262144) #7
  br label %.thread

41:                                               ; preds = %37
  %42 = tail call i32 @cur_satt(ptr noundef %0, i32 noundef 0) #7
  br label %.thread

.thread:                                          ; preds = %27, %32, %39, %41
  %.2111 = phi i32 [ %.1110141.mux, %27 ], [ %.1110141, %39 ], [ %.1110141, %41 ], [ %34, %32 ]
  %.2 = phi i32 [ %.1108142.mux, %27 ], [ %.1108142, %39 ], [ %.1108142, %41 ], [ %36, %32 ]
  %43 = load i8, ptr %.0114140, align 1, !tbaa !9
  %44 = icmp eq i8 %43, 32
  br i1 %44, label %45, label %52

45:                                               ; preds = %.thread
  %46 = tail call i32 @cur_satt(ptr noundef %0, i32 noundef 0) #7
  %47 = add nsw i32 %.0102143, 1
  %48 = sext i32 %47 to i64
  %49 = getelementptr inbounds [255 x i8], ptr %6, i64 0, i64 %48
  store i8 1, ptr %49, align 1, !tbaa !9
  %50 = getelementptr inbounds i8, ptr %.0114140, i64 1
  %51 = getelementptr inbounds [255 x ptr], ptr %7, i64 0, i64 %48
  store ptr %50, ptr %51, align 8, !tbaa !5
  br label %52

52:                                               ; preds = %45, %.thread
  %.1103 = phi i32 [ %47, %45 ], [ %.0102143, %.thread ]
  %.not134 = icmp uge ptr %.0114140, %.0105
  %53 = ptrtoint ptr %.0114140 to i64
  %54 = sub i64 %53, %19
  %55 = icmp slt i64 %54, %12
  %or.cond150 = select i1 %.not134, i1 %55, i1 false
  br i1 %or.cond150, label %56, label %60

56:                                               ; preds = %52
  %57 = load i8, ptr %.0114140, align 1, !tbaa !9
  %58 = sext i8 %57 to i32
  %59 = tail call i32 @waddch(ptr noundef %0, i32 noundef %58) #7
  br label %60

60:                                               ; preds = %52, %56
  %61 = getelementptr inbounds i8, ptr %.0114140, i64 1
  %62 = load i8, ptr %61, align 1, !tbaa !9
  %.not = icmp eq i8 %62, 0
  br i1 %.not, label %._crit_edge, label %20, !llvm.loop !18

._crit_edge:                                      ; preds = %60, %15
  %.1110.lcssa = phi i32 [ %.0109, %15 ], [ %.2111, %60 ]
  %.1108.lcssa = phi i32 [ %.0107, %15 ], [ %.2, %60 ]
  %.0102.lcssa = phi i32 [ 0, %15 ], [ %.1103, %60 ]
  %63 = tail call i32 @cur_satt(ptr noundef %0, i32 noundef 0) #7
  %64 = tail call i32 @wmove(ptr noundef %0, i32 noundef %.1110.lcssa, i32 noundef %.1108.lcssa) #7
  %65 = tail call i32 @cur_getk(ptr noundef %0) #7
  %66 = icmp slt i32 %65, 256
  br i1 %66, label %67, label %76

67:                                               ; preds = %._crit_edge
  %68 = tail call ptr @__ctype_b_loc() #9
  %69 = load ptr, ptr %68, align 8, !tbaa !5
  %70 = sext i32 %65 to i64
  %71 = getelementptr inbounds i16, ptr %69, i64 %70
  %72 = load i16, ptr %71, align 2, !tbaa !10
  %73 = and i16 %72, 1024
  %.not128 = icmp eq i16 %73, 0
  br i1 %.not128, label %76, label %74

74:                                               ; preds = %67
  %75 = tail call i32 @toupper(i32 noundef %65) #8
  br label %76

76:                                               ; preds = %74, %67, %._crit_edge
  %.0117 = phi i32 [ %65, %67 ], [ %65, %._crit_edge ], [ %75, %74 ]
  switch i32 %.0117, label %.preheader [
    i32 261, label %77
    i32 260, label %79
    i32 27, label %select.unfold
    i32 343, label %103
  ]

77:                                               ; preds = %76
  %78 = add nsw i32 %.0, 1
  %.not129 = icmp slt i32 %.0, %.0102.lcssa
  %spec.select162 = select i1 %.not129, i32 %78, i32 0
  br label %select.unfold

79:                                               ; preds = %76
  %80 = icmp sgt i32 %.0, 0
  %81 = add nsw i32 %.0, -1
  %spec.select = select i1 %80, i32 %81, i32 %.0102.lcssa
  br label %select.unfold

.preheader:                                       ; preds = %76, %102
  %indvars.iv = phi i64 [ %indvars.iv.next.4, %102 ], [ 0, %76 ]
  %82 = getelementptr inbounds [255 x i8], ptr %6, i64 0, i64 %indvars.iv
  %83 = load i8, ptr %82, align 1, !tbaa !9
  %84 = sext i8 %83 to i32
  %85 = icmp ne i32 %.0117, %84
  br i1 %85, label %.preheader.1, label %select.unfold.loopexit.split.loop.exit158

.preheader.1:                                     ; preds = %.preheader
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %86 = getelementptr inbounds [255 x i8], ptr %6, i64 0, i64 %indvars.iv.next
  %87 = load i8, ptr %86, align 1, !tbaa !9
  %88 = sext i8 %87 to i32
  %89 = icmp ne i32 %.0117, %88
  br i1 %89, label %.preheader.2, label %select.unfold.loopexit.split.loop.exit158

.preheader.2:                                     ; preds = %.preheader.1
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %90 = getelementptr inbounds [255 x i8], ptr %6, i64 0, i64 %indvars.iv.next.1
  %91 = load i8, ptr %90, align 1, !tbaa !9
  %92 = sext i8 %91 to i32
  %93 = icmp ne i32 %.0117, %92
  br i1 %93, label %.preheader.3, label %select.unfold.loopexit.split.loop.exit158

.preheader.3:                                     ; preds = %.preheader.2
  %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3
  %94 = getelementptr inbounds [255 x i8], ptr %6, i64 0, i64 %indvars.iv.next.2
  %95 = load i8, ptr %94, align 1, !tbaa !9
  %96 = sext i8 %95 to i32
  %97 = icmp ne i32 %.0117, %96
  br i1 %97, label %.preheader.4, label %select.unfold.loopexit.split.loop.exit158

.preheader.4:                                     ; preds = %.preheader.3
  %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
  %98 = getelementptr inbounds [255 x i8], ptr %6, i64 0, i64 %indvars.iv.next.3
  %99 = load i8, ptr %98, align 1, !tbaa !9
  %100 = sext i8 %99 to i32
  %101 = icmp ne i32 %.0117, %100
  br i1 %101, label %102, label %select.unfold.loopexit.split.loop.exit158

102:                                              ; preds = %.preheader.4
  %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5
  %exitcond.not.4 = icmp eq i64 %indvars.iv.next.4, 255
  br i1 %exitcond.not.4, label %select.unfold.loopexit, label %.preheader, !llvm.loop !20

103:                                              ; preds = %76
  br label %select.unfold

select.unfold.loopexit.split.loop.exit158:        ; preds = %.preheader.4, %.preheader.3, %.preheader.2, %.preheader.1, %.preheader
  %indvars.iv.lcssa = phi i64 [ %indvars.iv, %.preheader ], [ %indvars.iv.next, %.preheader.1 ], [ %indvars.iv.next.1, %.preheader.2 ], [ %indvars.iv.next.2, %.preheader.3 ], [ %indvars.iv.next.3, %.preheader.4 ]
  %.lcssa = phi i1 [ %85, %.preheader ], [ %89, %.preheader.1 ], [ %93, %.preheader.2 ], [ %97, %.preheader.3 ], [ %101, %.preheader.4 ]
  %104 = trunc nuw nsw i64 %indvars.iv.lcssa to i32
  br label %select.unfold.loopexit

select.unfold.loopexit:                           ; preds = %102, %select.unfold.loopexit.split.loop.exit158
  %105 = phi i1 [ %.lcssa, %select.unfold.loopexit.split.loop.exit158 ], [ %101, %102 ]
  %.ph152 = phi i32 [ 343, %select.unfold.loopexit.split.loop.exit158 ], [ 0, %102 ]
  %.1.ph = phi i32 [ %104, %select.unfold.loopexit.split.loop.exit158 ], [ %.0, %102 ]
  %.ph151 = xor i1 %105, true
  br label %select.unfold

select.unfold:                                    ; preds = %77, %select.unfold.loopexit, %79, %76, %103
  %106 = phi i1 [ false, %103 ], [ false, %76 ], [ true, %79 ], [ %105, %select.unfold.loopexit ], [ true, %77 ]
  %107 = phi i1 [ true, %103 ], [ false, %76 ], [ false, %79 ], [ %.ph151, %select.unfold.loopexit ], [ false, %77 ]
  %108 = phi i32 [ 343, %103 ], [ 0, %76 ], [ 0, %79 ], [ %.ph152, %select.unfold.loopexit ], [ 0, %77 ]
  %.1 = phi i32 [ %.0, %103 ], [ %.0, %76 ], [ %spec.select, %79 ], [ %.1.ph, %select.unfold.loopexit ], [ %spec.select162, %77 ]
  %109 = sext i32 %.1 to i64
  %110 = getelementptr inbounds [255 x ptr], ptr %7, i64 0, i64 %109
  %111 = load ptr, ptr %110, align 8, !tbaa !5
  %112 = tail call ptr @strchr(ptr noundef nonnull dereferenceable(1) %111, i32 noundef 32) #8
  %113 = icmp eq ptr %112, null
  %114 = getelementptr inbounds i8, ptr %112, i64 -1
  %.0113 = select i1 %113, ptr %10, ptr %114
  %115 = icmp eq i32 %.1, 0
  br i1 %115, label %132, label %116

116:                                              ; preds = %select.unfold
  %117 = icmp ult ptr %111, %.0105
  br i1 %117, label %118, label %124

118:                                              ; preds = %116
  %119 = getelementptr inbounds i8, ptr %.0113, i64 %13
  %120 = icmp ult ptr %119, %4
  br i1 %120, label %132, label %121

121:                                              ; preds = %118
  %122 = tail call ptr @strchr(ptr noundef nonnull dereferenceable(1) %119, i32 noundef 32) #8
  %123 = getelementptr inbounds i8, ptr %122, i64 1
  br label %132

124:                                              ; preds = %116
  %125 = getelementptr inbounds i8, ptr %.0105, i64 %12
  %.not130 = icmp ult ptr %.0113, %125
  br i1 %.not130, label %132, label %126

126:                                              ; preds = %124
  %127 = getelementptr inbounds i8, ptr %111, i64 %12
  %128 = icmp ugt ptr %127, %10
  br i1 %128, label %129, label %132

129:                                              ; preds = %126
  %130 = tail call ptr @strchr(ptr noundef nonnull dereferenceable(1) %14, i32 noundef 32) #8
  %131 = getelementptr inbounds i8, ptr %130, i64 1
  tail call void @clear_menu(ptr noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3)
  br label %132

132:                                              ; preds = %126, %118, %select.unfold, %124, %129, %121
  %.1106 = phi ptr [ %123, %121 ], [ %131, %129 ], [ %.0105, %124 ], [ %4, %select.unfold ], [ %4, %118 ], [ %111, %126 ]
  br i1 %106, label %15, label %133, !llvm.loop !21

133:                                              ; preds = %132
  tail call void @clear_menu(ptr noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3)
  %134 = xor i32 %.1, -1
  %135 = select i1 %107, i32 %134, i32 %108
  call void @llvm.lifetime.end.p0(i64 2040, ptr nonnull %7) #7
  call void @llvm.lifetime.end.p0(i64 255, ptr nonnull %6) #7
  ret i32 %135
}

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

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare i64 @strlen(ptr nocapture noundef) local_unnamed_addr #3

declare i32 @wmove(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #4

; Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)
declare ptr @__ctype_b_loc() local_unnamed_addr #5

declare i32 @cur_satt(ptr noundef, i32 noundef) local_unnamed_addr #4

declare i32 @waddch(ptr noundef, i32 noundef) local_unnamed_addr #4

declare i32 @cur_getk(ptr noundef) local_unnamed_addr #4

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

; Function Attrs: inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable
declare i32 @toupper(i32 noundef) local_unnamed_addr #6

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare ptr @strchr(ptr noundef, i32 noundef) local_unnamed_addr #3

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #3 = { mustprogress nofree nounwind willreturn memory(argmem: read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { mustprogress nofree nosync nounwind willreturn memory(none) "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 #6 = { inlinehint mustprogress nofree nounwind willreturn memory(read) 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 #7 = { nounwind }
attributes #8 = { nounwind willreturn memory(read) }
attributes #9 = { nounwind willreturn memory(none) }

!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 = !{!7, !7, i64 0}
!10 = !{!11, !11, i64 0}
!11 = !{!"short", !7, i64 0}
!12 = !{!13, !11, i64 0}
!13 = !{!"_win_st", !11, i64 0, !11, i64 2, !11, i64 4, !11, i64 6, !11, i64 8, !11, i64 10, !11, i64 12, !14, i64 16, !14, i64 20, !15, i64 24, !15, i64 25, !15, i64 26, !15, i64 27, !15, i64 28, !15, i64 29, !15, i64 30, !15, i64 31, !15, i64 32, !14, i64 36, !6, i64 40, !11, i64 48, !11, i64 50, !14, i64 52, !14, i64 56, !6, i64 64, !16, i64 72, !11, i64 84}
!14 = !{!"int", !7, i64 0}
!15 = !{!"_Bool", !7, i64 0}
!16 = !{!"pdat", !11, i64 0, !11, i64 2, !11, i64 4, !11, i64 6, !11, i64 8, !11, i64 10}
!17 = !{!13, !11, i64 2}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = distinct !{!20, !19}
!21 = distinct !{!21, !19}


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