; LLVM IR from Angold-4/chainsaw :: src/debug/editor.ll (ZN6Editor10MoveCursorEiR12editorConfig)

; 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.editorConfig = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, i32, ptr, [80 x i8], %"class.std::__cxx11::basic_string", i8, i64 }
%"class.std::__cxx11::basic_string" = type { %"struct.std::__cxx11::basic_string<char>::_Alloc_hider", i64, %union.anon }
%"struct.std::__cxx11::basic_string<char>::_Alloc_hider" = type { ptr }
%union.anon = type { i64, [8 x i8] }
%struct.editRow = type { i32, i32, i32, ptr, ptr }
%class.Editor = type { i8, ptr, ptr, %struct.buffer, ptr, ptr, %struct.editorConfig, %struct.editorConfig }
%struct.buffer = type { ptr, i64, i8, i32 }

; 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: mustprogress nounwind uwtable
define dso_local void @_ZN6Editor10MoveCursorEiR12editorConfig(ptr noundef nonnull align 8 dereferenceable(448) %0, i32 noundef %1, ptr noundef nonnull align 8 dereferenceable(192) %2) #1 align 2 {
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %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
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i32 %1, ptr %5, align 4, !tbaa !9
  store ptr %2, ptr %6, align 8, !tbaa !5
  %11 = load ptr, ptr %4, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #2
  %12 = load ptr, ptr %6, align 8, !tbaa !5
  %13 = getelementptr inbounds %struct.editorConfig, ptr %12, i32 0, i32 2
  %14 = load i32, ptr %13, align 8, !tbaa !11
  %15 = load ptr, ptr %6, align 8, !tbaa !5
  %16 = getelementptr inbounds %struct.editorConfig, ptr %15, i32 0, i32 1
  %17 = load i32, ptr %16, align 4, !tbaa !17
  %18 = add nsw i32 %14, %17
  store i32 %18, ptr %7, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #2
  %19 = load ptr, ptr %6, align 8, !tbaa !5
  %20 = getelementptr inbounds %struct.editorConfig, ptr %19, i32 0, i32 3
  %21 = load i32, ptr %20, align 4, !tbaa !18
  %22 = load ptr, ptr %6, align 8, !tbaa !5
  %23 = getelementptr inbounds %struct.editorConfig, ptr %22, i32 0, i32 0
  %24 = load i32, ptr %23, align 8, !tbaa !19
  %25 = add nsw i32 %21, %24
  store i32 %25, ptr %8, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #2
  %26 = load i32, ptr %7, align 4, !tbaa !9
  %27 = load ptr, ptr %6, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.editorConfig, ptr %27, i32 0, i32 8
  %29 = load i32, ptr %28, align 8, !tbaa !20
  %30 = icmp sge i32 %26, %29
  br i1 %30, label %31, label %32

31:                                               ; preds = %3
  br label %39

32:                                               ; preds = %3
  %33 = load ptr, ptr %6, align 8, !tbaa !5
  %34 = getelementptr inbounds %struct.editorConfig, ptr %33, i32 0, i32 10
  %35 = load ptr, ptr %34, align 8, !tbaa !21
  %36 = load i32, ptr %7, align 4, !tbaa !9
  %37 = sext i32 %36 to i64
  %38 = getelementptr inbounds %struct.editRow, ptr %35, i64 %37
  br label %39

39:                                               ; preds = %32, %31
  %40 = phi ptr [ null, %31 ], [ %38, %32 ]
  store ptr %40, ptr %10, align 8, !tbaa !5
  %41 = load i32, ptr %5, align 4, !tbaa !9
  switch i32 %41, label %233 [
    i32 1000, label %42
    i32 8, label %42
    i32 1001, label %115
    i32 12, label %115
    i32 1002, label %184
    i32 11, label %184
    i32 1003, label %206
    i32 10, label %206
  ]

42:                                               ; preds = %39, %39
  %43 = load ptr, ptr %6, align 8, !tbaa !5
  %44 = getelementptr inbounds %class.Editor, ptr %11, i32 0, i32 7
  %45 = icmp eq ptr %43, %44
  br i1 %45, label %46, label %47

46:                                               ; preds = %42
  br label %233

47:                                               ; preds = %42
  %48 = load ptr, ptr %6, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.editorConfig, ptr %48, i32 0, i32 0
  %50 = load i32, ptr %49, align 8, !tbaa !19
  %51 = icmp eq i32 %50, 0
  br i1 %51, label %52, label %109

52:                                               ; preds = %47
  %53 = load ptr, ptr %6, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct.editorConfig, ptr %53, i32 0, i32 3
  %55 = load i32, ptr %54, align 4, !tbaa !18
  %56 = icmp ne i32 %55, 0
  br i1 %56, label %57, label %62

57:                                               ; preds = %52
  %58 = load ptr, ptr %6, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.editorConfig, ptr %58, i32 0, i32 3
  %60 = load i32, ptr %59, align 4, !tbaa !18
  %61 = add nsw i32 %60, -1
  store i32 %61, ptr %59, align 4, !tbaa !18
  br label %108

62:                                               ; preds = %52
  %63 = load i32, ptr %7, align 4, !tbaa !9
  %64 = icmp sgt i32 %63, 0
  br i1 %64, label %65, label %107

65:                                               ; preds = %62
  %66 = load ptr, ptr %6, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.editorConfig, ptr %66, i32 0, i32 1
  %68 = load i32, ptr %67, align 4, !tbaa !17
  %69 = add nsw i32 %68, -1
  store i32 %69, ptr %67, align 4, !tbaa !17
  %70 = load ptr, ptr %6, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.editorConfig, ptr %70, i32 0, i32 10
  %72 = load ptr, ptr %71, align 8, !tbaa !21
  %73 = load i32, ptr %7, align 4, !tbaa !9
  %74 = sub nsw i32 %73, 1
  %75 = sext i32 %74 to i64
  %76 = getelementptr inbounds %struct.editRow, ptr %72, i64 %75
  %77 = getelementptr inbounds %struct.editRow, ptr %76, i32 0, i32 1
  %78 = load i32, ptr %77, align 4, !tbaa !22
  %79 = load ptr, ptr %6, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.editorConfig, ptr %79, i32 0, i32 0
  store i32 %78, ptr %80, align 8, !tbaa !19
  %81 = load ptr, ptr %6, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct.editorConfig, ptr %81, i32 0, i32 0
  %83 = load i32, ptr %82, align 8, !tbaa !19
  %84 = load ptr, ptr %6, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.editorConfig, ptr %84, i32 0, i32 5
  %86 = load i32, ptr %85, align 4, !tbaa !24
  %87 = sub nsw i32 %86, 1
  %88 = icmp sgt i32 %83, %87
  br i1 %88, label %89, label %106

89:                                               ; preds = %65
  %90 = load ptr, ptr %6, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.editorConfig, ptr %90, i32 0, i32 0
  %92 = load i32, ptr %91, align 8, !tbaa !19
  %93 = load ptr, ptr %6, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.editorConfig, ptr %93, i32 0, i32 5
  %95 = load i32, ptr %94, align 4, !tbaa !24
  %96 = sub nsw i32 %92, %95
  %97 = add nsw i32 %96, 1
  %98 = load ptr, ptr %6, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.editorConfig, ptr %98, i32 0, i32 3
  store i32 %97, ptr %99, align 4, !tbaa !18
  %100 = load ptr, ptr %6, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.editorConfig, ptr %100, i32 0, i32 5
  %102 = load i32, ptr %101, align 4, !tbaa !24
  %103 = sub nsw i32 %102, 1
  %104 = load ptr, ptr %6, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.editorConfig, ptr %104, i32 0, i32 0
  store i32 %103, ptr %105, align 8, !tbaa !19
  br label %106

106:                                              ; preds = %89, %65
  br label %107

107:                                              ; preds = %106, %62
  br label %108

108:                                              ; preds = %107, %57
  br label %114

109:                                              ; preds = %47
  %110 = load ptr, ptr %6, align 8, !tbaa !5
  %111 = getelementptr inbounds %struct.editorConfig, ptr %110, i32 0, i32 0
  %112 = load i32, ptr %111, align 8, !tbaa !19
  %113 = sub nsw i32 %112, 1
  store i32 %113, ptr %111, align 8, !tbaa !19
  br label %114

114:                                              ; preds = %109, %108
  br label %233

115:                                              ; preds = %39, %39
  %116 = load ptr, ptr %6, align 8, !tbaa !5
  %117 = getelementptr inbounds %class.Editor, ptr %11, i32 0, i32 7
  %118 = icmp eq ptr %116, %117
  br i1 %118, label %119, label %120

119:                                              ; preds = %115
  br label %233

120:                                              ; preds = %115
  %121 = load ptr, ptr %10, align 8, !tbaa !5
  %122 = icmp ne ptr %121, null
  br i1 %122, label %123, label %149

123:                                              ; preds = %120
  %124 = load i32, ptr %8, align 4, !tbaa !9
  %125 = load ptr, ptr %10, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.editRow, ptr %125, i32 0, i32 1
  %127 = load i32, ptr %126, align 4, !tbaa !22
  %128 = icmp slt i32 %124, %127
  br i1 %128, label %129, label %149

129:                                              ; preds = %123
  %130 = load ptr, ptr %6, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.editorConfig, ptr %130, i32 0, i32 0
  %132 = load i32, ptr %131, align 8, !tbaa !19
  %133 = load ptr, ptr %6, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.editorConfig, ptr %133, i32 0, i32 5
  %135 = load i32, ptr %134, align 4, !tbaa !24
  %136 = sub nsw i32 %135, 1
  %137 = icmp eq i32 %132, %136
  br i1 %137, label %138, label %143

138:                                              ; preds = %129
  %139 = load ptr, ptr %6, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.editorConfig, ptr %139, i32 0, i32 3
  %141 = load i32, ptr %140, align 4, !tbaa !18
  %142 = add nsw i32 %141, 1
  store i32 %142, ptr %140, align 4, !tbaa !18
  br label %148

143:                                              ; preds = %129
  %144 = load ptr, ptr %6, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.editorConfig, ptr %144, i32 0, i32 0
  %146 = load i32, ptr %145, align 8, !tbaa !19
  %147 = add nsw i32 %146, 1
  store i32 %147, ptr %145, align 8, !tbaa !19
  br label %148

148:                                              ; preds = %143, %138
  br label %183

149:                                              ; preds = %123, %120
  %150 = load ptr, ptr %10, align 8, !tbaa !5
  %151 = icmp ne ptr %150, null
  br i1 %151, label %152, label %182

152:                                              ; preds = %149
  %153 = load i32, ptr %8, align 4, !tbaa !9
  %154 = load ptr, ptr %10, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.editRow, ptr %154, i32 0, i32 1
  %156 = load i32, ptr %155, align 4, !tbaa !22
  %157 = icmp eq i32 %153, %156
  br i1 %157, label %158, label %182

158:                                              ; preds = %152
  %159 = load ptr, ptr %6, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.editorConfig, ptr %159, i32 0, i32 0
  store i32 0, ptr %160, align 8, !tbaa !19
  %161 = load ptr, ptr %6, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.editorConfig, ptr %161, i32 0, i32 3
  store i32 0, ptr %162, align 4, !tbaa !18
  %163 = load ptr, ptr %6, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.editorConfig, ptr %163, i32 0, i32 1
  %165 = load i32, ptr %164, align 4, !tbaa !17
  %166 = load ptr, ptr %6, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.editorConfig, ptr %166, i32 0, i32 4
  %168 = load i32, ptr %167, align 8, !tbaa !25
  %169 = sub nsw i32 %168, 1
  %170 = icmp eq i32 %165, %169
  br i1 %170, label %171, label %176

171:                                              ; preds = %158
  %172 = load ptr, ptr %6, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct.editorConfig, ptr %172, i32 0, i32 2
  %174 = load i32, ptr %173, align 8, !tbaa !11
  %175 = add nsw i32 %174, 1
  store i32 %175, ptr %173, align 8, !tbaa !11
  br label %181

176:                                              ; preds = %158
  %177 = load ptr, ptr %6, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.editorConfig, ptr %177, i32 0, i32 1
  %179 = load i32, ptr %178, align 4, !tbaa !17
  %180 = add nsw i32 %179, 1
  store i32 %180, ptr %178, align 4, !tbaa !17
  br label %181

181:                                              ; preds = %176, %171
  br label %182

182:                                              ; preds = %181, %152, %149
  br label %183

183:                                              ; preds = %182, %148
  br label %233

184:                                              ; preds = %39, %39
  %185 = load ptr, ptr %6, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.editorConfig, ptr %185, i32 0, i32 1
  %187 = load i32, ptr %186, align 4, !tbaa !17
  %188 = icmp eq i32 %187, 0
  br i1 %188, label %189, label %200

189:                                              ; preds = %184
  %190 = load ptr, ptr %6, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.editorConfig, ptr %190, i32 0, i32 2
  %192 = load i32, ptr %191, align 8, !tbaa !11
  %193 = icmp ne i32 %192, 0
  br i1 %193, label %194, label %199

194:                                              ; preds = %189
  %195 = load ptr, ptr %6, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.editorConfig, ptr %195, i32 0, i32 2
  %197 = load i32, ptr %196, align 8, !tbaa !11
  %198 = add nsw i32 %197, -1
  store i32 %198, ptr %196, align 8, !tbaa !11
  br label %199

199:                                              ; preds = %194, %189
  br label %205

200:                                              ; preds = %184
  %201 = load ptr, ptr %6, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.editorConfig, ptr %201, i32 0, i32 1
  %203 = load i32, ptr %202, align 4, !tbaa !17
  %204 = sub nsw i32 %203, 1
  store i32 %204, ptr %202, align 4, !tbaa !17
  br label %205

205:                                              ; preds = %200, %199
  br label %233

206:                                              ; preds = %39, %39
  %207 = load i32, ptr %7, align 4, !tbaa !9
  %208 = load ptr, ptr %6, align 8, !tbaa !5
  %209 = getelementptr inbounds %struct.editorConfig, ptr %208, i32 0, i32 8
  %210 = load i32, ptr %209, align 8, !tbaa !20
  %211 = icmp slt i32 %207, %210
  br i1 %211, label %212, label %232

212:                                              ; preds = %206
  %213 = load ptr, ptr %6, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.editorConfig, ptr %213, i32 0, i32 1
  %215 = load i32, ptr %214, align 4, !tbaa !17
  %216 = load ptr, ptr %6, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct.editorConfig, ptr %216, i32 0, i32 4
  %218 = load i32, ptr %217, align 8, !tbaa !25
  %219 = sub nsw i32 %218, 1
  %220 = icmp eq i32 %215, %219
  br i1 %220, label %221, label %226

221:                                              ; preds = %212
  %222 = load ptr, ptr %6, align 8, !tbaa !5
  %223 = getelementptr inbounds %struct.editorConfig, ptr %222, i32 0, i32 2
  %224 = load i32, ptr %223, align 8, !tbaa !11
  %225 = add nsw i32 %224, 1
  store i32 %225, ptr %223, align 8, !tbaa !11
  br label %231

226:                                              ; preds = %212
  %227 = load ptr, ptr %6, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.editorConfig, ptr %227, i32 0, i32 1
  %229 = load i32, ptr %228, align 4, !tbaa !17
  %230 = add nsw i32 %229, 1
  store i32 %230, ptr %228, align 4, !tbaa !17
  br label %231

231:                                              ; preds = %226, %221
  br label %232

232:                                              ; preds = %231, %206
  br label %233

233:                                              ; preds = %232, %205, %183, %119, %114, %46, %39
  %234 = load ptr, ptr %6, align 8, !tbaa !5
  %235 = getelementptr inbounds %struct.editorConfig, ptr %234, i32 0, i32 2
  %236 = load i32, ptr %235, align 8, !tbaa !11
  %237 = load ptr, ptr %6, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.editorConfig, ptr %237, i32 0, i32 1
  %239 = load i32, ptr %238, align 4, !tbaa !17
  %240 = add nsw i32 %236, %239
  store i32 %240, ptr %7, align 4, !tbaa !9
  %241 = load ptr, ptr %6, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.editorConfig, ptr %241, i32 0, i32 3
  %243 = load i32, ptr %242, align 4, !tbaa !18
  %244 = load ptr, ptr %6, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.editorConfig, ptr %244, i32 0, i32 0
  %246 = load i32, ptr %245, align 8, !tbaa !19
  %247 = add nsw i32 %243, %246
  store i32 %247, ptr %8, align 4, !tbaa !9
  %248 = load i32, ptr %7, align 4, !tbaa !9
  %249 = load ptr, ptr %6, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.editorConfig, ptr %249, i32 0, i32 8
  %251 = load i32, ptr %250, align 8, !tbaa !20
  %252 = icmp sge i32 %248, %251
  br i1 %252, label %253, label %254

253:                                              ; preds = %233
  br label %261

254:                                              ; preds = %233
  %255 = load ptr, ptr %6, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.editorConfig, ptr %255, i32 0, i32 10
  %257 = load ptr, ptr %256, align 8, !tbaa !21
  %258 = load i32, ptr %7, align 4, !tbaa !9
  %259 = sext i32 %258 to i64
  %260 = getelementptr inbounds %struct.editRow, ptr %257, i64 %259
  br label %261

261:                                              ; preds = %254, %253
  %262 = phi ptr [ null, %253 ], [ %260, %254 ]
  store ptr %262, ptr %10, align 8, !tbaa !5
  %263 = load ptr, ptr %10, align 8, !tbaa !5
  %264 = icmp ne ptr %263, null
  br i1 %264, label %265, label %269

265:                                              ; preds = %261
  %266 = load ptr, ptr %10, align 8, !tbaa !5
  %267 = getelementptr inbounds %struct.editRow, ptr %266, i32 0, i32 1
  %268 = load i32, ptr %267, align 4, !tbaa !22
  br label %270

269:                                              ; preds = %261
  br label %270

270:                                              ; preds = %269, %265
  %271 = phi i32 [ %268, %265 ], [ 0, %269 ]
  store i32 %271, ptr %9, align 4, !tbaa !9
  %272 = load i32, ptr %8, align 4, !tbaa !9
  %273 = load i32, ptr %9, align 4, !tbaa !9
  %274 = icmp sgt i32 %272, %273
  br i1 %274, label %275, label %298

275:                                              ; preds = %270
  %276 = load i32, ptr %8, align 4, !tbaa !9
  %277 = load i32, ptr %9, align 4, !tbaa !9
  %278 = sub nsw i32 %276, %277
  %279 = load ptr, ptr %6, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct.editorConfig, ptr %279, i32 0, i32 0
  %281 = load i32, ptr %280, align 8, !tbaa !19
  %282 = sub nsw i32 %281, %278
  store i32 %282, ptr %280, align 8, !tbaa !19
  %283 = load ptr, ptr %6, align 8, !tbaa !5
  %284 = getelementptr inbounds %struct.editorConfig, ptr %283, i32 0, i32 0
  %285 = load i32, ptr %284, align 8, !tbaa !19
  %286 = icmp slt i32 %285, 0
  br i1 %286, label %287, label %297

287:                                              ; preds = %275
  %288 = load ptr, ptr %6, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct.editorConfig, ptr %288, i32 0, i32 0
  %290 = load i32, ptr %289, align 8, !tbaa !19
  %291 = load ptr, ptr %6, align 8, !tbaa !5
  %292 = getelementptr inbounds %struct.editorConfig, ptr %291, i32 0, i32 3
  %293 = load i32, ptr %292, align 4, !tbaa !18
  %294 = add nsw i32 %293, %290
  store i32 %294, ptr %292, align 4, !tbaa !18
  %295 = load ptr, ptr %6, align 8, !tbaa !5
  %296 = getelementptr inbounds %struct.editorConfig, ptr %295, i32 0, i32 0
  store i32 0, ptr %296, align 8, !tbaa !19
  br label %297

297:                                              ; preds = %287, %275
  br label %298

298:                                              ; preds = %297, %270
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #2
  call void @llvm.lifetime.end.p0(i64 4, 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
  ret void
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress 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 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !10, i64 8}
!12 = !{!"_ZTS12editorConfig", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !6, i64 40, !10, i64 48, !6, i64 56, !7, i64 64, !13, i64 144, !16, i64 176, !15, i64 184}
!13 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !14, i64 0, !15, i64 8, !7, i64 16}
!14 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !6, i64 0}
!15 = !{!"long", !7, i64 0}
!16 = !{!"bool", !7, i64 0}
!17 = !{!12, !10, i64 4}
!18 = !{!12, !10, i64 12}
!19 = !{!12, !10, i64 0}
!20 = !{!12, !10, i64 32}
!21 = !{!12, !6, i64 40}
!22 = !{!23, !10, i64 4}
!23 = !{!"_ZTS7editRow", !10, i64 0, !10, i64 4, !10, i64 8, !6, i64 16, !6, i64 24}
!24 = !{!12, !10, i64 20}
!25 = !{!12, !10, i64 16}


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

; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read, argmem: readwrite, inaccessiblemem: none) uwtable
define dso_local void @_ZN6Editor10MoveCursorEiR12editorConfig(ptr noundef nonnull readnone align 8 dereferenceable(448) %0, i32 noundef %1, ptr noundef nonnull align 8 dereferenceable(192) %2) local_unnamed_addr #0 align 2 {
  %4 = getelementptr inbounds i8, ptr %2, i64 8
  %5 = load i32, ptr %4, align 8, !tbaa !5
  %6 = getelementptr inbounds i8, ptr %2, i64 4
  %7 = load i32, ptr %6, align 4, !tbaa !15
  %8 = add nsw i32 %7, %5
  %9 = getelementptr inbounds i8, ptr %2, i64 12
  %10 = load i32, ptr %9, align 4, !tbaa !16
  %11 = load i32, ptr %2, align 8, !tbaa !17
  %12 = add nsw i32 %11, %10
  %13 = getelementptr inbounds i8, ptr %2, i64 32
  %14 = load i32, ptr %13, align 8, !tbaa !18
  %.not = icmp slt i32 %8, %14
  %15 = getelementptr inbounds i8, ptr %2, i64 40
  %16 = load ptr, ptr %15, align 8
  %17 = sext i32 %8 to i64
  %18 = getelementptr inbounds %struct.editRow, ptr %16, i64 %17
  %19 = select i1 %.not, ptr %18, ptr null
  switch i32 %1, label %.critedge [
    i32 1000, label %20
    i32 8, label %20
    i32 1001, label %44
    i32 12, label %44
    i32 1002, label %71
    i32 11, label %71
    i32 1003, label %78
    i32 10, label %78
  ]

20:                                               ; preds = %3, %3
  %21 = getelementptr inbounds i8, ptr %0, i64 256
  %22 = icmp eq ptr %21, %2
  br i1 %22, label %.critedge, label %23

23:                                               ; preds = %20
  %24 = icmp eq i32 %11, 0
  br i1 %24, label %25, label %42

25:                                               ; preds = %23
  %.not91 = icmp eq i32 %10, 0
  br i1 %.not91, label %28, label %26

26:                                               ; preds = %25
  %27 = add nsw i32 %10, -1
  store i32 %27, ptr %9, align 4, !tbaa !16
  br label %.critedge

28:                                               ; preds = %25
  %29 = icmp sgt i32 %8, 0
  br i1 %29, label %30, label %.critedge

30:                                               ; preds = %28
  %31 = add nsw i32 %7, -1
  store i32 %31, ptr %6, align 4, !tbaa !15
  %32 = zext nneg i32 %8 to i64
  %33 = getelementptr %struct.editRow, ptr %16, i64 %32
  %34 = getelementptr i8, ptr %33, i64 -28
  %35 = load i32, ptr %34, align 4, !tbaa !19
  store i32 %35, ptr %2, align 8, !tbaa !17
  %36 = getelementptr inbounds i8, ptr %2, i64 20
  %37 = load i32, ptr %36, align 4, !tbaa !21
  %.not92 = icmp slt i32 %35, %37
  br i1 %.not92, label %.critedge, label %38

38:                                               ; preds = %30
  %39 = add i32 %35, 1
  %40 = sub i32 %39, %37
  store i32 %40, ptr %9, align 4, !tbaa !16
  %41 = add nsw i32 %37, -1
  store i32 %41, ptr %2, align 8, !tbaa !17
  br label %.critedge

42:                                               ; preds = %23
  %43 = add nsw i32 %11, -1
  store i32 %43, ptr %2, align 8, !tbaa !17
  br label %.critedge

44:                                               ; preds = %3, %3
  %45 = getelementptr inbounds i8, ptr %0, i64 256
  %46 = icmp eq ptr %45, %2
  %.not90 = icmp eq ptr %19, null
  %or.cond = select i1 %46, i1 true, i1 %.not90
  br i1 %or.cond, label %.critedge, label %47

47:                                               ; preds = %44
  %48 = getelementptr inbounds i8, ptr %19, i64 4
  %49 = load i32, ptr %48, align 4, !tbaa !19
  %50 = icmp slt i32 %12, %49
  br i1 %50, label %51, label %60

51:                                               ; preds = %47
  %52 = getelementptr inbounds i8, ptr %2, i64 20
  %53 = load i32, ptr %52, align 4, !tbaa !21
  %54 = add nsw i32 %53, -1
  %55 = icmp eq i32 %11, %54
  br i1 %55, label %56, label %58

56:                                               ; preds = %51
  %57 = add nsw i32 %10, 1
  store i32 %57, ptr %9, align 4, !tbaa !16
  br label %.critedge

58:                                               ; preds = %51
  %59 = add nsw i32 %11, 1
  store i32 %59, ptr %2, align 8, !tbaa !17
  br label %.critedge

60:                                               ; preds = %47
  %61 = icmp eq i32 %12, %49
  br i1 %61, label %62, label %.critedge

62:                                               ; preds = %60
  store i32 0, ptr %2, align 8, !tbaa !17
  store i32 0, ptr %9, align 4, !tbaa !16
  %63 = getelementptr inbounds i8, ptr %2, i64 16
  %64 = load i32, ptr %63, align 8, !tbaa !22
  %65 = add nsw i32 %64, -1
  %66 = icmp eq i32 %7, %65
  br i1 %66, label %67, label %69

67:                                               ; preds = %62
  %68 = add nsw i32 %5, 1
  store i32 %68, ptr %4, align 8, !tbaa !5
  br label %.critedge

69:                                               ; preds = %62
  %70 = add nsw i32 %7, 1
  store i32 %70, ptr %6, align 4, !tbaa !15
  br label %.critedge

71:                                               ; preds = %3, %3
  %72 = icmp eq i32 %7, 0
  br i1 %72, label %73, label %76

73:                                               ; preds = %71
  %.not89 = icmp eq i32 %5, 0
  br i1 %.not89, label %.critedge, label %74

74:                                               ; preds = %73
  %75 = add nsw i32 %5, -1
  store i32 %75, ptr %4, align 8, !tbaa !5
  br label %.critedge

76:                                               ; preds = %71
  %77 = add nsw i32 %7, -1
  store i32 %77, ptr %6, align 4, !tbaa !15
  br label %.critedge

78:                                               ; preds = %3, %3
  br i1 %.not, label %79, label %.critedge

79:                                               ; preds = %78
  %80 = getelementptr inbounds i8, ptr %2, i64 16
  %81 = load i32, ptr %80, align 8, !tbaa !22
  %82 = add nsw i32 %81, -1
  %83 = icmp eq i32 %7, %82
  br i1 %83, label %84, label %86

84:                                               ; preds = %79
  %85 = add nsw i32 %5, 1
  store i32 %85, ptr %4, align 8, !tbaa !5
  br label %.critedge

86:                                               ; preds = %79
  %87 = add nsw i32 %7, 1
  store i32 %87, ptr %6, align 4, !tbaa !15
  br label %.critedge

.critedge:                                        ; preds = %78, %86, %84, %76, %74, %73, %58, %56, %67, %69, %60, %44, %42, %28, %38, %30, %26, %20, %3
  %88 = phi i32 [ %11, %78 ], [ %11, %86 ], [ %11, %84 ], [ %11, %76 ], [ %11, %74 ], [ %11, %73 ], [ %59, %58 ], [ %11, %56 ], [ 0, %67 ], [ 0, %69 ], [ %11, %60 ], [ %11, %44 ], [ %43, %42 ], [ 0, %28 ], [ %41, %38 ], [ %35, %30 ], [ 0, %26 ], [ %11, %20 ], [ %11, %3 ]
  %89 = phi i32 [ %10, %78 ], [ %10, %86 ], [ %10, %84 ], [ %10, %76 ], [ %10, %74 ], [ %10, %73 ], [ %10, %58 ], [ %57, %56 ], [ 0, %67 ], [ 0, %69 ], [ %10, %60 ], [ %10, %44 ], [ %10, %42 ], [ 0, %28 ], [ %40, %38 ], [ 0, %30 ], [ %27, %26 ], [ %10, %20 ], [ %10, %3 ]
  %90 = phi i32 [ %7, %78 ], [ %87, %86 ], [ %7, %84 ], [ %77, %76 ], [ 0, %74 ], [ 0, %73 ], [ %7, %58 ], [ %7, %56 ], [ %7, %67 ], [ %70, %69 ], [ %7, %60 ], [ %7, %44 ], [ %7, %42 ], [ %7, %28 ], [ %31, %38 ], [ %31, %30 ], [ %7, %26 ], [ %7, %20 ], [ %7, %3 ]
  %91 = phi i32 [ %5, %78 ], [ %5, %86 ], [ %85, %84 ], [ %5, %76 ], [ %75, %74 ], [ 0, %73 ], [ %5, %58 ], [ %5, %56 ], [ %68, %67 ], [ %5, %69 ], [ %5, %60 ], [ %5, %44 ], [ %5, %42 ], [ %5, %28 ], [ %5, %38 ], [ %5, %30 ], [ %5, %26 ], [ %5, %20 ], [ %5, %3 ]
  %92 = add nsw i32 %90, %91
  %93 = add nsw i32 %88, %89
  %.not93 = icmp sge i32 %92, %14
  %.not9495 = icmp eq ptr %16, null
  %.not94 = select i1 %.not93, i1 true, i1 %.not9495
  br i1 %.not94, label %98, label %94

94:                                               ; preds = %.critedge
  %95 = sext i32 %92 to i64
  %96 = getelementptr inbounds %struct.editRow, ptr %16, i64 %95, i32 1
  %97 = load i32, ptr %96, align 4, !tbaa !19
  br label %98

98:                                               ; preds = %.critedge, %94
  %99 = phi i32 [ %97, %94 ], [ 0, %.critedge ]
  %100 = icmp sgt i32 %93, %99
  br i1 %100, label %101, label %106

101:                                              ; preds = %98
  %.neg = sub i32 %99, %93
  %102 = add i32 %.neg, %88
  store i32 %102, ptr %2, align 8, !tbaa !17
  %103 = icmp slt i32 %102, 0
  br i1 %103, label %104, label %106

104:                                              ; preds = %101
  %105 = add nsw i32 %102, %89
  store i32 %105, ptr %9, align 4, !tbaa !16
  store i32 0, ptr %2, align 8, !tbaa !17
  br label %106

106:                                              ; preds = %101, %104, %98
  ret void
}

attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(read, argmem: readwrite, inaccessiblemem: none) 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" }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 8}
!6 = !{!"_ZTS12editorConfig", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !10, i64 40, !7, i64 48, !10, i64 56, !8, i64 64, !11, i64 144, !14, i64 176, !13, i64 184}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !12, i64 0, !13, i64 8, !8, i64 16}
!12 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !10, i64 0}
!13 = !{!"long", !8, i64 0}
!14 = !{!"bool", !8, i64 0}
!15 = !{!6, !7, i64 4}
!16 = !{!6, !7, i64 12}
!17 = !{!6, !7, i64 0}
!18 = !{!6, !7, i64 32}
!19 = !{!20, !7, i64 4}
!20 = !{!"_ZTS7editRow", !7, i64 0, !7, i64 4, !7, i64 8, !10, i64 16, !10, i64 24}
!21 = !{!6, !7, i64 20}
!22 = !{!6, !7, i64 16}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass