; LLVM IR from caryll/otfcc :: lib/consolidate/otl (chaining)

; 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_HandlePackage = type { 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.otfcc_Options = type { i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, ptr, ptr }
%struct.otfcc_ILogger = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.otl_ChainingRule = type { i16, i16, i16, ptr, i16, ptr }
%struct.otl_Coverage = type { i16, i32, ptr }
%struct.otl_ChainLookupApplication = type { i16, %struct.otfcc_Handle }
%struct.otfcc_Handle = type { i32, i16, ptr }
%struct.table_OTL = type { %struct.otl_LookupList, %struct.otl_FeatureList, %struct.otl_LangSystemList }
%struct.otl_LookupList = type { i64, i64, ptr }
%struct.otl_FeatureList = type { i64, i64, ptr }
%struct.otl_LangSystemList = type { i64, i64, ptr }
%struct._otl_lookup = type { ptr, i32, i32, i16, %struct.otl_SubtableList }
%struct.otl_SubtableList = type { i64, i64, ptr }

@.str = external hidden unnamed_addr constant [56 x i8], align 1
@otl_iCoverage = external constant %struct.__otfcc_ICoverage, align 8
@otfcc_iHandle = external constant %struct.otfcc_HandlePackage, align 8
@.str.1 = external hidden unnamed_addr constant [80 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [45 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local zeroext i1 @consolidate_chaining(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3) #0 {
  %5 = alloca i1, align 1
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca ptr, align 8
  %13 = alloca i8, align 1
  %14 = alloca i16, align 2
  %15 = alloca i16, align 2
  %16 = alloca i8, align 1
  %17 = alloca ptr, align 8
  %18 = alloca i16, align 2
  %19 = alloca i16, align 2
  %20 = alloca i16, align 2
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store ptr %3, ptr %9, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  %21 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %21, ptr %10, align 8, !tbaa !5
  %22 = load ptr, ptr %10, align 8, !tbaa !5
  %23 = getelementptr inbounds %struct.subtable_chaining, ptr %22, i32 0, i32 0
  %24 = load i32, ptr %23, align 8, !tbaa !9
  %25 = icmp ne i32 %24, 0
  br i1 %25, label %26, label %37

26:                                               ; preds = %4
  %27 = load ptr, ptr %9, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.otfcc_Options, ptr %27, i32 0, i32 24
  %29 = load ptr, ptr %28, align 8, !tbaa !12
  %30 = getelementptr inbounds %struct.otfcc_ILogger, ptr %29, i32 0, i32 6
  %31 = load ptr, ptr %30, align 8, !tbaa !15
  %32 = load ptr, ptr %9, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.otfcc_Options, ptr %32, i32 0, i32 24
  %34 = load ptr, ptr %33, align 8, !tbaa !12
  %35 = call ptr @sdsempty()
  %36 = call ptr (ptr, ptr, ...) @sdscatprintf(ptr noundef %35, ptr noundef @.str)
  call void %31(ptr noundef %34, i8 noundef zeroext 1, i32 noundef 1, ptr noundef %36)
  store i1 false, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %370

37:                                               ; preds = %4
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #5
  %38 = load ptr, ptr %10, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.subtable_chaining, ptr %38, i32 0, i32 1
  store ptr %39, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %13) #5
  store i8 1, ptr %13, align 1, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 2, ptr %14) #5
  store i16 0, ptr %14, align 2, !tbaa !18
  br label %40

40:                                               ; preds = %84, %37
  %41 = load i16, ptr %14, align 2, !tbaa !18
  %42 = zext i16 %41 to i32
  %43 = load ptr, ptr %12, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.otl_ChainingRule, ptr %43, i32 0, i32 0
  %45 = load i16, ptr %44, align 8, !tbaa !20
  %46 = zext i16 %45 to i32
  %47 = icmp slt i32 %42, %46
  br i1 %47, label %49, label %48

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

49:                                               ; preds = %40
  %50 = load ptr, ptr %6, align 8, !tbaa !5
  %51 = load ptr, ptr %12, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.otl_ChainingRule, ptr %51, i32 0, i32 3
  %53 = load ptr, ptr %52, align 8, !tbaa !22
  %54 = load i16, ptr %14, align 2, !tbaa !18
  %55 = zext i16 %54 to i64
  %56 = getelementptr inbounds ptr, ptr %53, i64 %55
  %57 = load ptr, ptr %56, align 8, !tbaa !5
  %58 = load ptr, ptr %9, align 8, !tbaa !5
  call void @fontop_consolidateCoverage(ptr noundef %50, ptr noundef %57, ptr noundef %58)
  %59 = load ptr, ptr getelementptr inbounds (%struct.__otfcc_ICoverage, ptr @otl_iCoverage, i32 0, i32 14), align 8, !tbaa !23
  %60 = load ptr, ptr %12, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.otl_ChainingRule, ptr %60, i32 0, i32 3
  %62 = load ptr, ptr %61, align 8, !tbaa !22
  %63 = load i16, ptr %14, align 2, !tbaa !18
  %64 = zext i16 %63 to i64
  %65 = getelementptr inbounds ptr, ptr %62, i64 %64
  %66 = load ptr, ptr %65, align 8, !tbaa !5
  call void %59(ptr noundef %66, i1 noundef zeroext true)
  %67 = load i8, ptr %13, align 1, !tbaa !17, !range !25, !noundef !26
  %68 = trunc i8 %67 to i1
  br i1 %68, label %69, label %81

69:                                               ; preds = %49
  %70 = load ptr, ptr %12, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.otl_ChainingRule, ptr %70, i32 0, i32 3
  %72 = load ptr, ptr %71, align 8, !tbaa !22
  %73 = load i16, ptr %14, align 2, !tbaa !18
  %74 = zext i16 %73 to i64
  %75 = getelementptr inbounds ptr, ptr %72, i64 %74
  %76 = load ptr, ptr %75, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct.otl_Coverage, ptr %76, i32 0, i32 0
  %78 = load i16, ptr %77, align 8, !tbaa !27
  %79 = zext i16 %78 to i32
  %80 = icmp sgt i32 %79, 0
  br label %81

81:                                               ; preds = %69, %49
  %82 = phi i1 [ false, %49 ], [ %80, %69 ]
  %83 = zext i1 %82 to i8
  store i8 %83, ptr %13, align 1, !tbaa !17
  br label %84

84:                                               ; preds = %81
  %85 = load i16, ptr %14, align 2, !tbaa !18
  %86 = add i16 %85, 1
  store i16 %86, ptr %14, align 2, !tbaa !18
  br label %40, !llvm.loop !29

87:                                               ; preds = %48
  %88 = load ptr, ptr %12, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.otl_ChainingRule, ptr %88, i32 0, i32 1
  %90 = load i16, ptr %89, align 2, !tbaa !31
  %91 = zext i16 %90 to i32
  %92 = load ptr, ptr %12, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.otl_ChainingRule, ptr %92, i32 0, i32 0
  %94 = load i16, ptr %93, align 8, !tbaa !20
  %95 = zext i16 %94 to i32
  %96 = icmp sgt i32 %91, %95
  br i1 %96, label %97, label %103

97:                                               ; preds = %87
  %98 = load ptr, ptr %12, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.otl_ChainingRule, ptr %98, i32 0, i32 0
  %100 = load i16, ptr %99, align 8, !tbaa !20
  %101 = load ptr, ptr %12, align 8, !tbaa !5
  %102 = getelementptr inbounds %struct.otl_ChainingRule, ptr %101, i32 0, i32 1
  store i16 %100, ptr %102, align 2, !tbaa !31
  br label %103

103:                                              ; preds = %97, %87
  %104 = load ptr, ptr %12, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.otl_ChainingRule, ptr %104, i32 0, i32 2
  %106 = load i16, ptr %105, align 4, !tbaa !32
  %107 = zext i16 %106 to i32
  %108 = load ptr, ptr %12, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.otl_ChainingRule, ptr %108, i32 0, i32 0
  %110 = load i16, ptr %109, align 8, !tbaa !20
  %111 = zext i16 %110 to i32
  %112 = icmp sgt i32 %107, %111
  br i1 %112, label %113, label %119

113:                                              ; preds = %103
  %114 = load ptr, ptr %12, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.otl_ChainingRule, ptr %114, i32 0, i32 0
  %116 = load i16, ptr %115, align 8, !tbaa !20
  %117 = load ptr, ptr %12, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct.otl_ChainingRule, ptr %117, i32 0, i32 2
  store i16 %116, ptr %118, align 4, !tbaa !32
  br label %119

119:                                              ; preds = %113, %103
  call void @llvm.lifetime.start.p0(i64 2, ptr %15) #5
  store i16 0, ptr %15, align 2, !tbaa !18
  br label %120

120:                                              ; preds = %305, %119
  %121 = load i16, ptr %15, align 2, !tbaa !18
  %122 = zext i16 %121 to i32
  %123 = load ptr, ptr %12, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct.otl_ChainingRule, ptr %123, i32 0, i32 4
  %125 = load i16, ptr %124, align 8, !tbaa !33
  %126 = zext i16 %125 to i32
  %127 = icmp slt i32 %122, %126
  br i1 %127, label %129, label %128

128:                                              ; preds = %120
  store i32 5, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %15) #5
  br label %308

129:                                              ; preds = %120
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #5
  store i8 0, ptr %16, align 1, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #5
  %130 = load ptr, ptr %12, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.otl_ChainingRule, ptr %130, i32 0, i32 5
  %132 = load ptr, ptr %131, align 8, !tbaa !34
  %133 = load i16, ptr %15, align 2, !tbaa !18
  %134 = zext i16 %133 to i64
  %135 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %132, i64 %134
  %136 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %135, i32 0, i32 1
  store ptr %136, ptr %17, align 8, !tbaa !5
  %137 = load ptr, ptr %17, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.otfcc_Handle, ptr %137, i32 0, i32 2
  %139 = load ptr, ptr %138, align 8, !tbaa !35
  %140 = icmp ne ptr %139, null
  br i1 %140, label %141, label %253

141:                                              ; preds = %129
  call void @llvm.lifetime.start.p0(i64 2, ptr %18) #5
  store i16 0, ptr %18, align 2, !tbaa !18
  br label %142

142:                                              ; preds = %207, %141
  %143 = load i16, ptr %18, align 2, !tbaa !18
  %144 = zext i16 %143 to i64
  %145 = load ptr, ptr %7, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.table_OTL, ptr %145, i32 0, i32 0
  %147 = getelementptr inbounds %struct.otl_LookupList, ptr %146, i32 0, i32 0
  %148 = load i64, ptr %147, align 8, !tbaa !37
  %149 = icmp ult i64 %144, %148
  br i1 %149, label %151, label %150

150:                                              ; preds = %142
  store i32 8, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %18) #5
  br label %210

151:                                              ; preds = %142
  %152 = load ptr, ptr %7, align 8, !tbaa !5
  %153 = getelementptr inbounds %struct.table_OTL, ptr %152, i32 0, i32 0
  %154 = getelementptr inbounds %struct.otl_LookupList, ptr %153, i32 0, i32 2
  %155 = load ptr, ptr %154, align 8, !tbaa !41
  %156 = load i16, ptr %18, align 2, !tbaa !18
  %157 = zext i16 %156 to i64
  %158 = getelementptr inbounds ptr, ptr %155, i64 %157
  %159 = load ptr, ptr %158, align 8, !tbaa !5
  %160 = icmp ne ptr %159, null
  br i1 %160, label %162, label %161

161:                                              ; preds = %151
  br label %207

162:                                              ; preds = %151
  %163 = load ptr, ptr %7, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.table_OTL, ptr %163, i32 0, i32 0
  %165 = getelementptr inbounds %struct.otl_LookupList, ptr %164, i32 0, i32 2
  %166 = load ptr, ptr %165, align 8, !tbaa !41
  %167 = load i16, ptr %18, align 2, !tbaa !18
  %168 = zext i16 %167 to i64
  %169 = getelementptr inbounds ptr, ptr %166, i64 %168
  %170 = load ptr, ptr %169, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct._otl_lookup, ptr %170, i32 0, i32 4
  %172 = getelementptr inbounds %struct.otl_SubtableList, ptr %171, i32 0, i32 0
  %173 = load i64, ptr %172, align 8, !tbaa !42
  %174 = icmp ne i64 %173, 0
  br i1 %174, label %176, label %175

175:                                              ; preds = %162
  br label %207

176:                                              ; preds = %162
  %177 = load ptr, ptr %7, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.table_OTL, ptr %177, i32 0, i32 0
  %179 = getelementptr inbounds %struct.otl_LookupList, ptr %178, i32 0, i32 2
  %180 = load ptr, ptr %179, align 8, !tbaa !41
  %181 = load i16, ptr %18, align 2, !tbaa !18
  %182 = zext i16 %181 to i64
  %183 = getelementptr inbounds ptr, ptr %180, i64 %182
  %184 = load ptr, ptr %183, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct._otl_lookup, ptr %184, i32 0, i32 0
  %186 = load ptr, ptr %185, align 8, !tbaa !44
  %187 = load ptr, ptr %17, align 8, !tbaa !5
  %188 = getelementptr inbounds %struct.otfcc_Handle, ptr %187, i32 0, i32 2
  %189 = load ptr, ptr %188, align 8, !tbaa !35
  %190 = call i32 @strcmp(ptr noundef %186, ptr noundef %189) #6
  %191 = icmp ne i32 %190, 0
  br i1 %191, label %192, label %193

192:                                              ; preds = %176
  br label %207

193:                                              ; preds = %176
  store i8 1, ptr %16, align 1, !tbaa !17
  %194 = load ptr, ptr getelementptr inbounds (%struct.otfcc_HandlePackage, ptr @otfcc_iHandle, i32 0, i32 11), align 8, !tbaa !45
  %195 = load ptr, ptr %17, align 8, !tbaa !5
  %196 = load i16, ptr %18, align 2, !tbaa !18
  %197 = load ptr, ptr %7, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct.table_OTL, ptr %197, i32 0, i32 0
  %199 = getelementptr inbounds %struct.otl_LookupList, ptr %198, i32 0, i32 2
  %200 = load ptr, ptr %199, align 8, !tbaa !41
  %201 = load i16, ptr %18, align 2, !tbaa !18
  %202 = zext i16 %201 to i64
  %203 = getelementptr inbounds ptr, ptr %200, i64 %202
  %204 = load ptr, ptr %203, align 8, !tbaa !5
  %205 = getelementptr inbounds %struct._otl_lookup, ptr %204, i32 0, i32 0
  %206 = load ptr, ptr %205, align 8, !tbaa !44
  call void %194(ptr noundef %195, i16 noundef zeroext %196, ptr noundef %206)
  br label %207

207:                                              ; preds = %193, %192, %175, %161
  %208 = load i16, ptr %18, align 2, !tbaa !18
  %209 = add i16 %208, 1
  store i16 %209, ptr %18, align 2, !tbaa !18
  br label %142, !llvm.loop !47

210:                                              ; preds = %150
  %211 = load i8, ptr %16, align 1, !tbaa !17, !range !25, !noundef !26
  %212 = trunc i8 %211 to i1
  br i1 %212, label %252, label %213

213:                                              ; preds = %210
  %214 = load ptr, ptr %12, align 8, !tbaa !5
  %215 = getelementptr inbounds %struct.otl_ChainingRule, ptr %214, i32 0, i32 5
  %216 = load ptr, ptr %215, align 8, !tbaa !34
  %217 = load i16, ptr %15, align 2, !tbaa !18
  %218 = zext i16 %217 to i64
  %219 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %216, i64 %218
  %220 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %219, i32 0, i32 1
  %221 = getelementptr inbounds %struct.otfcc_Handle, ptr %220, i32 0, i32 2
  %222 = load ptr, ptr %221, align 8, !tbaa !48
  %223 = icmp ne ptr %222, null
  br i1 %223, label %224, label %252

224:                                              ; preds = %213
  %225 = load ptr, ptr %9, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.otfcc_Options, ptr %225, i32 0, i32 24
  %227 = load ptr, ptr %226, align 8, !tbaa !12
  %228 = getelementptr inbounds %struct.otfcc_ILogger, ptr %227, i32 0, i32 6
  %229 = load ptr, ptr %228, align 8, !tbaa !15
  %230 = load ptr, ptr %9, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.otfcc_Options, ptr %230, i32 0, i32 24
  %232 = load ptr, ptr %231, align 8, !tbaa !12
  %233 = call ptr @sdsempty()
  %234 = load ptr, ptr %12, align 8, !tbaa !5
  %235 = getelementptr inbounds %struct.otl_ChainingRule, ptr %234, i32 0, i32 5
  %236 = load ptr, ptr %235, align 8, !tbaa !34
  %237 = load i16, ptr %15, align 2, !tbaa !18
  %238 = zext i16 %237 to i64
  %239 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %236, i64 %238
  %240 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %239, i32 0, i32 1
  %241 = getelementptr inbounds %struct.otfcc_Handle, ptr %240, i32 0, i32 2
  %242 = load ptr, ptr %241, align 8, !tbaa !48
  %243 = call ptr (ptr, ptr, ...) @sdscatprintf(ptr noundef %233, ptr noundef @.str.1, ptr noundef %242)
  call void %229(ptr noundef %232, i8 noundef zeroext 1, i32 noundef 1, ptr noundef %243)
  %244 = load ptr, ptr getelementptr inbounds (%struct.otfcc_HandlePackage, ptr @otfcc_iHandle, i32 0, i32 3), align 8, !tbaa !50
  %245 = load ptr, ptr %12, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.otl_ChainingRule, ptr %245, i32 0, i32 5
  %247 = load ptr, ptr %246, align 8, !tbaa !34
  %248 = load i16, ptr %15, align 2, !tbaa !18
  %249 = zext i16 %248 to i64
  %250 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %247, i64 %249
  %251 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %250, i32 0, i32 1
  call void %244(ptr noundef %251)
  br label %252

252:                                              ; preds = %224, %213, %210
  br label %304

253:                                              ; preds = %129
  %254 = load ptr, ptr %17, align 8, !tbaa !5
  %255 = getelementptr inbounds %struct.otfcc_Handle, ptr %254, i32 0, i32 0
  %256 = load i32, ptr %255, align 8, !tbaa !51
  %257 = icmp eq i32 %256, 1
  br i1 %257, label %258, label %303

258:                                              ; preds = %253
  %259 = load ptr, ptr %17, align 8, !tbaa !5
  %260 = getelementptr inbounds %struct.otfcc_Handle, ptr %259, i32 0, i32 1
  %261 = load i16, ptr %260, align 4, !tbaa !52
  %262 = zext i16 %261 to i64
  %263 = load ptr, ptr %7, align 8, !tbaa !5
  %264 = getelementptr inbounds %struct.table_OTL, ptr %263, i32 0, i32 0
  %265 = getelementptr inbounds %struct.otl_LookupList, ptr %264, i32 0, i32 0
  %266 = load i64, ptr %265, align 8, !tbaa !37
  %267 = icmp uge i64 %262, %266
  br i1 %267, label %268, label %285

268:                                              ; preds = %258
  %269 = load ptr, ptr %9, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.otfcc_Options, ptr %269, i32 0, i32 24
  %271 = load ptr, ptr %270, align 8, !tbaa !12
  %272 = getelementptr inbounds %struct.otfcc_ILogger, ptr %271, i32 0, i32 6
  %273 = load ptr, ptr %272, align 8, !tbaa !15
  %274 = load ptr, ptr %9, align 8, !tbaa !5
  %275 = getelementptr inbounds %struct.otfcc_Options, ptr %274, i32 0, i32 24
  %276 = load ptr, ptr %275, align 8, !tbaa !12
  %277 = call ptr @sdsempty()
  %278 = load ptr, ptr %17, align 8, !tbaa !5
  %279 = getelementptr inbounds %struct.otfcc_Handle, ptr %278, i32 0, i32 1
  %280 = load i16, ptr %279, align 4, !tbaa !52
  %281 = zext i16 %280 to i32
  %282 = call ptr (ptr, ptr, ...) @sdscatprintf(ptr noundef %277, ptr noundef @.str.2, i32 noundef %281)
  call void %273(ptr noundef %276, i8 noundef zeroext 1, i32 noundef 1, ptr noundef %282)
  %283 = load ptr, ptr %17, align 8, !tbaa !5
  %284 = getelementptr inbounds %struct.otfcc_Handle, ptr %283, i32 0, i32 1
  store i16 0, ptr %284, align 4, !tbaa !52
  br label %285

285:                                              ; preds = %268, %258
  %286 = load ptr, ptr getelementptr inbounds (%struct.otfcc_HandlePackage, ptr @otfcc_iHandle, i32 0, i32 11), align 8, !tbaa !45
  %287 = load ptr, ptr %17, align 8, !tbaa !5
  %288 = load ptr, ptr %17, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct.otfcc_Handle, ptr %288, i32 0, i32 1
  %290 = load i16, ptr %289, align 4, !tbaa !52
  %291 = load ptr, ptr %7, align 8, !tbaa !5
  %292 = getelementptr inbounds %struct.table_OTL, ptr %291, i32 0, i32 0
  %293 = getelementptr inbounds %struct.otl_LookupList, ptr %292, i32 0, i32 2
  %294 = load ptr, ptr %293, align 8, !tbaa !41
  %295 = load ptr, ptr %17, align 8, !tbaa !5
  %296 = getelementptr inbounds %struct.otfcc_Handle, ptr %295, i32 0, i32 1
  %297 = load i16, ptr %296, align 4, !tbaa !52
  %298 = zext i16 %297 to i64
  %299 = getelementptr inbounds ptr, ptr %294, i64 %298
  %300 = load ptr, ptr %299, align 8, !tbaa !5
  %301 = getelementptr inbounds %struct._otl_lookup, ptr %300, i32 0, i32 0
  %302 = load ptr, ptr %301, align 8, !tbaa !44
  call void %286(ptr noundef %287, i16 noundef zeroext %290, ptr noundef %302)
  br label %303

303:                                              ; preds = %285, %253
  br label %304

304:                                              ; preds = %303, %252
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #5
  br label %305

305:                                              ; preds = %304
  %306 = load i16, ptr %15, align 2, !tbaa !18
  %307 = add i16 %306, 1
  store i16 %307, ptr %15, align 2, !tbaa !18
  br label %120, !llvm.loop !53

308:                                              ; preds = %128
  %309 = load ptr, ptr %12, align 8, !tbaa !5
  %310 = getelementptr inbounds %struct.otl_ChainingRule, ptr %309, i32 0, i32 4
  %311 = load i16, ptr %310, align 8, !tbaa !33
  %312 = icmp ne i16 %311, 0
  br i1 %312, label %313, label %365

313:                                              ; preds = %308
  call void @llvm.lifetime.start.p0(i64 2, ptr %19) #5
  store i16 0, ptr %19, align 2, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 2, ptr %20) #5
  store i16 0, ptr %20, align 2, !tbaa !18
  br label %314

314:                                              ; preds = %349, %313
  %315 = load i16, ptr %20, align 2, !tbaa !18
  %316 = zext i16 %315 to i32
  %317 = load ptr, ptr %12, align 8, !tbaa !5
  %318 = getelementptr inbounds %struct.otl_ChainingRule, ptr %317, i32 0, i32 4
  %319 = load i16, ptr %318, align 8, !tbaa !33
  %320 = zext i16 %319 to i32
  %321 = icmp slt i32 %316, %320
  br i1 %321, label %323, label %322

322:                                              ; preds = %314
  store i32 11, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %20) #5
  br label %352

323:                                              ; preds = %314
  %324 = load ptr, ptr %12, align 8, !tbaa !5
  %325 = getelementptr inbounds %struct.otl_ChainingRule, ptr %324, i32 0, i32 5
  %326 = load ptr, ptr %325, align 8, !tbaa !34
  %327 = load i16, ptr %20, align 2, !tbaa !18
  %328 = zext i16 %327 to i64
  %329 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %326, i64 %328
  %330 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %329, i32 0, i32 1
  %331 = getelementptr inbounds %struct.otfcc_Handle, ptr %330, i32 0, i32 2
  %332 = load ptr, ptr %331, align 8, !tbaa !48
  %333 = icmp ne ptr %332, null
  br i1 %333, label %334, label %348

334:                                              ; preds = %323
  %335 = load ptr, ptr %12, align 8, !tbaa !5
  %336 = getelementptr inbounds %struct.otl_ChainingRule, ptr %335, i32 0, i32 5
  %337 = load ptr, ptr %336, align 8, !tbaa !34
  %338 = load i16, ptr %19, align 2, !tbaa !18
  %339 = add i16 %338, 1
  store i16 %339, ptr %19, align 2, !tbaa !18
  %340 = zext i16 %338 to i64
  %341 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %337, i64 %340
  %342 = load ptr, ptr %12, align 8, !tbaa !5
  %343 = getelementptr inbounds %struct.otl_ChainingRule, ptr %342, i32 0, i32 5
  %344 = load ptr, ptr %343, align 8, !tbaa !34
  %345 = load i16, ptr %20, align 2, !tbaa !18
  %346 = zext i16 %345 to i64
  %347 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %344, i64 %346
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %341, ptr align 8 %347, i64 24, i1 false), !tbaa.struct !54
  br label %348

348:                                              ; preds = %334, %323
  br label %349

349:                                              ; preds = %348
  %350 = load i16, ptr %20, align 2, !tbaa !18
  %351 = add i16 %350, 1
  store i16 %351, ptr %20, align 2, !tbaa !18
  br label %314, !llvm.loop !56

352:                                              ; preds = %322
  %353 = load i16, ptr %19, align 2, !tbaa !18
  %354 = load ptr, ptr %12, align 8, !tbaa !5
  %355 = getelementptr inbounds %struct.otl_ChainingRule, ptr %354, i32 0, i32 4
  store i16 %353, ptr %355, align 8, !tbaa !33
  %356 = load ptr, ptr %12, align 8, !tbaa !5
  %357 = getelementptr inbounds %struct.otl_ChainingRule, ptr %356, i32 0, i32 4
  %358 = load i16, ptr %357, align 8, !tbaa !33
  %359 = icmp ne i16 %358, 0
  br i1 %359, label %361, label %360

360:                                              ; preds = %352
  store i1 true, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %362

361:                                              ; preds = %352
  store i32 0, ptr %11, align 4
  br label %362

362:                                              ; preds = %361, %360
  call void @llvm.lifetime.end.p0(i64 2, ptr %19) #5
  %363 = load i32, ptr %11, align 4
  switch i32 %363, label %369 [
    i32 0, label %364
  ]

364:                                              ; preds = %362
  br label %365

365:                                              ; preds = %364, %308
  %366 = load i8, ptr %13, align 1, !tbaa !17, !range !25, !noundef !26
  %367 = trunc i8 %366 to i1
  %368 = xor i1 %367, true
  store i1 %368, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %369

369:                                              ; preds = %365, %362
  call void @llvm.lifetime.end.p0(i64 1, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #5
  br label %370

370:                                              ; preds = %369, %26
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  %371 = load i1, ptr %5, align 1
  ret i1 %371
}

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

declare ptr @sdscatprintf(ptr noundef, ptr noundef, ...) #2

declare ptr @sdsempty() #2

declare void @fontop_consolidateCoverage(ptr noundef, ptr noundef, ptr noundef) #2

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

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

; 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) #4

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

!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, !11, i64 0}
!10 = !{!"", !11, i64 0, !7, i64 8}
!11 = !{!"int", !7, i64 0}
!12 = !{!13, !6, i64 32}
!13 = !{!"", !14, i64 0, !14, i64 1, !14, i64 2, !14, i64 3, !14, i64 4, !14, i64 5, !14, i64 6, !14, i64 7, !14, i64 8, !14, i64 9, !14, i64 10, !14, i64 11, !14, i64 12, !14, i64 13, !14, i64 14, !14, i64 15, !14, i64 16, !14, i64 17, !14, i64 18, !14, i64 19, !14, i64 20, !14, i64 21, !14, i64 22, !6, i64 24, !6, i64 32}
!14 = !{!"_Bool", !7, i64 0}
!15 = !{!16, !6, i64 48}
!16 = !{!"otfcc_ILogger", !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}
!17 = !{!14, !14, i64 0}
!18 = !{!19, !19, i64 0}
!19 = !{!"short", !7, i64 0}
!20 = !{!21, !19, i64 0}
!21 = !{!"", !19, i64 0, !19, i64 2, !19, i64 4, !6, i64 8, !19, i64 16, !6, i64 24}
!22 = !{!21, !6, i64 8}
!23 = !{!24, !6, i64 112}
!24 = !{!"__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}
!25 = !{i8 0, i8 2}
!26 = !{}
!27 = !{!28, !19, i64 0}
!28 = !{!"", !19, i64 0, !11, i64 4, !6, i64 8}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.mustprogress"}
!31 = !{!21, !19, i64 2}
!32 = !{!21, !19, i64 4}
!33 = !{!21, !19, i64 16}
!34 = !{!21, !6, i64 24}
!35 = !{!36, !6, i64 8}
!36 = !{!"otfcc_Handle", !11, i64 0, !19, i64 4, !6, i64 8}
!37 = !{!38, !40, i64 0}
!38 = !{!"", !39, i64 0, !39, i64 24, !39, i64 48}
!39 = !{!"", !40, i64 0, !40, i64 8, !6, i64 16}
!40 = !{!"long", !7, i64 0}
!41 = !{!38, !6, i64 16}
!42 = !{!43, !40, i64 24}
!43 = !{!"_otl_lookup", !6, i64 0, !11, i64 8, !11, i64 12, !19, i64 16, !39, i64 24}
!44 = !{!43, !6, i64 0}
!45 = !{!46, !6, i64 88}
!46 = !{!"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}
!47 = distinct !{!47, !30}
!48 = !{!49, !6, i64 16}
!49 = !{!"", !19, i64 0, !36, i64 8}
!50 = !{!46, !6, i64 24}
!51 = !{!36, !11, i64 0}
!52 = !{!36, !19, i64 4}
!53 = distinct !{!53, !30}
!54 = !{i64 0, i64 2, !18, i64 8, i64 4, !55, i64 12, i64 2, !18, i64 16, i64 8, !5}
!55 = !{!11, !11, i64 0}
!56 = distinct !{!56, !30}


; 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_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 }

@.str = external hidden unnamed_addr constant [56 x i8], align 1
@otl_iCoverage = external local_unnamed_addr constant %struct.__otfcc_ICoverage, align 8
@otfcc_iHandle = external local_unnamed_addr constant %struct.otfcc_HandlePackage, align 8
@.str.1 = external hidden unnamed_addr constant [80 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [45 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local zeroext i1 @consolidate_chaining(ptr noundef %0, ptr nocapture noundef readonly %1, ptr nocapture noundef %2, ptr noundef %3) local_unnamed_addr #0 {
  %5 = load i32, ptr %2, align 8, !tbaa !5
  %.not = icmp eq i32 %5, 0
  br i1 %.not, label %13, label %6

6:                                                ; preds = %4
  %7 = getelementptr inbounds i8, ptr %3, i64 32
  %8 = load ptr, ptr %7, align 8, !tbaa !10
  %9 = getelementptr inbounds i8, ptr %8, i64 48
  %10 = load ptr, ptr %9, align 8, !tbaa !14
  %11 = tail call ptr @sdsempty() #4
  %12 = tail call ptr (ptr, ptr, ...) @sdscatprintf(ptr noundef %11, ptr noundef nonnull @.str) #4
  tail call void %10(ptr noundef %8, i8 noundef zeroext 1, i32 noundef 1, ptr noundef %12) #4
  br label %133

13:                                               ; preds = %4
  %14 = getelementptr inbounds i8, ptr %2, i64 8
  %15 = load i16, ptr %14, align 8, !tbaa !16
  %.not123 = icmp eq i16 %15, 0
  br i1 %.not123, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %13
  %16 = getelementptr inbounds i8, ptr %2, i64 16
  %17 = load ptr, ptr getelementptr inbounds (i8, ptr @otl_iCoverage, i64 112), align 8
  br label %22

._crit_edge.loopexit:                             ; preds = %35
  %18 = xor i1 %36, true
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %13
  %.088.lcssa = phi i1 [ false, %13 ], [ %18, %._crit_edge.loopexit ]
  %.lcssa104 = phi i16 [ 0, %13 ], [ %37, %._crit_edge.loopexit ]
  %19 = getelementptr inbounds i8, ptr %2, i64 10
  %20 = load i16, ptr %19, align 2, !tbaa !19
  %21 = icmp ugt i16 %20, %.lcssa104
  br i1 %21, label %40, label %41

22:                                               ; preds = %.lr.ph, %35
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %35 ]
  %.088105 = phi i1 [ true, %.lr.ph ], [ %36, %35 ]
  %23 = load ptr, ptr %16, align 8, !tbaa !20
  %24 = getelementptr inbounds ptr, ptr %23, i64 %indvars.iv
  %25 = load ptr, ptr %24, align 8, !tbaa !21
  tail call void @fontop_consolidateCoverage(ptr noundef %0, ptr noundef %25, ptr noundef %3) #4
  %26 = load ptr, ptr %16, align 8, !tbaa !20
  %27 = getelementptr inbounds ptr, ptr %26, i64 %indvars.iv
  %28 = load ptr, ptr %27, align 8, !tbaa !21
  tail call void %17(ptr noundef %28, i1 noundef zeroext true) #4
  br i1 %.088105, label %29, label %35

29:                                               ; preds = %22
  %30 = load ptr, ptr %16, align 8, !tbaa !20
  %31 = getelementptr inbounds ptr, ptr %30, i64 %indvars.iv
  %32 = load ptr, ptr %31, align 8, !tbaa !21
  %33 = load i16, ptr %32, align 8, !tbaa !22
  %34 = icmp ne i16 %33, 0
  br label %35

35:                                               ; preds = %29, %22
  %36 = phi i1 [ false, %22 ], [ %34, %29 ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %37 = load i16, ptr %14, align 8, !tbaa !16
  %38 = zext i16 %37 to i64
  %39 = icmp ult i64 %indvars.iv.next, %38
  br i1 %39, label %22, label %._crit_edge.loopexit, !llvm.loop !24

40:                                               ; preds = %._crit_edge
  store i16 %.lcssa104, ptr %19, align 2, !tbaa !19
  br label %41

41:                                               ; preds = %40, %._crit_edge
  %42 = getelementptr inbounds i8, ptr %2, i64 12
  %43 = load i16, ptr %42, align 4, !tbaa !26
  %44 = icmp ugt i16 %43, %.lcssa104
  br i1 %44, label %45, label %46

45:                                               ; preds = %41
  store i16 %.lcssa104, ptr %42, align 4, !tbaa !26
  br label %46

46:                                               ; preds = %45, %41
  %47 = getelementptr inbounds i8, ptr %2, i64 24
  %48 = load i16, ptr %47, align 8, !tbaa !27
  %.not124 = icmp eq i16 %48, 0
  br i1 %.not124, label %._crit_edge116.thread, label %.lr.ph115

.lr.ph115:                                        ; preds = %46
  %49 = getelementptr inbounds i8, ptr %2, i64 32
  %50 = getelementptr inbounds i8, ptr %1, i64 16
  %51 = load ptr, ptr getelementptr inbounds (i8, ptr @otfcc_iHandle, i64 88), align 8
  %52 = getelementptr inbounds i8, ptr %3, i64 32
  %53 = load ptr, ptr getelementptr inbounds (i8, ptr @otfcc_iHandle, i64 24), align 8
  br label %55

._crit_edge116:                                   ; preds = %._crit_edge111.thread
  %.not93 = icmp eq i16 %116, 0
  br i1 %.not93, label %._crit_edge116.thread, label %.lr.ph120

.lr.ph120:                                        ; preds = %._crit_edge116
  %54 = getelementptr inbounds i8, ptr %2, i64 32
  br label %119

55:                                               ; preds = %.lr.ph115, %._crit_edge111.thread
  %indvars.iv130 = phi i64 [ 0, %.lr.ph115 ], [ %indvars.iv.next131, %._crit_edge111.thread ]
  %56 = load ptr, ptr %49, align 8, !tbaa !28
  %57 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %56, i64 %indvars.iv130, i32 1
  %58 = getelementptr inbounds i8, ptr %57, i64 8
  %59 = load ptr, ptr %58, align 8, !tbaa !29
  %.not96 = icmp eq ptr %59, null
  br i1 %.not96, label %93, label %.preheader102

.preheader102:                                    ; preds = %55
  %60 = load i64, ptr %1, align 8, !tbaa !31
  %.not125 = icmp eq i64 %60, 0
  br i1 %.not125, label %.critedge, label %.lr.ph110.outer

.lr.ph110.outer:                                  ; preds = %.preheader102, %.thread
  %.ph = phi i64 [ %.pre, %.thread ], [ %60, %.preheader102 ]
  %.ph142 = phi i64 [ %77, %.thread ], [ 0, %.preheader102 ]
  %.081109.ph = phi i16 [ %76, %.thread ], [ 0, %.preheader102 ]
  %.084108.ph = phi i1 [ true, %.thread ], [ false, %.preheader102 ]
  %61 = load ptr, ptr %50, align 8, !tbaa !35
  br label %.lr.ph110

._crit_edge111:                                   ; preds = %72
  br i1 %.084108.ph, label %._crit_edge111.thread, label %._crit_edge111..critedge_crit_edge

._crit_edge111..critedge_crit_edge:               ; preds = %._crit_edge111
  %.pre136 = load ptr, ptr %49, align 8, !tbaa !28
  br label %.critedge

.lr.ph110:                                        ; preds = %.lr.ph110.outer, %72
  %62 = phi i64 [ %74, %72 ], [ %.ph142, %.lr.ph110.outer ]
  %.081109 = phi i16 [ %73, %72 ], [ %.081109.ph, %.lr.ph110.outer ]
  %63 = getelementptr inbounds ptr, ptr %61, i64 %62
  %64 = load ptr, ptr %63, align 8, !tbaa !21
  %.not99 = icmp eq ptr %64, null
  br i1 %.not99, label %72, label %65

65:                                               ; preds = %.lr.ph110
  %66 = getelementptr inbounds i8, ptr %64, i64 24
  %67 = load i64, ptr %66, align 8, !tbaa !36
  %.not100 = icmp eq i64 %67, 0
  br i1 %.not100, label %72, label %68

68:                                               ; preds = %65
  %69 = load ptr, ptr %64, align 8, !tbaa !38
  %70 = load ptr, ptr %58, align 8, !tbaa !29
  %71 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %69, ptr noundef nonnull dereferenceable(1) %70) #5
  %.not101 = icmp eq i32 %71, 0
  br i1 %.not101, label %.thread, label %72

72:                                               ; preds = %68, %65, %.lr.ph110
  %73 = add i16 %.081109, 1
  %74 = zext i16 %73 to i64
  %75 = icmp ugt i64 %.ph, %74
  br i1 %75, label %.lr.ph110, label %._crit_edge111, !llvm.loop !39

.thread:                                          ; preds = %68
  tail call void %51(ptr noundef nonnull %57, i16 noundef zeroext %.081109, ptr noundef %69) #4
  %.pre = load i64, ptr %1, align 8, !tbaa !31
  %76 = add i16 %.081109, 1
  %77 = zext i16 %76 to i64
  %78 = icmp ugt i64 %.pre, %77
  br i1 %78, label %.lr.ph110.outer, label %._crit_edge111.thread, !llvm.loop !39

.critedge:                                        ; preds = %._crit_edge111..critedge_crit_edge, %.preheader102
  %79 = phi ptr [ %.pre136, %._crit_edge111..critedge_crit_edge ], [ %56, %.preheader102 ]
  %80 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %79, i64 %indvars.iv130, i32 1, i32 2
  %81 = load ptr, ptr %80, align 8, !tbaa !40
  %.not98 = icmp eq ptr %81, null
  br i1 %.not98, label %._crit_edge111.thread, label %82

82:                                               ; preds = %.critedge
  %83 = load ptr, ptr %52, align 8, !tbaa !10
  %84 = getelementptr inbounds i8, ptr %83, i64 48
  %85 = load ptr, ptr %84, align 8, !tbaa !14
  %86 = tail call ptr @sdsempty() #4
  %87 = load ptr, ptr %49, align 8, !tbaa !28
  %88 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %87, i64 %indvars.iv130, i32 1, i32 2
  %89 = load ptr, ptr %88, align 8, !tbaa !40
  %90 = tail call ptr (ptr, ptr, ...) @sdscatprintf(ptr noundef %86, ptr noundef nonnull @.str.1, ptr noundef %89) #4
  tail call void %85(ptr noundef %83, i8 noundef zeroext 1, i32 noundef 1, ptr noundef %90) #4
  %91 = load ptr, ptr %49, align 8, !tbaa !28
  %92 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %91, i64 %indvars.iv130, i32 1
  tail call void %53(ptr noundef nonnull %92) #4
  br label %._crit_edge111.thread

93:                                               ; preds = %55
  %94 = load i32, ptr %57, align 8, !tbaa !42
  %95 = icmp eq i32 %94, 1
  br i1 %95, label %96, label %._crit_edge111.thread

96:                                               ; preds = %93
  %97 = getelementptr inbounds i8, ptr %57, i64 4
  %98 = load i16, ptr %97, align 4, !tbaa !43
  %99 = zext i16 %98 to i64
  %100 = load i64, ptr %1, align 8, !tbaa !31
  %.not97 = icmp ugt i64 %100, %99
  br i1 %.not97, label %109, label %101

101:                                              ; preds = %96
  %102 = load ptr, ptr %52, align 8, !tbaa !10
  %103 = getelementptr inbounds i8, ptr %102, i64 48
  %104 = load ptr, ptr %103, align 8, !tbaa !14
  %105 = tail call ptr @sdsempty() #4
  %106 = load i16, ptr %97, align 4, !tbaa !43
  %107 = zext i16 %106 to i32
  %108 = tail call ptr (ptr, ptr, ...) @sdscatprintf(ptr noundef %105, ptr noundef nonnull @.str.2, i32 noundef %107) #4
  tail call void %104(ptr noundef %102, i8 noundef zeroext 1, i32 noundef 1, ptr noundef %108) #4
  store i16 0, ptr %97, align 4, !tbaa !43
  br label %109

109:                                              ; preds = %101, %96
  %110 = phi i16 [ 0, %101 ], [ %98, %96 ]
  %111 = load ptr, ptr %50, align 8, !tbaa !35
  %112 = zext i16 %110 to i64
  %113 = getelementptr inbounds ptr, ptr %111, i64 %112
  %114 = load ptr, ptr %113, align 8, !tbaa !21
  %115 = load ptr, ptr %114, align 8, !tbaa !38
  tail call void %51(ptr noundef nonnull %57, i16 noundef zeroext %110, ptr noundef %115) #4
  br label %._crit_edge111.thread

._crit_edge111.thread:                            ; preds = %.thread, %93, %109, %._crit_edge111, %.critedge, %82
  %indvars.iv.next131 = add nuw nsw i64 %indvars.iv130, 1
  %116 = load i16, ptr %47, align 8, !tbaa !27
  %117 = zext i16 %116 to i64
  %118 = icmp ult i64 %indvars.iv.next131, %117
  br i1 %118, label %55, label %._crit_edge116, !llvm.loop !44

._crit_edge121:                                   ; preds = %129
  store i16 %.1, ptr %47, align 8, !tbaa !27
  %.not94.not = icmp eq i16 %.1, 0
  br i1 %.not94.not, label %133, label %._crit_edge116.thread

119:                                              ; preds = %.lr.ph120, %129
  %120 = phi i16 [ %116, %.lr.ph120 ], [ %130, %129 ]
  %indvars.iv133 = phi i64 [ 0, %.lr.ph120 ], [ %indvars.iv.next134, %129 ]
  %.080118 = phi i16 [ 0, %.lr.ph120 ], [ %.1, %129 ]
  %121 = load ptr, ptr %54, align 8, !tbaa !28
  %122 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %121, i64 %indvars.iv133
  %123 = getelementptr inbounds i8, ptr %122, i64 16
  %124 = load ptr, ptr %123, align 8, !tbaa !40
  %.not95 = icmp eq ptr %124, null
  br i1 %.not95, label %129, label %125

125:                                              ; preds = %119
  %126 = add i16 %.080118, 1
  %127 = zext i16 %.080118 to i64
  %128 = getelementptr inbounds %struct.otl_ChainLookupApplication, ptr %121, i64 %127
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %128, ptr noundef nonnull align 8 dereferenceable(24) %122, i64 24, i1 false), !tbaa.struct !45
  %.pre137 = load i16, ptr %47, align 8, !tbaa !27
  br label %129

129:                                              ; preds = %119, %125
  %130 = phi i16 [ %.pre137, %125 ], [ %120, %119 ]
  %.1 = phi i16 [ %126, %125 ], [ %.080118, %119 ]
  %indvars.iv.next134 = add nuw nsw i64 %indvars.iv133, 1
  %131 = zext i16 %130 to i64
  %132 = icmp ult i64 %indvars.iv.next134, %131
  br i1 %132, label %119, label %._crit_edge121, !llvm.loop !48

._crit_edge116.thread:                            ; preds = %46, %._crit_edge121, %._crit_edge116
  br label %133

133:                                              ; preds = %._crit_edge116.thread, %._crit_edge121, %6
  %.2 = phi i1 [ false, %6 ], [ %.088.lcssa, %._crit_edge116.thread ], [ true, %._crit_edge121 ]
  ret i1 %.2
}

declare ptr @sdscatprintf(ptr noundef, ptr noundef, ...) local_unnamed_addr #1

declare ptr @sdsempty() local_unnamed_addr #1

declare void @fontop_consolidateCoverage(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

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

; Function Attrs: mustprogress 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) #3

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

!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 0}
!6 = !{!"", !7, i64 0, !8, i64 8}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!11, !13, i64 32}
!11 = !{!"", !12, i64 0, !12, i64 1, !12, i64 2, !12, i64 3, !12, i64 4, !12, i64 5, !12, i64 6, !12, i64 7, !12, i64 8, !12, i64 9, !12, i64 10, !12, i64 11, !12, i64 12, !12, i64 13, !12, i64 14, !12, i64 15, !12, i64 16, !12, i64 17, !12, i64 18, !12, i64 19, !12, i64 20, !12, i64 21, !12, i64 22, !13, i64 24, !13, i64 32}
!12 = !{!"_Bool", !8, i64 0}
!13 = !{!"any pointer", !8, i64 0}
!14 = !{!15, !13, i64 48}
!15 = !{!"otfcc_ILogger", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !13, i64 40, !13, i64 48, !13, i64 56, !13, i64 64, !13, i64 72, !13, i64 80, !13, i64 88}
!16 = !{!17, !18, i64 0}
!17 = !{!"", !18, i64 0, !18, i64 2, !18, i64 4, !13, i64 8, !18, i64 16, !13, i64 24}
!18 = !{!"short", !8, i64 0}
!19 = !{!17, !18, i64 2}
!20 = !{!17, !13, i64 8}
!21 = !{!13, !13, i64 0}
!22 = !{!23, !18, i64 0}
!23 = !{!"", !18, i64 0, !7, i64 4, !13, i64 8}
!24 = distinct !{!24, !25}
!25 = !{!"llvm.loop.mustprogress"}
!26 = !{!17, !18, i64 4}
!27 = !{!17, !18, i64 16}
!28 = !{!17, !13, i64 24}
!29 = !{!30, !13, i64 8}
!30 = !{!"otfcc_Handle", !7, i64 0, !18, i64 4, !13, i64 8}
!31 = !{!32, !34, i64 0}
!32 = !{!"", !33, i64 0, !33, i64 24, !33, i64 48}
!33 = !{!"", !34, i64 0, !34, i64 8, !13, i64 16}
!34 = !{!"long", !8, i64 0}
!35 = !{!32, !13, i64 16}
!36 = !{!37, !34, i64 24}
!37 = !{!"_otl_lookup", !13, i64 0, !7, i64 8, !7, i64 12, !18, i64 16, !33, i64 24}
!38 = !{!37, !13, i64 0}
!39 = distinct !{!39, !25}
!40 = !{!41, !13, i64 16}
!41 = !{!"", !18, i64 0, !30, i64 8}
!42 = !{!30, !7, i64 0}
!43 = !{!30, !18, i64 4}
!44 = distinct !{!44, !25}
!45 = !{i64 0, i64 2, !46, i64 8, i64 4, !47, i64 12, i64 2, !46, i64 16, i64 8, !21}
!46 = !{!18, !18, i64 0}
!47 = !{!7, !7, i64 0}
!48 = distinct !{!48, !25}


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