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

; 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_ICoverage = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.__otfcc_IClassDef = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.subtable_chaining = type { i32, %union.anon }
%union.anon = type { %struct.anon }
%struct.anon = type { i16, ptr, ptr, ptr, ptr }
%struct.otl_ClassDef = type { i16, i32, i16, ptr, ptr }
%struct.otl_Coverage = type { i16, i32, ptr }
%struct.otl_ChainingRule = type { i16, i16, i16, ptr, i16, ptr }
%struct.otfcc_Handle = type { i32, i16, ptr }
%struct.otl_ChainLookupApplication = type { i16, %struct.otfcc_Handle }

@otl_iCoverage = external constant %struct.__otfcc_ICoverage, align 8
@otl_iClassDef = external constant %struct.__otfcc_IClassDef, 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: 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 void @reverseBacktracks(ptr noundef) #1

declare ptr @bk_new_Block(i32 noundef, ...) #2

declare ptr @bk_push(ptr noundef, i32 noundef, ...) #2

declare ptr @bk_newBlockFromBuffer(ptr noundef) #2

declare ptr @bk_build_Block(ptr noundef) #2

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

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

; Function Attrs: nounwind uwtable
define dso_local ptr @otfcc_build_contextual_classes(ptr noundef %0) #4 {
  %2 = alloca ptr, align 8
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i16, align 2
  %8 = alloca i16, align 2
  %9 = alloca i16, align 2
  %10 = alloca i16, align 2
  %11 = alloca i16, align 2
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca i16, align 2
  %15 = alloca ptr, align 8
  %16 = alloca i16, align 2
  %17 = alloca i16, align 2
  %18 = alloca i16, align 2
  %19 = alloca ptr, align 8
  %20 = alloca i16, align 2
  %21 = alloca i16, align 2
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %3) #5
  %22 = load ptr, ptr %2, align 8, !tbaa !5
  store ptr %22, ptr %3, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #5
  %23 = call ptr @__caryll_allocate_clean(i64 noundef 16, i64 noundef 174)
  store ptr %23, ptr %4, align 8, !tbaa !5
  %24 = load ptr, ptr %3, align 8, !tbaa !5
  %25 = getelementptr inbounds %struct.subtable_chaining, ptr %24, i32 0, i32 1
  %26 = getelementptr inbounds %struct.anon, ptr %25, i32 0, i32 3
  %27 = load ptr, ptr %26, align 8, !tbaa !9
  %28 = getelementptr inbounds %struct.otl_ClassDef, ptr %27, i32 0, i32 0
  %29 = load i16, ptr %28, align 8, !tbaa !10
  %30 = load ptr, ptr %4, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.otl_Coverage, ptr %30, i32 0, i32 0
  store i16 %29, ptr %31, align 8, !tbaa !14
  %32 = load ptr, ptr %3, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.subtable_chaining, ptr %32, i32 0, i32 1
  %34 = getelementptr inbounds %struct.anon, ptr %33, i32 0, i32 3
  %35 = load ptr, ptr %34, align 8, !tbaa !9
  %36 = getelementptr inbounds %struct.otl_ClassDef, ptr %35, i32 0, i32 3
  %37 = load ptr, ptr %36, align 8, !tbaa !16
  %38 = load ptr, ptr %4, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.otl_Coverage, ptr %38, i32 0, i32 2
  store ptr %37, ptr %39, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #5
  %40 = load ptr, ptr getelementptr inbounds (%struct.__otfcc_ICoverage, ptr @otl_iCoverage, i32 0, i32 12), align 8, !tbaa !18
  %41 = load ptr, ptr %4, align 8, !tbaa !5
  %42 = call ptr %40(ptr noundef %41)
  %43 = call ptr @bk_newBlockFromBuffer(ptr noundef %42)
  %44 = load ptr, ptr getelementptr inbounds (%struct.__otfcc_IClassDef, ptr @otl_iClassDef, i32 0, i32 13), align 8, !tbaa !20
  %45 = load ptr, ptr %3, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.subtable_chaining, ptr %45, i32 0, i32 1
  %47 = getelementptr inbounds %struct.anon, ptr %46, i32 0, i32 3
  %48 = load ptr, ptr %47, align 8, !tbaa !9
  %49 = call ptr %44(ptr noundef %48)
  %50 = call ptr @bk_newBlockFromBuffer(ptr noundef %49)
  %51 = load ptr, ptr %3, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.subtable_chaining, ptr %51, i32 0, i32 1
  %53 = getelementptr inbounds %struct.anon, ptr %52, i32 0, i32 3
  %54 = load ptr, ptr %53, align 8, !tbaa !9
  %55 = getelementptr inbounds %struct.otl_ClassDef, ptr %54, i32 0, i32 2
  %56 = load i16, ptr %55, align 8, !tbaa !22
  %57 = zext i16 %56 to i32
  %58 = add nsw i32 %57, 1
  %59 = call ptr (i32, ...) @bk_new_Block(i32 noundef 2, i32 noundef 2, i32 noundef 16, ptr noundef %43, i32 noundef 16, ptr noundef %50, i32 noundef 2, i32 noundef %58, i32 noundef 0)
  store ptr %59, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #5
  %60 = load ptr, ptr %3, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.subtable_chaining, ptr %60, i32 0, i32 1
  %62 = getelementptr inbounds %struct.anon, ptr %61, i32 0, i32 3
  %63 = load ptr, ptr %62, align 8, !tbaa !9
  %64 = getelementptr inbounds %struct.otl_ClassDef, ptr %63, i32 0, i32 2
  %65 = load i16, ptr %64, align 8, !tbaa !22
  %66 = zext i16 %65 to i32
  %67 = add nsw i32 %66, 1
  %68 = sext i32 %67 to i64
  %69 = mul i64 2, %68
  %70 = call ptr @__caryll_allocate_clean(i64 noundef %69, i64 noundef 186)
  store ptr %70, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %7) #5
  store i16 0, ptr %7, align 2, !tbaa !23
  br label %71

71:                                               ; preds = %88, %1
  %72 = load i16, ptr %7, align 2, !tbaa !23
  %73 = zext i16 %72 to i32
  %74 = load ptr, ptr %3, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct.subtable_chaining, ptr %74, i32 0, i32 1
  %76 = getelementptr inbounds %struct.anon, ptr %75, i32 0, i32 3
  %77 = load ptr, ptr %76, align 8, !tbaa !9
  %78 = getelementptr inbounds %struct.otl_ClassDef, ptr %77, i32 0, i32 2
  %79 = load i16, ptr %78, align 8, !tbaa !22
  %80 = zext i16 %79 to i32
  %81 = icmp sle i32 %73, %80
  br i1 %81, label %83, label %82

82:                                               ; preds = %71
  call void @llvm.lifetime.end.p0(i64 2, ptr %7) #5
  br label %91

83:                                               ; preds = %71
  %84 = load ptr, ptr %6, align 8, !tbaa !5
  %85 = load i16, ptr %7, align 2, !tbaa !23
  %86 = zext i16 %85 to i64
  %87 = getelementptr inbounds i16, ptr %84, i64 %86
  store i16 0, ptr %87, align 2, !tbaa !23
  br label %88

88:                                               ; preds = %83
  %89 = load i16, ptr %7, align 2, !tbaa !23
  %90 = add i16 %89, 1
  store i16 %90, ptr %7, align 2, !tbaa !23
  br label %71, !llvm.loop !24

91:                                               ; preds = %82
  call void @llvm.lifetime.start.p0(i64 2, ptr %8) #5
  store i16 0, ptr %8, align 2, !tbaa !23
  br label %92

92:                                               ; preds = %152, %91
  %93 = load i16, ptr %8, align 2, !tbaa !23
  %94 = zext i16 %93 to i32
  %95 = load ptr, ptr %3, align 8, !tbaa !5
  %96 = getelementptr inbounds %struct.subtable_chaining, ptr %95, i32 0, i32 1
  %97 = getelementptr inbounds %struct.anon, ptr %96, i32 0, i32 0
  %98 = load i16, ptr %97, align 8, !tbaa !9
  %99 = zext i16 %98 to i32
  %100 = icmp slt i32 %94, %99
  br i1 %100, label %102, label %101

101:                                              ; preds = %92
  call void @llvm.lifetime.end.p0(i64 2, ptr %8) #5
  br label %155

102:                                              ; preds = %92
  call void @llvm.lifetime.start.p0(i64 2, ptr %9) #5
  %103 = load ptr, ptr %3, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.subtable_chaining, ptr %103, i32 0, i32 1
  %105 = getelementptr inbounds %struct.anon, ptr %104, i32 0, i32 1
  %106 = load ptr, ptr %105, align 8, !tbaa !9
  %107 = load i16, ptr %8, align 2, !tbaa !23
  %108 = zext i16 %107 to i64
  %109 = getelementptr inbounds ptr, ptr %106, i64 %108
  %110 = load ptr, ptr %109, align 8, !tbaa !5
  %111 = getelementptr inbounds %struct.otl_ChainingRule, ptr %110, i32 0, i32 1
  %112 = load i16, ptr %111, align 2, !tbaa !26
  store i16 %112, ptr %9, align 2, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 2, ptr %10) #5
  %113 = load ptr, ptr %3, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.subtable_chaining, ptr %113, i32 0, i32 1
  %115 = getelementptr inbounds %struct.anon, ptr %114, i32 0, i32 1
  %116 = load ptr, ptr %115, align 8, !tbaa !9
  %117 = load i16, ptr %8, align 2, !tbaa !23
  %118 = zext i16 %117 to i64
  %119 = getelementptr inbounds ptr, ptr %116, i64 %118
  %120 = load ptr, ptr %119, align 8, !tbaa !5
  %121 = getelementptr inbounds %struct.otl_ChainingRule, ptr %120, i32 0, i32 3
  %122 = load ptr, ptr %121, align 8, !tbaa !28
  %123 = load i16, ptr %9, align 2, !tbaa !23
  %124 = zext i16 %123 to i64
  %125 = getelementptr inbounds ptr, ptr %122, i64 %124
  %126 = load ptr, ptr %125, align 8, !tbaa !5
  %127 = getelementptr inbounds %struct.otl_Coverage, ptr %126, i32 0, i32 2
  %128 = load ptr, ptr %127, align 8, !tbaa !17
  %129 = getelementptr inbounds %struct.otfcc_Handle, ptr %128, i64 0
  %130 = getelementptr inbounds %struct.otfcc_Handle, ptr %129, i32 0, i32 1
  %131 = load i16, ptr %130, align 4, !tbaa !29
  store i16 %131, ptr %10, align 2, !tbaa !23
  %132 = load i16, ptr %10, align 2, !tbaa !23
  %133 = zext i16 %132 to i32
  %134 = load ptr, ptr %3, align 8, !tbaa !5
  %135 = getelementptr inbounds %struct.subtable_chaining, ptr %134, i32 0, i32 1
  %136 = getelementptr inbounds %struct.anon, ptr %135, i32 0, i32 3
  %137 = load ptr, ptr %136, align 8, !tbaa !9
  %138 = getelementptr inbounds %struct.otl_ClassDef, ptr %137, i32 0, i32 2
  %139 = load i16, ptr %138, align 8, !tbaa !22
  %140 = zext i16 %139 to i32
  %141 = icmp sle i32 %133, %140
  br i1 %141, label %142, label %151

142:                                              ; preds = %102
  %143 = load ptr, ptr %6, align 8, !tbaa !5
  %144 = load i16, ptr %10, align 2, !tbaa !23
  %145 = zext i16 %144 to i64
  %146 = getelementptr inbounds i16, ptr %143, i64 %145
  %147 = load i16, ptr %146, align 2, !tbaa !23
  %148 = zext i16 %147 to i32
  %149 = add nsw i32 %148, 1
  %150 = trunc i32 %149 to i16
  store i16 %150, ptr %146, align 2, !tbaa !23
  br label %151

151:                                              ; preds = %142, %102
  call void @llvm.lifetime.end.p0(i64 2, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 2, ptr %9) #5
  br label %152

152:                                              ; preds = %151
  %153 = load i16, ptr %8, align 2, !tbaa !23
  %154 = add i16 %153, 1
  store i16 %154, ptr %8, align 2, !tbaa !23
  br label %92, !llvm.loop !31

155:                                              ; preds = %101
  call void @llvm.lifetime.start.p0(i64 2, ptr %11) #5
  store i16 0, ptr %11, align 2, !tbaa !23
  br label %156

156:                                              ; preds = %331, %155
  %157 = load i16, ptr %11, align 2, !tbaa !23
  %158 = zext i16 %157 to i32
  %159 = load ptr, ptr %3, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.subtable_chaining, ptr %159, i32 0, i32 1
  %161 = getelementptr inbounds %struct.anon, ptr %160, i32 0, i32 3
  %162 = load ptr, ptr %161, align 8, !tbaa !9
  %163 = getelementptr inbounds %struct.otl_ClassDef, ptr %162, i32 0, i32 2
  %164 = load i16, ptr %163, align 8, !tbaa !22
  %165 = zext i16 %164 to i32
  %166 = icmp sle i32 %158, %165
  br i1 %166, label %168, label %167

167:                                              ; preds = %156
  store i32 8, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %11) #5
  br label %334

168:                                              ; preds = %156
  %169 = load ptr, ptr %6, align 8, !tbaa !5
  %170 = load i16, ptr %11, align 2, !tbaa !23
  %171 = zext i16 %170 to i64
  %172 = getelementptr inbounds i16, ptr %169, i64 %171
  %173 = load i16, ptr %172, align 2, !tbaa !23
  %174 = icmp ne i16 %173, 0
  br i1 %174, label %175, label %327

175:                                              ; preds = %168
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  %176 = load ptr, ptr %6, align 8, !tbaa !5
  %177 = load i16, ptr %11, align 2, !tbaa !23
  %178 = zext i16 %177 to i64
  %179 = getelementptr inbounds i16, ptr %176, i64 %178
  %180 = load i16, ptr %179, align 2, !tbaa !23
  %181 = zext i16 %180 to i32
  %182 = call ptr (i32, ...) @bk_new_Block(i32 noundef 2, i32 noundef %181, i32 noundef 0)
  store ptr %182, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %14) #5
  store i16 0, ptr %14, align 2, !tbaa !23
  br label %183

183:                                              ; preds = %320, %175
  %184 = load i16, ptr %14, align 2, !tbaa !23
  %185 = zext i16 %184 to i32
  %186 = load ptr, ptr %3, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct.subtable_chaining, ptr %186, i32 0, i32 1
  %188 = getelementptr inbounds %struct.anon, ptr %187, i32 0, i32 0
  %189 = load i16, ptr %188, align 8, !tbaa !9
  %190 = zext i16 %189 to i32
  %191 = icmp slt i32 %185, %190
  br i1 %191, label %193, label %192

192:                                              ; preds = %183
  store i32 11, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %14) #5
  br label %323

193:                                              ; preds = %183
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  %194 = load ptr, ptr %3, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct.subtable_chaining, ptr %194, i32 0, i32 1
  %196 = getelementptr inbounds %struct.anon, ptr %195, i32 0, i32 1
  %197 = load ptr, ptr %196, align 8, !tbaa !9
  %198 = load i16, ptr %14, align 2, !tbaa !23
  %199 = zext i16 %198 to i64
  %200 = getelementptr inbounds ptr, ptr %197, i64 %199
  %201 = load ptr, ptr %200, align 8, !tbaa !5
  store ptr %201, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %16) #5
  %202 = load ptr, ptr %15, align 8, !tbaa !5
  %203 = getelementptr inbounds %struct.otl_ChainingRule, ptr %202, i32 0, i32 3
  %204 = load ptr, ptr %203, align 8, !tbaa !28
  %205 = load ptr, ptr %15, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct.otl_ChainingRule, ptr %205, i32 0, i32 1
  %207 = load i16, ptr %206, align 2, !tbaa !26
  %208 = zext i16 %207 to i64
  %209 = getelementptr inbounds ptr, ptr %204, i64 %208
  %210 = load ptr, ptr %209, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.otl_Coverage, ptr %210, i32 0, i32 2
  %212 = load ptr, ptr %211, align 8, !tbaa !17
  %213 = getelementptr inbounds %struct.otfcc_Handle, ptr %212, i64 0
  %214 = getelementptr inbounds %struct.otfcc_Handle, ptr %213, i32 0, i32 1
  %215 = load i16, ptr %214, align 4, !tbaa !29
  store i16 %215, ptr %16, align 2, !tbaa !23
  %216 = load i16, ptr %16, align 2, !tbaa !23
  %217 = zext i16 %216 to i32
  %218 = load i16, ptr %11, align 2, !tbaa !23
  %219 = zext i16 %218 to i32
  %220 = icmp ne i32 %217, %219
  br i1 %220, label %221, label %222

221:                                              ; preds = %193
  store i32 13, ptr %12, align 4
  br label %317

222:                                              ; preds = %193
  %223 = load ptr, ptr %15, align 8, !tbaa !5
  call void @reverseBacktracks(ptr noundef %223)
  call void @llvm.lifetime.start.p0(i64 2, ptr %17) #5
  %224 = load ptr, ptr %15, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.otl_ChainingRule, ptr %224, i32 0, i32 2
  %226 = load i16, ptr %225, align 4, !tbaa !32
  %227 = zext i16 %226 to i32
  %228 = load ptr, ptr %15, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.otl_ChainingRule, ptr %228, i32 0, i32 1
  %230 = load i16, ptr %229, align 2, !tbaa !26
  %231 = zext i16 %230 to i32
  %232 = sub nsw i32 %227, %231
  %233 = trunc i32 %232 to i16
  store i16 %233, ptr %17, align 2, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 2, ptr %18) #5
  %234 = load ptr, ptr %15, align 8, !tbaa !5
  %235 = getelementptr inbounds %struct.otl_ChainingRule, ptr %234, i32 0, i32 4
  %236 = load i16, ptr %235, align 8, !tbaa !33
  store i16 %236, ptr %18, align 2, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #5
  %237 = call ptr (i32, ...) @bk_new_Block(i32 noundef 0)
  store ptr %237, ptr %19, align 8, !tbaa !5
  %238 = load ptr, ptr %19, align 8, !tbaa !5
  %239 = load i16, ptr %17, align 2, !tbaa !23
  %240 = zext i16 %239 to i32
  %241 = call ptr (ptr, i32, ...) @bk_push(ptr noundef %238, i32 noundef 2, i32 noundef %240, i32 noundef 0)
  %242 = load ptr, ptr %19, align 8, !tbaa !5
  %243 = load i16, ptr %18, align 2, !tbaa !23
  %244 = zext i16 %243 to i32
  %245 = call ptr (ptr, i32, ...) @bk_push(ptr noundef %242, i32 noundef 2, i32 noundef %244, i32 noundef 0)
  call void @llvm.lifetime.start.p0(i64 2, ptr %20) #5
  %246 = load ptr, ptr %15, align 8, !tbaa !5
  %247 = getelementptr inbounds %struct.otl_ChainingRule, ptr %246, i32 0, i32 1
  %248 = load i16, ptr %247, align 2, !tbaa !26
  %249 = zext i16 %248 to i32
  %250 = add nsw i32 %249, 1
  %251 = trunc i32 %250 to i16
  store i16 %251, ptr %20, align 2, !tbaa !23
  br label %252

252:                                              ; preds = %277, %222
  %253 = load i16, ptr %20, align 2, !tbaa !23
  %254 = zext i16 %253 to i32
  %255 = load ptr, ptr %15, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.otl_ChainingRule, ptr %255, i32 0, i32 2
  %257 = load i16, ptr %256, align 4, !tbaa !32
  %258 = zext i16 %257 to i32
  %259 = icmp slt i32 %254, %258
  br i1 %259, label %261, label %260

260:                                              ; preds = %252
  store i32 14, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %20) #5
  br label %280

261:                                              ; preds = %252
  %262 = load ptr, ptr %19, align 8, !tbaa !5
  %263 = load ptr, ptr %15, align 8, !tbaa !5
  %264 = getelementptr inbounds %struct.otl_ChainingRule, ptr %263, i32 0, i32 3
  %265 = load ptr, ptr %264, align 8, !tbaa !28
  %266 = load i16, ptr %20, align 2, !tbaa !23
  %267 = zext i16 %266 to i64
  %268 = getelementptr inbounds ptr, ptr %265, i64 %267
  %269 = load ptr, ptr %268, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.otl_Coverage, ptr %269, i32 0, i32 2
  %271 = load ptr, ptr %270, align 8, !tbaa !17
  %272 = getelementptr inbounds %struct.otfcc_Handle, ptr %271, i64 0
  %273 = getelementptr inbounds %struct.otfcc_Handle, ptr %272, i32 0, i32 1
  %274 = load i16, ptr %273, align 4, !tbaa !29
  %275 = zext i16 %274 to i32
  %276 = call ptr (ptr, i32, ...) @bk_push(ptr noundef %262, i32 noundef 2, i32 noundef %275, i32 noundef 0)
  br label %277

277:                                              ; preds = %261
  %278 = load i16, ptr %20, align 2, !tbaa !23
  %279 = add i16 %278, 1
  store i16 %279, ptr %20, align 2, !tbaa !23
  br label %252, !llvm.loop !34

280:                                              ; preds = %260
  call void @llvm.lifetime.start.p0(i64 2, ptr %21) #5
  store i16 0, ptr %21, align 2, !tbaa !23
  br label %281

281:                                              ; preds = %310, %280
  %282 = load i16, ptr %21, align 2, !tbaa !23
  %283 = zext i16 %282 to i32
  %284 = load i16, ptr %18, align 2, !tbaa !23
  %285 = zext i16 %284 to i32
  %286 = icmp slt i32 %283, %285
  br i1 %286, label %288, label %287

287:                                              ; preds = %281
  store i32 17, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %21) #5
  br label %313

288:                                              ; preds = %281
  %289 = load ptr, ptr %19, align 8, !tbaa !5
  %290 = load ptr, ptr %15, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.otl_ChainingRule, ptr %290, i32 0, i32 5
  %292 = load ptr, ptr %291, align 8, !tbaa !35
  %293 = load i16, ptr %21, align 2, !tbaa !23
  %294 = zext i16 %293 to i64
  %295 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %292, i64 %294
  %296 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %295, i32 0, i32 0
  %297 = load i16, ptr %296, align 8, !tbaa !36
  %298 = zext i16 %297 to i32
  %299 = load ptr, ptr %15, align 8, !tbaa !5
  %300 = getelementptr inbounds %struct.otl_ChainingRule, ptr %299, i32 0, i32 5
  %301 = load ptr, ptr %300, align 8, !tbaa !35
  %302 = load i16, ptr %21, align 2, !tbaa !23
  %303 = zext i16 %302 to i64
  %304 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %301, i64 %303
  %305 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %304, i32 0, i32 1
  %306 = getelementptr inbounds %struct.otfcc_Handle, ptr %305, i32 0, i32 1
  %307 = load i16, ptr %306, align 4, !tbaa !38
  %308 = zext i16 %307 to i32
  %309 = call ptr (ptr, i32, ...) @bk_push(ptr noundef %289, i32 noundef 2, i32 noundef %298, i32 noundef 2, i32 noundef %308, i32 noundef 0)
  br label %310

310:                                              ; preds = %288
  %311 = load i16, ptr %21, align 2, !tbaa !23
  %312 = add i16 %311, 1
  store i16 %312, ptr %21, align 2, !tbaa !23
  br label %281, !llvm.loop !39

313:                                              ; preds = %287
  %314 = load ptr, ptr %13, align 8, !tbaa !5
  %315 = load ptr, ptr %19, align 8, !tbaa !5
  %316 = call ptr (ptr, i32, ...) @bk_push(ptr noundef %314, i32 noundef 16, ptr noundef %315, i32 noundef 0)
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 2, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 2, ptr %17) #5
  store i32 0, ptr %12, align 4
  br label %317

317:                                              ; preds = %313, %221
  call void @llvm.lifetime.end.p0(i64 2, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  %318 = load i32, ptr %12, align 4
  switch i32 %318, label %339 [
    i32 0, label %319
    i32 13, label %320
  ]

319:                                              ; preds = %317
  br label %320

320:                                              ; preds = %319, %317
  %321 = load i16, ptr %14, align 2, !tbaa !23
  %322 = add i16 %321, 1
  store i16 %322, ptr %14, align 2, !tbaa !23
  br label %183, !llvm.loop !40

323:                                              ; preds = %192
  %324 = load ptr, ptr %5, align 8, !tbaa !5
  %325 = load ptr, ptr %13, align 8, !tbaa !5
  %326 = call ptr (ptr, i32, ...) @bk_push(ptr noundef %324, i32 noundef 16, ptr noundef %325, i32 noundef 0)
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  br label %330

327:                                              ; preds = %168
  %328 = load ptr, ptr %5, align 8, !tbaa !5
  %329 = call ptr (ptr, i32, ...) @bk_push(ptr noundef %328, i32 noundef 16, ptr noundef null, i32 noundef 0)
  br label %330

330:                                              ; preds = %327, %323
  br label %331

331:                                              ; preds = %330
  %332 = load i16, ptr %11, align 2, !tbaa !23
  %333 = add i16 %332, 1
  store i16 %333, ptr %11, align 2, !tbaa !23
  br label %156, !llvm.loop !41

334:                                              ; preds = %167
  %335 = load ptr, ptr %4, align 8, !tbaa !5
  call void @free(ptr noundef %335) #5
  store ptr null, ptr %4, align 8, !tbaa !5
  %336 = load ptr, ptr %6, align 8, !tbaa !5
  call void @free(ptr noundef %336) #5
  store ptr null, ptr %6, align 8, !tbaa !5
  %337 = load ptr, ptr %5, align 8, !tbaa !5
  %338 = call ptr @bk_build_Block(ptr noundef %337)
  store i32 1, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #5
  ret ptr %338

339:                                              ; preds = %317
  unreachable
}

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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind "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 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 #5 = { 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 = !{!7, !7, i64 0}
!10 = !{!11, !12, i64 0}
!11 = !{!"", !12, i64 0, !13, i64 4, !12, i64 8, !6, i64 16, !6, i64 24}
!12 = !{!"short", !7, i64 0}
!13 = !{!"int", !7, i64 0}
!14 = !{!15, !12, i64 0}
!15 = !{!"", !12, i64 0, !13, i64 4, !6, i64 8}
!16 = !{!11, !6, i64 16}
!17 = !{!15, !6, i64 8}
!18 = !{!19, !6, i64 96}
!19 = !{!"__otfcc_ICoverage", !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, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120}
!20 = !{!21, !6, i64 104}
!21 = !{!"__otfcc_IClassDef", !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, !6, i64 96, !6, i64 104, !6, i64 112}
!22 = !{!11, !12, i64 8}
!23 = !{!12, !12, i64 0}
!24 = distinct !{!24, !25}
!25 = !{!"llvm.loop.mustprogress"}
!26 = !{!27, !12, i64 2}
!27 = !{!"", !12, i64 0, !12, i64 2, !12, i64 4, !6, i64 8, !12, i64 16, !6, i64 24}
!28 = !{!27, !6, i64 8}
!29 = !{!30, !12, i64 4}
!30 = !{!"otfcc_Handle", !13, i64 0, !12, i64 4, !6, i64 8}
!31 = distinct !{!31, !25}
!32 = !{!27, !12, i64 4}
!33 = !{!27, !12, i64 16}
!34 = distinct !{!34, !25}
!35 = !{!27, !6, i64 24}
!36 = !{!37, !12, i64 0}
!37 = !{!"", !12, i64 0, !30, i64 8}
!38 = !{!37, !12, i64 12}
!39 = distinct !{!39, !25}
!40 = distinct !{!40, !25}
!41 = distinct !{!41, !25}


; 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_ICoverage = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.__otfcc_IClassDef = type { ptr, ptr, ptr, 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 }

@otl_iCoverage = external local_unnamed_addr constant %struct.__otfcc_ICoverage, align 8
@otl_iClassDef = external local_unnamed_addr constant %struct.__otfcc_IClassDef, align 8

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

declare ptr @bk_new_Block(i32 noundef, ...) local_unnamed_addr #1

declare ptr @bk_push(ptr noundef, i32 noundef, ...) local_unnamed_addr #1

declare ptr @bk_newBlockFromBuffer(ptr noundef) local_unnamed_addr #1

declare ptr @bk_build_Block(ptr noundef) local_unnamed_addr #1

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

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

; Function Attrs: nounwind uwtable
define dso_local ptr @otfcc_build_contextual_classes(ptr nocapture noundef readonly %0) local_unnamed_addr #3 {
  %2 = tail call ptr @__caryll_allocate_clean(i64 noundef 16, i64 noundef 174)
  %3 = getelementptr inbounds i8, ptr %0, i64 32
  %4 = load ptr, ptr %3, align 8, !tbaa !5
  %5 = load i16, ptr %4, align 8, !tbaa !8
  store i16 %5, ptr %2, align 8, !tbaa !13
  %6 = load ptr, ptr %3, align 8, !tbaa !5
  %7 = getelementptr inbounds i8, ptr %6, i64 16
  %8 = load ptr, ptr %7, align 8, !tbaa !15
  %9 = getelementptr inbounds i8, ptr %2, i64 8
  store ptr %8, ptr %9, align 8, !tbaa !16
  %10 = load ptr, ptr getelementptr inbounds (i8, ptr @otl_iCoverage, i64 96), align 8, !tbaa !17
  %11 = tail call ptr %10(ptr noundef nonnull %2) #4
  %12 = tail call ptr @bk_newBlockFromBuffer(ptr noundef %11) #4
  %13 = load ptr, ptr getelementptr inbounds (i8, ptr @otl_iClassDef, i64 104), align 8, !tbaa !19
  %14 = load ptr, ptr %3, align 8, !tbaa !5
  %15 = tail call ptr %13(ptr noundef %14) #4
  %16 = tail call ptr @bk_newBlockFromBuffer(ptr noundef %15) #4
  %17 = load ptr, ptr %3, align 8, !tbaa !5
  %18 = getelementptr inbounds i8, ptr %17, i64 8
  %19 = load i16, ptr %18, align 8, !tbaa !21
  %20 = zext i16 %19 to i32
  %21 = add nuw nsw i32 %20, 1
  %22 = tail call ptr (i32, ...) @bk_new_Block(i32 noundef 2, i32 noundef 2, i32 noundef 16, ptr noundef %12, i32 noundef 16, ptr noundef %16, i32 noundef 2, i32 noundef %21, i32 noundef 0) #4
  %23 = load ptr, ptr %3, align 8, !tbaa !5
  %24 = getelementptr inbounds i8, ptr %23, i64 8
  %25 = load i16, ptr %24, align 8, !tbaa !21
  %26 = zext i16 %25 to i64
  %27 = shl nuw nsw i64 %26, 1
  %28 = add nuw nsw i64 %27, 2
  %29 = tail call ptr @__caryll_allocate_clean(i64 noundef %28, i64 noundef 186)
  br label %33

.preheader84:                                     ; preds = %33
  %30 = getelementptr inbounds i8, ptr %0, i64 8
  %31 = load i16, ptr %30, align 8, !tbaa !5
  %.not98 = icmp eq i16 %31, 0
  br i1 %.not98, label %.preheader83, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader84
  %32 = getelementptr inbounds i8, ptr %0, i64 16
  br label %41

33:                                               ; preds = %1, %33
  %.07385 = phi i16 [ 0, %1 ], [ %36, %33 ]
  %34 = zext i16 %.07385 to i64
  %35 = getelementptr inbounds i16, ptr %29, i64 %34
  store i16 0, ptr %35, align 2, !tbaa !22
  %36 = add i16 %.07385, 1
  %37 = load ptr, ptr %3, align 8, !tbaa !5
  %38 = getelementptr inbounds i8, ptr %37, i64 8
  %39 = load i16, ptr %38, align 8, !tbaa !21
  %.not = icmp ugt i16 %36, %39
  br i1 %.not, label %.preheader84, label %33, !llvm.loop !23

.preheader83:                                     ; preds = %65, %.preheader84
  %40 = getelementptr inbounds i8, ptr %0, i64 16
  br label %71

41:                                               ; preds = %.lr.ph, %65
  %42 = phi i16 [ %31, %.lr.ph ], [ %66, %65 ]
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %65 ]
  %43 = load ptr, ptr %32, align 8, !tbaa !5
  %44 = getelementptr inbounds ptr, ptr %43, i64 %indvars.iv
  %45 = load ptr, ptr %44, align 8, !tbaa !25
  %46 = getelementptr inbounds i8, ptr %45, i64 2
  %47 = load i16, ptr %46, align 2, !tbaa !26
  %48 = getelementptr inbounds i8, ptr %45, i64 8
  %49 = load ptr, ptr %48, align 8, !tbaa !28
  %50 = zext i16 %47 to i64
  %51 = getelementptr inbounds ptr, ptr %49, i64 %50
  %52 = load ptr, ptr %51, align 8, !tbaa !25
  %53 = getelementptr inbounds i8, ptr %52, i64 8
  %54 = load ptr, ptr %53, align 8, !tbaa !16
  %55 = getelementptr inbounds i8, ptr %54, i64 4
  %56 = load i16, ptr %55, align 4, !tbaa !29
  %57 = load ptr, ptr %3, align 8, !tbaa !5
  %58 = getelementptr inbounds i8, ptr %57, i64 8
  %59 = load i16, ptr %58, align 8, !tbaa !21
  %.not82 = icmp ugt i16 %56, %59
  br i1 %.not82, label %65, label %60

60:                                               ; preds = %41
  %61 = zext i16 %56 to i64
  %62 = getelementptr inbounds i16, ptr %29, i64 %61
  %63 = load i16, ptr %62, align 2, !tbaa !22
  %64 = add i16 %63, 1
  store i16 %64, ptr %62, align 2, !tbaa !22
  %.pre = load i16, ptr %30, align 8, !tbaa !5
  br label %65

65:                                               ; preds = %60, %41
  %66 = phi i16 [ %.pre, %60 ], [ %42, %41 ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %67 = zext i16 %66 to i64
  %68 = icmp ult i64 %indvars.iv.next, %67
  br i1 %68, label %41, label %.preheader83, !llvm.loop !31

69:                                               ; preds = %._crit_edge95
  tail call void @free(ptr noundef %2) #4
  tail call void @free(ptr noundef %29) #4
  %70 = tail call ptr @bk_build_Block(ptr noundef %22) #4
  ret ptr %70

71:                                               ; preds = %.preheader83, %._crit_edge95
  %.07596 = phi i16 [ 0, %.preheader83 ], [ %138, %._crit_edge95 ]
  %72 = zext i16 %.07596 to i64
  %73 = getelementptr inbounds i16, ptr %29, i64 %72
  %74 = load i16, ptr %73, align 2, !tbaa !22
  %.not80 = icmp eq i16 %74, 0
  br i1 %.not80, label %._crit_edge95, label %75

75:                                               ; preds = %71
  %76 = zext i16 %74 to i32
  %77 = tail call ptr (i32, ...) @bk_new_Block(i32 noundef 2, i32 noundef %76, i32 noundef 0) #4
  %78 = load i16, ptr %30, align 8, !tbaa !5
  %.not99 = icmp eq i16 %78, 0
  br i1 %.not99, label %._crit_edge95, label %.lr.ph94

.lr.ph94:                                         ; preds = %75, %133
  %79 = phi i16 [ %134, %133 ], [ %78, %75 ]
  %indvars.iv108 = phi i64 [ %indvars.iv.next109, %133 ], [ 0, %75 ]
  %80 = load ptr, ptr %40, align 8, !tbaa !5
  %81 = getelementptr inbounds ptr, ptr %80, i64 %indvars.iv108
  %82 = load ptr, ptr %81, align 8, !tbaa !25
  %83 = getelementptr inbounds i8, ptr %82, i64 8
  %84 = load ptr, ptr %83, align 8, !tbaa !28
  %85 = getelementptr inbounds i8, ptr %82, i64 2
  %86 = load i16, ptr %85, align 2, !tbaa !26
  %87 = zext i16 %86 to i64
  %88 = getelementptr inbounds ptr, ptr %84, i64 %87
  %89 = load ptr, ptr %88, align 8, !tbaa !25
  %90 = getelementptr inbounds i8, ptr %89, i64 8
  %91 = load ptr, ptr %90, align 8, !tbaa !16
  %92 = getelementptr inbounds i8, ptr %91, i64 4
  %93 = load i16, ptr %92, align 4, !tbaa !29
  %.not81 = icmp eq i16 %93, %.07596
  br i1 %.not81, label %94, label %133

94:                                               ; preds = %.lr.ph94
  tail call void @reverseBacktracks(ptr noundef nonnull %82)
  %95 = getelementptr inbounds i8, ptr %82, i64 4
  %96 = load i16, ptr %95, align 4, !tbaa !32
  %97 = load i16, ptr %85, align 2, !tbaa !26
  %98 = sub i16 %96, %97
  %99 = getelementptr inbounds i8, ptr %82, i64 16
  %100 = load i16, ptr %99, align 8, !tbaa !33
  %101 = tail call ptr (i32, ...) @bk_new_Block(i32 noundef 0) #4
  %102 = zext i16 %98 to i32
  %103 = tail call ptr (ptr, i32, ...) @bk_push(ptr noundef %101, i32 noundef 2, i32 noundef %102, i32 noundef 0) #4
  %104 = zext i16 %100 to i32
  %105 = tail call ptr (ptr, i32, ...) @bk_push(ptr noundef %101, i32 noundef 2, i32 noundef %104, i32 noundef 0) #4
  %106 = load i16, ptr %85, align 2, !tbaa !26
  %.07287 = add i16 %106, 1
  %107 = load i16, ptr %95, align 4, !tbaa !32
  %108 = icmp ult i16 %.07287, %107
  br i1 %108, label %.lr.ph89.preheader, label %.preheader

.lr.ph89.preheader:                               ; preds = %94
  %109 = zext i16 %.07287 to i64
  br label %.lr.ph89

.preheader:                                       ; preds = %.lr.ph89, %94
  %.not100 = icmp eq i16 %100, 0
  br i1 %.not100, label %._crit_edge, label %.lr.ph91

.lr.ph91:                                         ; preds = %.preheader
  %110 = getelementptr inbounds i8, ptr %82, i64 24
  %wide.trip.count = zext i16 %100 to i64
  br label %124

.lr.ph89:                                         ; preds = %.lr.ph89.preheader, %.lr.ph89
  %indvars.iv102 = phi i64 [ %109, %.lr.ph89.preheader ], [ %indvars.iv.next103, %.lr.ph89 ]
  %111 = load ptr, ptr %83, align 8, !tbaa !28
  %112 = getelementptr inbounds ptr, ptr %111, i64 %indvars.iv102
  %113 = load ptr, ptr %112, align 8, !tbaa !25
  %114 = getelementptr inbounds i8, ptr %113, i64 8
  %115 = load ptr, ptr %114, align 8, !tbaa !16
  %116 = getelementptr inbounds i8, ptr %115, i64 4
  %117 = load i16, ptr %116, align 4, !tbaa !29
  %118 = zext i16 %117 to i32
  %119 = tail call ptr (ptr, i32, ...) @bk_push(ptr noundef %101, i32 noundef 2, i32 noundef %118, i32 noundef 0) #4
  %indvars.iv.next103 = add nuw nsw i64 %indvars.iv102, 1
  %120 = load i16, ptr %95, align 4, !tbaa !32
  %121 = zext i16 %120 to i64
  %122 = icmp ult i64 %indvars.iv.next103, %121
  br i1 %122, label %.lr.ph89, label %.preheader, !llvm.loop !34

._crit_edge:                                      ; preds = %124, %.preheader
  %123 = tail call ptr (ptr, i32, ...) @bk_push(ptr noundef %77, i32 noundef 16, ptr noundef %101, i32 noundef 0) #4
  %.pre111 = load i16, ptr %30, align 8, !tbaa !5
  br label %133

124:                                              ; preds = %.lr.ph91, %124
  %indvars.iv105 = phi i64 [ 0, %.lr.ph91 ], [ %indvars.iv.next106, %124 ]
  %125 = load ptr, ptr %110, align 8, !tbaa !35
  %126 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %125, i64 %indvars.iv105
  %127 = load i16, ptr %126, align 8, !tbaa !36
  %128 = zext i16 %127 to i32
  %129 = getelementptr inbounds i8, ptr %126, i64 12
  %130 = load i16, ptr %129, align 4, !tbaa !38
  %131 = zext i16 %130 to i32
  %132 = tail call ptr (ptr, i32, ...) @bk_push(ptr noundef %101, i32 noundef 2, i32 noundef %128, i32 noundef 2, i32 noundef %131, i32 noundef 0) #4
  %indvars.iv.next106 = add nuw nsw i64 %indvars.iv105, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next106, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %124, !llvm.loop !39

133:                                              ; preds = %.lr.ph94, %._crit_edge
  %134 = phi i16 [ %79, %.lr.ph94 ], [ %.pre111, %._crit_edge ]
  %indvars.iv.next109 = add nuw nsw i64 %indvars.iv108, 1
  %135 = zext i16 %134 to i64
  %136 = icmp ult i64 %indvars.iv.next109, %135
  br i1 %136, label %.lr.ph94, label %._crit_edge95, !llvm.loop !40

._crit_edge95:                                    ; preds = %133, %71, %75
  %.sink = phi ptr [ %77, %75 ], [ null, %71 ], [ %77, %133 ]
  %137 = tail call ptr (ptr, i32, ...) @bk_push(ptr noundef %22, i32 noundef 16, ptr noundef %.sink, i32 noundef 0) #4
  %138 = add i16 %.07596, 1
  %139 = load ptr, ptr %3, align 8, !tbaa !5
  %140 = getelementptr inbounds i8, ptr %139, i64 8
  %141 = load i16, ptr %140, align 8, !tbaa !21
  %.not79 = icmp ugt i16 %138, %141
  br i1 %.not79, label %69, label %71, !llvm.loop !41
}

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 = { "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 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #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 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C/C++ TBAA"}
!8 = !{!9, !10, i64 0}
!9 = !{!"", !10, i64 0, !11, i64 4, !10, i64 8, !12, i64 16, !12, i64 24}
!10 = !{!"short", !6, i64 0}
!11 = !{!"int", !6, i64 0}
!12 = !{!"any pointer", !6, i64 0}
!13 = !{!14, !10, i64 0}
!14 = !{!"", !10, i64 0, !11, i64 4, !12, i64 8}
!15 = !{!9, !12, i64 16}
!16 = !{!14, !12, i64 8}
!17 = !{!18, !12, i64 96}
!18 = !{!"__otfcc_ICoverage", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48, !12, i64 56, !12, i64 64, !12, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !12, i64 104, !12, i64 112, !12, i64 120}
!19 = !{!20, !12, i64 104}
!20 = !{!"__otfcc_IClassDef", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48, !12, i64 56, !12, i64 64, !12, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !12, i64 104, !12, i64 112}
!21 = !{!9, !10, i64 8}
!22 = !{!10, !10, i64 0}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = !{!12, !12, i64 0}
!26 = !{!27, !10, i64 2}
!27 = !{!"", !10, i64 0, !10, i64 2, !10, i64 4, !12, i64 8, !10, i64 16, !12, i64 24}
!28 = !{!27, !12, i64 8}
!29 = !{!30, !10, i64 4}
!30 = !{!"otfcc_Handle", !11, i64 0, !10, i64 4, !12, i64 8}
!31 = distinct !{!31, !24}
!32 = !{!27, !10, i64 4}
!33 = !{!27, !10, i64 16}
!34 = distinct !{!34, !24}
!35 = !{!27, !12, i64 24}
!36 = !{!37, !10, i64 0}
!37 = !{!"", !10, i64 0, !30, i64 8}
!38 = !{!37, !10, i64 12}
!39 = distinct !{!39, !24}
!40 = distinct !{!40, !24}
!41 = distinct !{!41, !24}


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