; LLVM IR from caryll/otfcc :: lib/table/otl/subtables/chaining (read)

; 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.otfcc_HandlePackage = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.otfcc_Handle = type { i32, i16, ptr }
%struct.otl_ChainingRule = type { i16, i16, i16, ptr, i16, ptr }
%struct.otl_ChainLookupApplication = type { i16, %struct.otfcc_Handle }

@otfcc_iHandle = external constant %struct.otfcc_HandlePackage, align 8

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @__caryll_allocate_clean(i64 noundef, i64 noundef) #1

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i16 @read_16u(ptr noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @reverseBacktracks(ptr noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @deleteRule(ptr noundef) #1

; Function Attrs: nounwind uwtable
define dso_local ptr @GeneralReadChainingRule(ptr noundef %0, i32 noundef %1, i32 noundef %2, i16 noundef zeroext %3, i1 noundef zeroext %4, ptr noundef %5, i16 noundef zeroext %6, ptr noundef %7) #3 {
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i16, align 2
  %14 = alloca i8, align 1
  %15 = alloca ptr, align 8
  %16 = alloca i16, align 2
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca i16, align 2
  %20 = alloca i16, align 2
  %21 = alloca i16, align 2
  %22 = alloca i16, align 2
  %23 = alloca i16, align 2
  %24 = alloca i16, align 2
  %25 = alloca i16, align 2
  %26 = alloca i32, align 4
  %27 = alloca i16, align 2
  %28 = alloca i32, align 4
  %29 = alloca i16, align 2
  %30 = alloca i32, align 4
  %31 = alloca i16, align 2
  %32 = alloca %struct.otfcc_Handle, align 8
  %33 = alloca i32, align 4
  store ptr %0, ptr %10, align 8, !tbaa !5
  store i32 %1, ptr %11, align 4, !tbaa !9
  store i32 %2, ptr %12, align 4, !tbaa !9
  store i16 %3, ptr %13, align 2, !tbaa !11
  %34 = zext i1 %4 to i8
  store i8 %34, ptr %14, align 1, !tbaa !13
  store ptr %5, ptr %15, align 8, !tbaa !5
  store i16 %6, ptr %16, align 2, !tbaa !11
  store ptr %7, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  %35 = call ptr @__caryll_allocate_clean(i64 noundef 32, i64 noundef 247)
  store ptr %35, ptr %18, align 8, !tbaa !5
  %36 = load ptr, ptr %18, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.otl_ChainingRule, ptr %36, i32 0, i32 3
  store ptr null, ptr %37, align 8, !tbaa !15
  %38 = load ptr, ptr %18, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.otl_ChainingRule, ptr %38, i32 0, i32 5
  store ptr null, ptr %39, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 2, ptr %19) #4
  %40 = load i8, ptr %14, align 1, !tbaa !13, !range !18, !noundef !19
  %41 = trunc i8 %40 to i1
  %42 = zext i1 %41 to i64
  %43 = select i1 %41, i32 1, i32 0
  %44 = trunc i32 %43 to i16
  store i16 %44, ptr %19, align 2, !tbaa !11
  %45 = load i32, ptr %11, align 4, !tbaa !9
  %46 = load i32, ptr %12, align 4, !tbaa !9
  %47 = add i32 %46, 8
  %48 = icmp ult i32 %45, %47
  br i1 %48, label %49, label %50

49:                                               ; preds = %8
  br label %459

50:                                               ; preds = %8
  %51 = load ptr, ptr %10, align 8, !tbaa !5
  %52 = load i32, ptr %12, align 4, !tbaa !9
  %53 = zext i32 %52 to i64
  %54 = getelementptr inbounds i8, ptr %51, i64 %53
  %55 = call zeroext i16 @read_16u(ptr noundef %54)
  store i16 %55, ptr %20, align 2, !tbaa !11
  %56 = load i32, ptr %11, align 4, !tbaa !9
  %57 = load i32, ptr %12, align 4, !tbaa !9
  %58 = add i32 %57, 2
  %59 = load i16, ptr %20, align 2, !tbaa !11
  %60 = zext i16 %59 to i32
  %61 = mul nsw i32 2, %60
  %62 = add i32 %58, %61
  %63 = add i32 %62, 2
  %64 = icmp ult i32 %56, %63
  br i1 %64, label %65, label %66

65:                                               ; preds = %50
  br label %459

66:                                               ; preds = %50
  %67 = load ptr, ptr %10, align 8, !tbaa !5
  %68 = load i32, ptr %12, align 4, !tbaa !9
  %69 = zext i32 %68 to i64
  %70 = getelementptr inbounds i8, ptr %67, i64 %69
  %71 = getelementptr inbounds i8, ptr %70, i64 2
  %72 = load i16, ptr %20, align 2, !tbaa !11
  %73 = zext i16 %72 to i32
  %74 = mul nsw i32 2, %73
  %75 = sext i32 %74 to i64
  %76 = getelementptr inbounds i8, ptr %71, i64 %75
  %77 = call zeroext i16 @read_16u(ptr noundef %76)
  store i16 %77, ptr %21, align 2, !tbaa !11
  %78 = load i32, ptr %11, align 4, !tbaa !9
  %79 = load i32, ptr %12, align 4, !tbaa !9
  %80 = add i32 %79, 4
  %81 = load i16, ptr %20, align 2, !tbaa !11
  %82 = zext i16 %81 to i32
  %83 = load i16, ptr %21, align 2, !tbaa !11
  %84 = zext i16 %83 to i32
  %85 = add nsw i32 %82, %84
  %86 = load i16, ptr %19, align 2, !tbaa !11
  %87 = zext i16 %86 to i32
  %88 = sub nsw i32 %85, %87
  %89 = mul nsw i32 2, %88
  %90 = add i32 %80, %89
  %91 = add i32 %90, 2
  %92 = icmp ult i32 %78, %91
  br i1 %92, label %93, label %94

93:                                               ; preds = %66
  br label %459

94:                                               ; preds = %66
  %95 = load ptr, ptr %10, align 8, !tbaa !5
  %96 = load i32, ptr %12, align 4, !tbaa !9
  %97 = zext i32 %96 to i64
  %98 = getelementptr inbounds i8, ptr %95, i64 %97
  %99 = getelementptr inbounds i8, ptr %98, i64 4
  %100 = load i16, ptr %20, align 2, !tbaa !11
  %101 = zext i16 %100 to i32
  %102 = load i16, ptr %21, align 2, !tbaa !11
  %103 = zext i16 %102 to i32
  %104 = add nsw i32 %101, %103
  %105 = load i16, ptr %19, align 2, !tbaa !11
  %106 = zext i16 %105 to i32
  %107 = sub nsw i32 %104, %106
  %108 = mul nsw i32 2, %107
  %109 = sext i32 %108 to i64
  %110 = getelementptr inbounds i8, ptr %99, i64 %109
  %111 = call zeroext i16 @read_16u(ptr noundef %110)
  store i16 %111, ptr %22, align 2, !tbaa !11
  %112 = load i32, ptr %11, align 4, !tbaa !9
  %113 = load i32, ptr %12, align 4, !tbaa !9
  %114 = add i32 %113, 6
  %115 = load i16, ptr %20, align 2, !tbaa !11
  %116 = zext i16 %115 to i32
  %117 = load i16, ptr %21, align 2, !tbaa !11
  %118 = zext i16 %117 to i32
  %119 = add nsw i32 %116, %118
  %120 = load i16, ptr %19, align 2, !tbaa !11
  %121 = zext i16 %120 to i32
  %122 = sub nsw i32 %119, %121
  %123 = load i16, ptr %22, align 2, !tbaa !11
  %124 = zext i16 %123 to i32
  %125 = add nsw i32 %122, %124
  %126 = mul nsw i32 2, %125
  %127 = add i32 %114, %126
  %128 = add i32 %127, 2
  %129 = icmp ult i32 %112, %128
  br i1 %129, label %130, label %131

130:                                              ; preds = %94
  br label %459

131:                                              ; preds = %94
  %132 = load ptr, ptr %10, align 8, !tbaa !5
  %133 = load i32, ptr %12, align 4, !tbaa !9
  %134 = zext i32 %133 to i64
  %135 = getelementptr inbounds i8, ptr %132, i64 %134
  %136 = getelementptr inbounds i8, ptr %135, i64 6
  %137 = load i16, ptr %20, align 2, !tbaa !11
  %138 = zext i16 %137 to i32
  %139 = load i16, ptr %21, align 2, !tbaa !11
  %140 = zext i16 %139 to i32
  %141 = add nsw i32 %138, %140
  %142 = load i16, ptr %19, align 2, !tbaa !11
  %143 = zext i16 %142 to i32
  %144 = sub nsw i32 %141, %143
  %145 = load i16, ptr %22, align 2, !tbaa !11
  %146 = zext i16 %145 to i32
  %147 = add nsw i32 %144, %146
  %148 = mul nsw i32 2, %147
  %149 = sext i32 %148 to i64
  %150 = getelementptr inbounds i8, ptr %136, i64 %149
  %151 = call zeroext i16 @read_16u(ptr noundef %150)
  store i16 %151, ptr %23, align 2, !tbaa !11
  %152 = load i32, ptr %11, align 4, !tbaa !9
  %153 = load i32, ptr %12, align 4, !tbaa !9
  %154 = add i32 %153, 8
  %155 = load i16, ptr %20, align 2, !tbaa !11
  %156 = zext i16 %155 to i32
  %157 = load i16, ptr %21, align 2, !tbaa !11
  %158 = zext i16 %157 to i32
  %159 = add nsw i32 %156, %158
  %160 = load i16, ptr %19, align 2, !tbaa !11
  %161 = zext i16 %160 to i32
  %162 = sub nsw i32 %159, %161
  %163 = load i16, ptr %22, align 2, !tbaa !11
  %164 = zext i16 %163 to i32
  %165 = add nsw i32 %162, %164
  %166 = mul nsw i32 2, %165
  %167 = add i32 %154, %166
  %168 = load i16, ptr %23, align 2, !tbaa !11
  %169 = zext i16 %168 to i32
  %170 = mul nsw i32 %169, 4
  %171 = add i32 %167, %170
  %172 = icmp ult i32 %152, %171
  br i1 %172, label %173, label %174

173:                                              ; preds = %131
  br label %459

174:                                              ; preds = %131
  %175 = load i16, ptr %20, align 2, !tbaa !11
  %176 = zext i16 %175 to i32
  %177 = load i16, ptr %21, align 2, !tbaa !11
  %178 = zext i16 %177 to i32
  %179 = add nsw i32 %176, %178
  %180 = load i16, ptr %22, align 2, !tbaa !11
  %181 = zext i16 %180 to i32
  %182 = add nsw i32 %179, %181
  %183 = trunc i32 %182 to i16
  %184 = load ptr, ptr %18, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.otl_ChainingRule, ptr %184, i32 0, i32 0
  store i16 %183, ptr %185, align 8, !tbaa !20
  %186 = load i16, ptr %20, align 2, !tbaa !11
  %187 = load ptr, ptr %18, align 8, !tbaa !5
  %188 = getelementptr inbounds %struct.otl_ChainingRule, ptr %187, i32 0, i32 1
  store i16 %186, ptr %188, align 2, !tbaa !21
  %189 = load i16, ptr %20, align 2, !tbaa !11
  %190 = zext i16 %189 to i32
  %191 = load i16, ptr %21, align 2, !tbaa !11
  %192 = zext i16 %191 to i32
  %193 = add nsw i32 %190, %192
  %194 = trunc i32 %193 to i16
  %195 = load ptr, ptr %18, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.otl_ChainingRule, ptr %195, i32 0, i32 2
  store i16 %194, ptr %196, align 4, !tbaa !22
  %197 = load ptr, ptr %18, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct.otl_ChainingRule, ptr %197, i32 0, i32 0
  %199 = load i16, ptr %198, align 8, !tbaa !20
  %200 = zext i16 %199 to i64
  %201 = mul i64 8, %200
  %202 = call ptr @__caryll_allocate_clean(i64 noundef %201, i64 noundef 267)
  %203 = load ptr, ptr %18, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct.otl_ChainingRule, ptr %203, i32 0, i32 3
  store ptr %202, ptr %204, align 8, !tbaa !15
  store i16 0, ptr %24, align 2, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 2, ptr %25) #4
  store i16 0, ptr %25, align 2, !tbaa !11
  br label %205

205:                                              ; preds = %241, %174
  %206 = load i16, ptr %25, align 2, !tbaa !11
  %207 = zext i16 %206 to i32
  %208 = load i16, ptr %20, align 2, !tbaa !11
  %209 = zext i16 %208 to i32
  %210 = icmp slt i32 %207, %209
  br i1 %210, label %212, label %211

211:                                              ; preds = %205
  call void @llvm.lifetime.end.p0(i64 2, ptr %25) #4
  br label %244

212:                                              ; preds = %205
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #4
  %213 = load ptr, ptr %10, align 8, !tbaa !5
  %214 = load i32, ptr %12, align 4, !tbaa !9
  %215 = zext i32 %214 to i64
  %216 = getelementptr inbounds i8, ptr %213, i64 %215
  %217 = getelementptr inbounds i8, ptr %216, i64 2
  %218 = load i16, ptr %25, align 2, !tbaa !11
  %219 = zext i16 %218 to i32
  %220 = mul nsw i32 %219, 2
  %221 = sext i32 %220 to i64
  %222 = getelementptr inbounds i8, ptr %217, i64 %221
  %223 = call zeroext i16 @read_16u(ptr noundef %222)
  %224 = zext i16 %223 to i32
  store i32 %224, ptr %26, align 4, !tbaa !9
  %225 = load ptr, ptr %15, align 8, !tbaa !5
  %226 = load ptr, ptr %10, align 8, !tbaa !5
  %227 = load i32, ptr %11, align 4, !tbaa !9
  %228 = load i32, ptr %26, align 4, !tbaa !9
  %229 = trunc i32 %228 to i16
  %230 = load i32, ptr %12, align 4, !tbaa !9
  %231 = load i16, ptr %16, align 2, !tbaa !11
  %232 = load ptr, ptr %17, align 8, !tbaa !5
  %233 = call ptr %225(ptr noundef %226, i32 noundef %227, i16 noundef zeroext %229, i32 noundef %230, i16 noundef zeroext 1, i16 noundef zeroext %231, ptr noundef %232)
  %234 = load ptr, ptr %18, align 8, !tbaa !5
  %235 = getelementptr inbounds %struct.otl_ChainingRule, ptr %234, i32 0, i32 3
  %236 = load ptr, ptr %235, align 8, !tbaa !15
  %237 = load i16, ptr %24, align 2, !tbaa !11
  %238 = add i16 %237, 1
  store i16 %238, ptr %24, align 2, !tbaa !11
  %239 = zext i16 %237 to i64
  %240 = getelementptr inbounds ptr, ptr %236, i64 %239
  store ptr %233, ptr %240, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #4
  br label %241

241:                                              ; preds = %212
  %242 = load i16, ptr %25, align 2, !tbaa !11
  %243 = add i16 %242, 1
  store i16 %243, ptr %25, align 2, !tbaa !11
  br label %205, !llvm.loop !23

244:                                              ; preds = %211
  %245 = load i8, ptr %14, align 1, !tbaa !13, !range !18, !noundef !19
  %246 = trunc i8 %245 to i1
  br i1 %246, label %247, label %263

247:                                              ; preds = %244
  %248 = load ptr, ptr %15, align 8, !tbaa !5
  %249 = load ptr, ptr %10, align 8, !tbaa !5
  %250 = load i32, ptr %11, align 4, !tbaa !9
  %251 = load i16, ptr %13, align 2, !tbaa !11
  %252 = load i32, ptr %12, align 4, !tbaa !9
  %253 = load i16, ptr %16, align 2, !tbaa !11
  %254 = load ptr, ptr %17, align 8, !tbaa !5
  %255 = call ptr %248(ptr noundef %249, i32 noundef %250, i16 noundef zeroext %251, i32 noundef %252, i16 noundef zeroext 2, i16 noundef zeroext %253, ptr noundef %254)
  %256 = load ptr, ptr %18, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.otl_ChainingRule, ptr %256, i32 0, i32 3
  %258 = load ptr, ptr %257, align 8, !tbaa !15
  %259 = load i16, ptr %24, align 2, !tbaa !11
  %260 = add i16 %259, 1
  store i16 %260, ptr %24, align 2, !tbaa !11
  %261 = zext i16 %259 to i64
  %262 = getelementptr inbounds ptr, ptr %258, i64 %261
  store ptr %255, ptr %262, align 8, !tbaa !5
  br label %263

263:                                              ; preds = %247, %244
  call void @llvm.lifetime.start.p0(i64 2, ptr %27) #4
  store i16 0, ptr %27, align 2, !tbaa !11
  br label %264

264:                                              ; preds = %310, %263
  %265 = load i16, ptr %27, align 2, !tbaa !11
  %266 = zext i16 %265 to i32
  %267 = load i16, ptr %21, align 2, !tbaa !11
  %268 = zext i16 %267 to i32
  %269 = load i16, ptr %19, align 2, !tbaa !11
  %270 = zext i16 %269 to i32
  %271 = sub nsw i32 %268, %270
  %272 = icmp slt i32 %266, %271
  br i1 %272, label %274, label %273

273:                                              ; preds = %264
  call void @llvm.lifetime.end.p0(i64 2, ptr %27) #4
  br label %313

274:                                              ; preds = %264
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  %275 = load ptr, ptr %10, align 8, !tbaa !5
  %276 = load i32, ptr %12, align 4, !tbaa !9
  %277 = zext i32 %276 to i64
  %278 = getelementptr inbounds i8, ptr %275, i64 %277
  %279 = getelementptr inbounds i8, ptr %278, i64 4
  %280 = load ptr, ptr %18, align 8, !tbaa !5
  %281 = getelementptr inbounds %struct.otl_ChainingRule, ptr %280, i32 0, i32 1
  %282 = load i16, ptr %281, align 2, !tbaa !21
  %283 = zext i16 %282 to i32
  %284 = mul nsw i32 2, %283
  %285 = sext i32 %284 to i64
  %286 = getelementptr inbounds i8, ptr %279, i64 %285
  %287 = load i16, ptr %27, align 2, !tbaa !11
  %288 = zext i16 %287 to i32
  %289 = mul nsw i32 %288, 2
  %290 = sext i32 %289 to i64
  %291 = getelementptr inbounds i8, ptr %286, i64 %290
  %292 = call zeroext i16 @read_16u(ptr noundef %291)
  %293 = zext i16 %292 to i32
  store i32 %293, ptr %28, align 4, !tbaa !9
  %294 = load ptr, ptr %15, align 8, !tbaa !5
  %295 = load ptr, ptr %10, align 8, !tbaa !5
  %296 = load i32, ptr %11, align 4, !tbaa !9
  %297 = load i32, ptr %28, align 4, !tbaa !9
  %298 = trunc i32 %297 to i16
  %299 = load i32, ptr %12, align 4, !tbaa !9
  %300 = load i16, ptr %16, align 2, !tbaa !11
  %301 = load ptr, ptr %17, align 8, !tbaa !5
  %302 = call ptr %294(ptr noundef %295, i32 noundef %296, i16 noundef zeroext %298, i32 noundef %299, i16 noundef zeroext 2, i16 noundef zeroext %300, ptr noundef %301)
  %303 = load ptr, ptr %18, align 8, !tbaa !5
  %304 = getelementptr inbounds %struct.otl_ChainingRule, ptr %303, i32 0, i32 3
  %305 = load ptr, ptr %304, align 8, !tbaa !15
  %306 = load i16, ptr %24, align 2, !tbaa !11
  %307 = add i16 %306, 1
  store i16 %307, ptr %24, align 2, !tbaa !11
  %308 = zext i16 %306 to i64
  %309 = getelementptr inbounds ptr, ptr %305, i64 %308
  store ptr %302, ptr %309, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #4
  br label %310

310:                                              ; preds = %274
  %311 = load i16, ptr %27, align 2, !tbaa !11
  %312 = add i16 %311, 1
  store i16 %312, ptr %27, align 2, !tbaa !11
  br label %264, !llvm.loop !25

313:                                              ; preds = %273
  call void @llvm.lifetime.start.p0(i64 2, ptr %29) #4
  store i16 0, ptr %29, align 2, !tbaa !11
  br label %314

314:                                              ; preds = %360, %313
  %315 = load i16, ptr %29, align 2, !tbaa !11
  %316 = zext i16 %315 to i32
  %317 = load i16, ptr %22, align 2, !tbaa !11
  %318 = zext i16 %317 to i32
  %319 = icmp slt i32 %316, %318
  br i1 %319, label %321, label %320

320:                                              ; preds = %314
  call void @llvm.lifetime.end.p0(i64 2, ptr %29) #4
  br label %363

321:                                              ; preds = %314
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #4
  %322 = load ptr, ptr %10, align 8, !tbaa !5
  %323 = load i32, ptr %12, align 4, !tbaa !9
  %324 = zext i32 %323 to i64
  %325 = getelementptr inbounds i8, ptr %322, i64 %324
  %326 = getelementptr inbounds i8, ptr %325, i64 6
  %327 = load ptr, ptr %18, align 8, !tbaa !5
  %328 = getelementptr inbounds %struct.otl_ChainingRule, ptr %327, i32 0, i32 2
  %329 = load i16, ptr %328, align 4, !tbaa !22
  %330 = zext i16 %329 to i32
  %331 = load i16, ptr %19, align 2, !tbaa !11
  %332 = zext i16 %331 to i32
  %333 = sub nsw i32 %330, %332
  %334 = mul nsw i32 2, %333
  %335 = sext i32 %334 to i64
  %336 = getelementptr inbounds i8, ptr %326, i64 %335
  %337 = load i16, ptr %29, align 2, !tbaa !11
  %338 = zext i16 %337 to i32
  %339 = mul nsw i32 %338, 2
  %340 = sext i32 %339 to i64
  %341 = getelementptr inbounds i8, ptr %336, i64 %340
  %342 = call zeroext i16 @read_16u(ptr noundef %341)
  %343 = zext i16 %342 to i32
  store i32 %343, ptr %30, align 4, !tbaa !9
  %344 = load ptr, ptr %15, align 8, !tbaa !5
  %345 = load ptr, ptr %10, align 8, !tbaa !5
  %346 = load i32, ptr %11, align 4, !tbaa !9
  %347 = load i32, ptr %30, align 4, !tbaa !9
  %348 = trunc i32 %347 to i16
  %349 = load i32, ptr %12, align 4, !tbaa !9
  %350 = load i16, ptr %16, align 2, !tbaa !11
  %351 = load ptr, ptr %17, align 8, !tbaa !5
  %352 = call ptr %344(ptr noundef %345, i32 noundef %346, i16 noundef zeroext %348, i32 noundef %349, i16 noundef zeroext 3, i16 noundef zeroext %350, ptr noundef %351)
  %353 = load ptr, ptr %18, align 8, !tbaa !5
  %354 = getelementptr inbounds %struct.otl_ChainingRule, ptr %353, i32 0, i32 3
  %355 = load ptr, ptr %354, align 8, !tbaa !15
  %356 = load i16, ptr %24, align 2, !tbaa !11
  %357 = add i16 %356, 1
  store i16 %357, ptr %24, align 2, !tbaa !11
  %358 = zext i16 %356 to i64
  %359 = getelementptr inbounds ptr, ptr %355, i64 %358
  store ptr %352, ptr %359, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #4
  br label %360

360:                                              ; preds = %321
  %361 = load i16, ptr %29, align 2, !tbaa !11
  %362 = add i16 %361, 1
  store i16 %362, ptr %29, align 2, !tbaa !11
  br label %314, !llvm.loop !26

363:                                              ; preds = %320
  %364 = load i16, ptr %23, align 2, !tbaa !11
  %365 = load ptr, ptr %18, align 8, !tbaa !5
  %366 = getelementptr inbounds %struct.otl_ChainingRule, ptr %365, i32 0, i32 4
  store i16 %364, ptr %366, align 8, !tbaa !27
  %367 = load ptr, ptr %18, align 8, !tbaa !5
  %368 = getelementptr inbounds %struct.otl_ChainingRule, ptr %367, i32 0, i32 4
  %369 = load i16, ptr %368, align 8, !tbaa !27
  %370 = zext i16 %369 to i64
  %371 = mul i64 24, %370
  %372 = call ptr @__caryll_allocate_clean(i64 noundef %371, i64 noundef 285)
  %373 = load ptr, ptr %18, align 8, !tbaa !5
  %374 = getelementptr inbounds %struct.otl_ChainingRule, ptr %373, i32 0, i32 5
  store ptr %372, ptr %374, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 2, ptr %31) #4
  store i16 0, ptr %31, align 2, !tbaa !11
  br label %375

375:                                              ; preds = %453, %363
  %376 = load i16, ptr %31, align 2, !tbaa !11
  %377 = zext i16 %376 to i32
  %378 = load i16, ptr %23, align 2, !tbaa !11
  %379 = zext i16 %378 to i32
  %380 = icmp slt i32 %377, %379
  br i1 %380, label %382, label %381

381:                                              ; preds = %375
  call void @llvm.lifetime.end.p0(i64 2, ptr %31) #4
  br label %456

382:                                              ; preds = %375
  %383 = load ptr, ptr %18, align 8, !tbaa !5
  %384 = getelementptr inbounds %struct.otl_ChainingRule, ptr %383, i32 0, i32 1
  %385 = load i16, ptr %384, align 2, !tbaa !21
  %386 = zext i16 %385 to i32
  %387 = load ptr, ptr %10, align 8, !tbaa !5
  %388 = load i32, ptr %12, align 4, !tbaa !9
  %389 = zext i32 %388 to i64
  %390 = getelementptr inbounds i8, ptr %387, i64 %389
  %391 = getelementptr inbounds i8, ptr %390, i64 8
  %392 = load ptr, ptr %18, align 8, !tbaa !5
  %393 = getelementptr inbounds %struct.otl_ChainingRule, ptr %392, i32 0, i32 0
  %394 = load i16, ptr %393, align 8, !tbaa !20
  %395 = zext i16 %394 to i32
  %396 = load i16, ptr %19, align 2, !tbaa !11
  %397 = zext i16 %396 to i32
  %398 = sub nsw i32 %395, %397
  %399 = mul nsw i32 2, %398
  %400 = sext i32 %399 to i64
  %401 = getelementptr inbounds i8, ptr %391, i64 %400
  %402 = load i16, ptr %31, align 2, !tbaa !11
  %403 = zext i16 %402 to i32
  %404 = mul nsw i32 %403, 4
  %405 = sext i32 %404 to i64
  %406 = getelementptr inbounds i8, ptr %401, i64 %405
  %407 = call zeroext i16 @read_16u(ptr noundef %406)
  %408 = zext i16 %407 to i32
  %409 = add nsw i32 %386, %408
  %410 = trunc i32 %409 to i16
  %411 = load ptr, ptr %18, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct.otl_ChainingRule, ptr %411, i32 0, i32 5
  %413 = load ptr, ptr %412, align 8, !tbaa !17
  %414 = load i16, ptr %31, align 2, !tbaa !11
  %415 = zext i16 %414 to i64
  %416 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %413, i64 %415
  %417 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %416, i32 0, i32 0
  store i16 %410, ptr %417, align 8, !tbaa !28
  %418 = load ptr, ptr %18, align 8, !tbaa !5
  %419 = getelementptr inbounds %struct.otl_ChainingRule, ptr %418, i32 0, i32 5
  %420 = load ptr, ptr %419, align 8, !tbaa !17
  %421 = load i16, ptr %31, align 2, !tbaa !11
  %422 = zext i16 %421 to i64
  %423 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %420, i64 %422
  %424 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %423, i32 0, i32 1
  call void @llvm.lifetime.start.p0(i64 16, ptr %32) #4
  %425 = load ptr, ptr getelementptr inbounds (%struct.otfcc_HandlePackage, ptr @otfcc_iHandle, i32 0, i32 8), align 8, !tbaa !31
  %426 = load ptr, ptr %10, align 8, !tbaa !5
  %427 = load i32, ptr %12, align 4, !tbaa !9
  %428 = zext i32 %427 to i64
  %429 = getelementptr inbounds i8, ptr %426, i64 %428
  %430 = getelementptr inbounds i8, ptr %429, i64 8
  %431 = load ptr, ptr %18, align 8, !tbaa !5
  %432 = getelementptr inbounds %struct.otl_ChainingRule, ptr %431, i32 0, i32 0
  %433 = load i16, ptr %432, align 8, !tbaa !20
  %434 = zext i16 %433 to i32
  %435 = load i16, ptr %19, align 2, !tbaa !11
  %436 = zext i16 %435 to i32
  %437 = sub nsw i32 %434, %436
  %438 = mul nsw i32 2, %437
  %439 = sext i32 %438 to i64
  %440 = getelementptr inbounds i8, ptr %430, i64 %439
  %441 = load i16, ptr %31, align 2, !tbaa !11
  %442 = zext i16 %441 to i32
  %443 = mul nsw i32 %442, 4
  %444 = sext i32 %443 to i64
  %445 = getelementptr inbounds i8, ptr %440, i64 %444
  %446 = getelementptr inbounds i8, ptr %445, i64 2
  %447 = call zeroext i16 @read_16u(ptr noundef %446)
  %448 = call { i64, ptr } %425(i16 noundef zeroext %447)
  %449 = getelementptr inbounds { i64, ptr }, ptr %32, i32 0, i32 0
  %450 = extractvalue { i64, ptr } %448, 0
  store i64 %450, ptr %449, align 8
  %451 = getelementptr inbounds { i64, ptr }, ptr %32, i32 0, i32 1
  %452 = extractvalue { i64, ptr } %448, 1
  store ptr %452, ptr %451, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %424, ptr align 8 %32, i64 16, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.end.p0(i64 16, ptr %32) #4
  br label %453

453:                                              ; preds = %382
  %454 = load i16, ptr %31, align 2, !tbaa !11
  %455 = add i16 %454, 1
  store i16 %455, ptr %31, align 2, !tbaa !11
  br label %375, !llvm.loop !34

456:                                              ; preds = %381
  %457 = load ptr, ptr %18, align 8, !tbaa !5
  call void @reverseBacktracks(ptr noundef %457)
  %458 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %458, ptr %9, align 8
  store i32 1, ptr %33, align 4
  br label %461

459:                                              ; preds = %173, %130, %93, %65, %49
  %460 = load ptr, ptr %18, align 8, !tbaa !5
  call void @deleteRule(ptr noundef %460)
  store ptr null, ptr %18, align 8, !tbaa !5
  store ptr null, ptr %9, align 8
  store i32 1, ptr %33, align 4
  br label %461

461:                                              ; preds = %459, %456
  call void @llvm.lifetime.end.p0(i64 2, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  %462 = load ptr, ptr %9, align 8
  ret ptr %462
}

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

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

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


; 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.otfcc_HandlePackage = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.otl_ChainLookupApplication = type { i16, %struct.otfcc_Handle }
%struct.otfcc_Handle = type { i32, i16, ptr }

@otfcc_iHandle = external local_unnamed_addr constant %struct.otfcc_HandlePackage, align 8

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @__caryll_allocate_clean(i64 noundef, i64 noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i16 @read_16u(ptr noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @reverseBacktracks(ptr noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @deleteRule(ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local ptr @GeneralReadChainingRule(ptr noundef %0, i32 noundef %1, i32 noundef %2, i16 noundef zeroext %3, i1 noundef zeroext %4, ptr nocapture noundef readonly %5, i16 noundef zeroext %6, ptr noundef %7) local_unnamed_addr #1 {
  %9 = tail call ptr @__caryll_allocate_clean(i64 noundef 32, i64 noundef 247)
  %10 = getelementptr inbounds i8, ptr %9, i64 8
  store ptr null, ptr %10, align 8, !tbaa !5
  %11 = getelementptr inbounds i8, ptr %9, i64 24
  store ptr null, ptr %11, align 8, !tbaa !11
  %12 = add i32 %2, 8
  %13 = icmp ugt i32 %12, %1
  br i1 %13, label %142, label %14

14:                                               ; preds = %8
  %15 = zext i32 %2 to i64
  %16 = getelementptr inbounds i8, ptr %0, i64 %15
  %17 = tail call zeroext i16 @read_16u(ptr noundef %16)
  %18 = zext i16 %17 to i32
  %19 = shl nuw nsw i32 %18, 1
  %20 = add i32 %2, 4
  %21 = add i32 %20, %19
  %22 = icmp ugt i32 %21, %1
  br i1 %22, label %142, label %23

23:                                               ; preds = %14
  %24 = getelementptr inbounds i8, ptr %16, i64 2
  %25 = zext nneg i32 %19 to i64
  %26 = getelementptr inbounds i8, ptr %24, i64 %25
  %27 = tail call zeroext i16 @read_16u(ptr noundef nonnull %26)
  %28 = zext i16 %27 to i32
  %29 = add nuw nsw i32 %28, %18
  %30 = zext i1 %4 to i32
  %31 = sub nsw i32 %29, %30
  %32 = shl nsw i32 %31, 1
  %33 = add i32 %2, 6
  %34 = add i32 %33, %32
  %35 = icmp ugt i32 %34, %1
  br i1 %35, label %142, label %36

36:                                               ; preds = %23
  %37 = getelementptr inbounds i8, ptr %16, i64 4
  %38 = sext i32 %32 to i64
  %39 = getelementptr inbounds i8, ptr %37, i64 %38
  %40 = tail call zeroext i16 @read_16u(ptr noundef nonnull %39)
  %41 = zext i16 %40 to i32
  %42 = add nsw i32 %31, %41
  %43 = shl nsw i32 %42, 1
  %44 = add i32 %12, %43
  %45 = icmp ugt i32 %44, %1
  br i1 %45, label %142, label %46

46:                                               ; preds = %36
  %47 = getelementptr inbounds i8, ptr %16, i64 6
  %48 = sext i32 %43 to i64
  %49 = getelementptr inbounds i8, ptr %47, i64 %48
  %50 = tail call zeroext i16 @read_16u(ptr noundef nonnull %49)
  %51 = zext i16 %50 to i32
  %52 = shl nuw nsw i32 %51, 2
  %53 = add i32 %44, %52
  %54 = icmp ugt i32 %53, %1
  br i1 %54, label %142, label %55

55:                                               ; preds = %46
  %56 = trunc i32 %29 to i16
  %57 = add i16 %40, %56
  store i16 %57, ptr %9, align 8, !tbaa !12
  %58 = getelementptr inbounds i8, ptr %9, i64 2
  store i16 %17, ptr %58, align 2, !tbaa !13
  %59 = getelementptr inbounds i8, ptr %9, i64 4
  store i16 %56, ptr %59, align 4, !tbaa !14
  %60 = zext i16 %57 to i64
  %61 = shl nuw nsw i64 %60, 3
  %62 = tail call ptr @__caryll_allocate_clean(i64 noundef %61, i64 noundef 267)
  store ptr %62, ptr %10, align 8, !tbaa !5
  %.not = icmp eq i16 %17, 0
  br i1 %.not, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %55
  %wide.trip.count = zext i16 %17 to i64
  br label %.lr.ph

._crit_edge:                                      ; preds = %.lr.ph, %55
  br i1 %4, label %69, label %75

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %indvars.iv = phi i64 [ 0, %.lr.ph.preheader ], [ %indvars.iv.next, %.lr.ph ]
  %63 = shl nuw nsw i64 %indvars.iv, 1
  %64 = getelementptr inbounds i8, ptr %24, i64 %63
  %65 = tail call zeroext i16 @read_16u(ptr noundef nonnull %64)
  %66 = tail call ptr %5(ptr noundef %0, i32 noundef %1, i16 noundef zeroext %65, i32 noundef %2, i16 noundef zeroext 1, i16 noundef zeroext %6, ptr noundef %7) #2
  %67 = load ptr, ptr %10, align 8, !tbaa !5
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %68 = getelementptr inbounds ptr, ptr %67, i64 %indvars.iv
  store ptr %66, ptr %68, align 8, !tbaa !15
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !16

69:                                               ; preds = %._crit_edge
  %70 = tail call ptr %5(ptr noundef %0, i32 noundef %1, i16 noundef zeroext %3, i32 noundef %2, i16 noundef zeroext 2, i16 noundef zeroext %6, ptr noundef %7) #2
  %71 = load ptr, ptr %10, align 8, !tbaa !5
  %72 = add i16 %17, 1
  %73 = zext i16 %17 to i64
  %74 = getelementptr inbounds ptr, ptr %71, i64 %73
  store ptr %70, ptr %74, align 8, !tbaa !15
  br label %75

75:                                               ; preds = %69, %._crit_edge
  %.1 = phi i16 [ %72, %69 ], [ %17, %._crit_edge ]
  %76 = sub nsw i32 %28, %30
  %77 = icmp sgt i32 %76, 0
  br i1 %77, label %.lr.ph153, label %.preheader

.preheader:                                       ; preds = %.lr.ph153, %75
  %.2.lcssa = phi i16 [ %.1, %75 ], [ %89, %.lr.ph153 ]
  %.not163 = icmp eq i16 %40, 0
  br i1 %.not163, label %._crit_edge158, label %.lr.ph157.preheader

.lr.ph157.preheader:                              ; preds = %.preheader
  %wide.trip.count172 = zext i16 %40 to i64
  br label %.lr.ph157

.lr.ph153:                                        ; preds = %75, %.lr.ph153
  %78 = phi i32 [ %93, %.lr.ph153 ], [ 0, %75 ]
  %.2151 = phi i16 [ %89, %.lr.ph153 ], [ %.1, %75 ]
  %.0141150 = phi i16 [ %92, %.lr.ph153 ], [ 0, %75 ]
  %79 = load i16, ptr %58, align 2, !tbaa !13
  %80 = zext i16 %79 to i64
  %81 = shl nuw nsw i64 %80, 1
  %82 = getelementptr inbounds i8, ptr %37, i64 %81
  %83 = shl nuw nsw i32 %78, 1
  %84 = zext nneg i32 %83 to i64
  %85 = getelementptr inbounds i8, ptr %82, i64 %84
  %86 = tail call zeroext i16 @read_16u(ptr noundef nonnull %85)
  %87 = tail call ptr %5(ptr noundef %0, i32 noundef %1, i16 noundef zeroext %86, i32 noundef %2, i16 noundef zeroext 2, i16 noundef zeroext %6, ptr noundef %7) #2
  %88 = load ptr, ptr %10, align 8, !tbaa !5
  %89 = add i16 %.2151, 1
  %90 = zext i16 %.2151 to i64
  %91 = getelementptr inbounds ptr, ptr %88, i64 %90
  store ptr %87, ptr %91, align 8, !tbaa !15
  %92 = add nuw i16 %.0141150, 1
  %93 = zext i16 %92 to i32
  %94 = icmp ugt i32 %76, %93
  br i1 %94, label %.lr.ph153, label %.preheader, !llvm.loop !18

._crit_edge158:                                   ; preds = %.lr.ph157, %.preheader
  %95 = getelementptr inbounds i8, ptr %9, i64 16
  store i16 %50, ptr %95, align 8, !tbaa !19
  %96 = zext i16 %50 to i64
  %97 = mul nuw nsw i64 %96, 24
  %98 = tail call ptr @__caryll_allocate_clean(i64 noundef %97, i64 noundef 285)
  store ptr %98, ptr %11, align 8, !tbaa !11
  %.not164 = icmp eq i16 %50, 0
  br i1 %.not164, label %._crit_edge162, label %.lr.ph161

.lr.ph161:                                        ; preds = %._crit_edge158
  %99 = getelementptr inbounds i8, ptr %16, i64 8
  %100 = load ptr, ptr getelementptr inbounds (i8, ptr @otfcc_iHandle, i64 64), align 8
  br label %115

.lr.ph157:                                        ; preds = %.lr.ph157.preheader, %.lr.ph157
  %indvars.iv169 = phi i64 [ 0, %.lr.ph157.preheader ], [ %indvars.iv.next170, %.lr.ph157 ]
  %.3156 = phi i16 [ %.2.lcssa, %.lr.ph157.preheader ], [ %112, %.lr.ph157 ]
  %101 = load i16, ptr %59, align 4, !tbaa !14
  %102 = zext i16 %101 to i32
  %103 = sub nsw i32 %102, %30
  %104 = shl nsw i32 %103, 1
  %105 = sext i32 %104 to i64
  %106 = getelementptr inbounds i8, ptr %47, i64 %105
  %107 = shl nuw nsw i64 %indvars.iv169, 1
  %108 = getelementptr inbounds i8, ptr %106, i64 %107
  %109 = tail call zeroext i16 @read_16u(ptr noundef nonnull %108)
  %110 = tail call ptr %5(ptr noundef %0, i32 noundef %1, i16 noundef zeroext %109, i32 noundef %2, i16 noundef zeroext 3, i16 noundef zeroext %6, ptr noundef %7) #2
  %111 = load ptr, ptr %10, align 8, !tbaa !5
  %112 = add i16 %.3156, 1
  %113 = zext i16 %.3156 to i64
  %114 = getelementptr inbounds ptr, ptr %111, i64 %113
  store ptr %110, ptr %114, align 8, !tbaa !15
  %indvars.iv.next170 = add nuw nsw i64 %indvars.iv169, 1
  %exitcond173.not = icmp eq i64 %indvars.iv.next170, %wide.trip.count172
  br i1 %exitcond173.not, label %._crit_edge158, label %.lr.ph157, !llvm.loop !20

._crit_edge162:                                   ; preds = %115, %._crit_edge158
  tail call void @reverseBacktracks(ptr noundef nonnull %9)
  br label %143

115:                                              ; preds = %.lr.ph161, %115
  %indvars.iv174 = phi i64 [ 0, %.lr.ph161 ], [ %indvars.iv.next175, %115 ]
  %116 = load i16, ptr %58, align 2, !tbaa !13
  %117 = load i16, ptr %9, align 8, !tbaa !12
  %118 = zext i16 %117 to i32
  %119 = sub nsw i32 %118, %30
  %120 = shl nsw i32 %119, 1
  %121 = sext i32 %120 to i64
  %122 = getelementptr inbounds i8, ptr %99, i64 %121
  %123 = shl nuw nsw i64 %indvars.iv174, 2
  %124 = getelementptr inbounds i8, ptr %122, i64 %123
  %125 = tail call zeroext i16 @read_16u(ptr noundef nonnull %124)
  %126 = add i16 %125, %116
  %127 = load ptr, ptr %11, align 8, !tbaa !11
  %128 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %127, i64 %indvars.iv174
  store i16 %126, ptr %128, align 8, !tbaa !21
  %129 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %127, i64 %indvars.iv174, i32 1
  %130 = load i16, ptr %9, align 8, !tbaa !12
  %131 = zext i16 %130 to i32
  %132 = sub nsw i32 %131, %30
  %133 = shl nsw i32 %132, 1
  %134 = sext i32 %133 to i64
  %135 = getelementptr inbounds i8, ptr %99, i64 %134
  %136 = getelementptr inbounds i8, ptr %135, i64 %123
  %137 = getelementptr inbounds i8, ptr %136, i64 2
  %138 = tail call zeroext i16 @read_16u(ptr noundef nonnull %137)
  %139 = tail call { i64, ptr } %100(i16 noundef zeroext %138) #2
  %140 = extractvalue { i64, ptr } %139, 0
  %141 = extractvalue { i64, ptr } %139, 1
  store i64 %140, ptr %129, align 8
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %129, i64 8
  store ptr %141, ptr %.sroa.4.0..sroa_idx, align 8, !tbaa !15
  %indvars.iv.next175 = add nuw nsw i64 %indvars.iv174, 1
  %exitcond178.not = icmp eq i64 %indvars.iv.next175, %96
  br i1 %exitcond178.not, label %._crit_edge162, label %115, !llvm.loop !25

142:                                              ; preds = %46, %36, %23, %14, %8
  tail call void @deleteRule(ptr noundef nonnull %9)
  br label %143

143:                                              ; preds = %142, %._crit_edge162
  %.0 = phi ptr [ null, %142 ], [ %9, %._crit_edge162 ]
  ret ptr %.0
}

attributes #0 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #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, !10, i64 8}
!6 = !{!"", !7, i64 0, !7, i64 2, !7, i64 4, !10, i64 8, !7, i64 16, !10, i64 24}
!7 = !{!"short", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!6, !10, i64 24}
!12 = !{!6, !7, i64 0}
!13 = !{!6, !7, i64 2}
!14 = !{!6, !7, i64 4}
!15 = !{!10, !10, i64 0}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}
!18 = distinct !{!18, !17}
!19 = !{!6, !7, i64 16}
!20 = distinct !{!20, !17}
!21 = !{!22, !7, i64 0}
!22 = !{!"", !7, i64 0, !23, i64 8}
!23 = !{!"otfcc_Handle", !24, i64 0, !7, i64 4, !10, i64 8}
!24 = !{!"int", !8, i64 0}
!25 = distinct !{!25, !17}


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