; LLVM IR from reworks-org/galaxy :: deps/sfml_deps/freetype-src/src/autofit (aflatin)

; 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.AF_GlyphHintsRec_ = type { ptr, i64, i64, i64, i64, i32, i32, ptr, i32, i32, ptr, [2 x %struct.AF_AxisHintsRec_], i32, i32, ptr, %struct.anon.0 }
%struct.AF_AxisHintsRec_ = type { i32, i32, ptr, i32, i32, ptr, i32, %struct.anon }
%struct.anon = type { [18 x %struct.AF_SegmentRec_], [12 x %struct.AF_EdgeRec_] }
%struct.AF_SegmentRec_ = type { i8, i8, i16, i16, i16, i16, i16, ptr, ptr, ptr, ptr, i64, i64, ptr, ptr }
%struct.AF_EdgeRec_ = type { i16, i64, i64, i8, i8, i64, ptr, ptr, ptr, i32, ptr, ptr }
%struct.anon.0 = type { [8 x ptr], [96 x %struct.AF_PointRec_] }
%struct.AF_PointRec_ = type { i16, i8, i8, i64, i64, i16, i16, i64, i64, i64, i64, ptr, ptr }
%struct.AF_WidthRec_ = type { i64, i64, i64 }
%struct.AF_LatinMetricsRec_ = type { %struct.AF_StyleMetricsRec_, i32, [2 x %struct.AF_LatinAxisRec_] }
%struct.AF_StyleMetricsRec_ = type { ptr, %struct.AF_ScalerRec_, i8, ptr }
%struct.AF_ScalerRec_ = type { ptr, i64, i64, i64, i64, i32, i32 }
%struct.AF_LatinAxisRec_ = type { i64, i64, i32, [16 x %struct.AF_WidthRec_], i64, i64, i8, i32, [266 x %struct.AF_LatinBlueRec_], i64, i64 }
%struct.AF_LatinBlueRec_ = type { %struct.AF_WidthRec_, %struct.AF_WidthRec_, i64, i64, i32 }

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

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

; Function Attrs: nounwind uwtable
define hidden void @af_latin_hints_link_segments(ptr noundef %0, i32 noundef %1, ptr noundef %2, i32 noundef %3) #1 {
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i64, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i64, align 8
  %19 = alloca i64, align 8
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca i64, align 8
  %26 = alloca i64, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store i32 %1, ptr %6, align 4, !tbaa !9
  store ptr %2, ptr %7, align 8, !tbaa !5
  store i32 %3, ptr %8, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #2
  %27 = load ptr, ptr %5, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.AF_GlyphHintsRec_, ptr %27, i32 0, i32 11
  %29 = load i32, ptr %8, align 4, !tbaa !9
  %30 = zext i32 %29 to i64
  %31 = getelementptr inbounds [2 x %struct.AF_AxisHintsRec_], ptr %28, i64 0, i64 %30
  store ptr %31, ptr %9, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #2
  %32 = load ptr, ptr %9, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.AF_AxisHintsRec_, ptr %32, i32 0, i32 2
  %34 = load ptr, ptr %33, align 8, !tbaa !11
  store ptr %34, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #2
  %35 = load ptr, ptr %10, align 8, !tbaa !5
  %36 = icmp ne ptr %35, null
  br i1 %36, label %37, label %44

37:                                               ; preds = %4
  %38 = load ptr, ptr %10, align 8, !tbaa !5
  %39 = load ptr, ptr %9, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.AF_AxisHintsRec_, ptr %39, i32 0, i32 0
  %41 = load i32, ptr %40, align 8, !tbaa !14
  %42 = zext i32 %41 to i64
  %43 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %38, i64 %42
  br label %45

44:                                               ; preds = %4
  br label %45

45:                                               ; preds = %44, %37
  %46 = phi ptr [ %43, %37 ], [ null, %44 ]
  store ptr %46, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #2
  %47 = load i32, ptr %6, align 4, !tbaa !9
  %48 = icmp ne i32 %47, 0
  br i1 %48, label %49, label %57

49:                                               ; preds = %45
  %50 = load ptr, ptr %7, align 8, !tbaa !5
  %51 = load i32, ptr %6, align 4, !tbaa !9
  %52 = sub i32 %51, 1
  %53 = zext i32 %52 to i64
  %54 = getelementptr inbounds %struct.AF_WidthRec_, ptr %50, i64 %53
  %55 = getelementptr inbounds %struct.AF_WidthRec_, ptr %54, i32 0, i32 0
  %56 = load i64, ptr %55, align 8, !tbaa !15
  store i64 %56, ptr %15, align 8, !tbaa !18
  br label %58

57:                                               ; preds = %45
  store i64 0, ptr %15, align 8, !tbaa !18
  br label %58

58:                                               ; preds = %57, %49
  %59 = load ptr, ptr %5, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.AF_GlyphHintsRec_, ptr %59, i32 0, i32 14
  %61 = load ptr, ptr %60, align 8, !tbaa !19
  %62 = getelementptr inbounds %struct.AF_LatinMetricsRec_, ptr %61, i32 0, i32 1
  %63 = load i32, ptr %62, align 8, !tbaa !22
  %64 = zext i32 %63 to i64
  %65 = mul nsw i64 8, %64
  %66 = sdiv i64 %65, 2048
  store i64 %66, ptr %12, align 8, !tbaa !18
  %67 = load i64, ptr %12, align 8, !tbaa !18
  %68 = icmp eq i64 %67, 0
  br i1 %68, label %69, label %70

69:                                               ; preds = %58
  store i64 1, ptr %12, align 8, !tbaa !18
  br label %70

70:                                               ; preds = %69, %58
  %71 = load ptr, ptr %5, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.AF_GlyphHintsRec_, ptr %71, i32 0, i32 14
  %73 = load ptr, ptr %72, align 8, !tbaa !19
  %74 = getelementptr inbounds %struct.AF_LatinMetricsRec_, ptr %73, i32 0, i32 1
  %75 = load i32, ptr %74, align 8, !tbaa !22
  %76 = zext i32 %75 to i64
  %77 = mul nsw i64 6000, %76
  %78 = sdiv i64 %77, 2048
  store i64 %78, ptr %13, align 8, !tbaa !18
  store i64 3000, ptr %14, align 8, !tbaa !18
  %79 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %79, ptr %16, align 8, !tbaa !5
  br label %80

80:                                               ; preds = %229, %70
  %81 = load ptr, ptr %16, align 8, !tbaa !5
  %82 = load ptr, ptr %11, align 8, !tbaa !5
  %83 = icmp ult ptr %81, %82
  br i1 %83, label %84, label %232

84:                                               ; preds = %80
  %85 = load ptr, ptr %16, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %85, i32 0, i32 1
  %87 = load i8, ptr %86, align 1, !tbaa !26
  %88 = sext i8 %87 to i32
  %89 = load ptr, ptr %9, align 8, !tbaa !5
  %90 = getelementptr inbounds %struct.AF_AxisHintsRec_, ptr %89, i32 0, i32 6
  %91 = load i32, ptr %90, align 8, !tbaa !29
  %92 = icmp ne i32 %88, %91
  br i1 %92, label %93, label %94

93:                                               ; preds = %84
  br label %229

94:                                               ; preds = %84
  %95 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %95, ptr %17, align 8, !tbaa !5
  br label %96

96:                                               ; preds = %225, %94
  %97 = load ptr, ptr %17, align 8, !tbaa !5
  %98 = load ptr, ptr %11, align 8, !tbaa !5
  %99 = icmp ult ptr %97, %98
  br i1 %99, label %100, label %228

100:                                              ; preds = %96
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #2
  %101 = load ptr, ptr %16, align 8, !tbaa !5
  %102 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %101, i32 0, i32 2
  %103 = load i16, ptr %102, align 2, !tbaa !30
  %104 = sext i16 %103 to i64
  store i64 %104, ptr %18, align 8, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #2
  %105 = load ptr, ptr %17, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %105, i32 0, i32 2
  %107 = load i16, ptr %106, align 2, !tbaa !30
  %108 = sext i16 %107 to i64
  store i64 %108, ptr %19, align 8, !tbaa !18
  %109 = load ptr, ptr %16, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %109, i32 0, i32 1
  %111 = load i8, ptr %110, align 1, !tbaa !26
  %112 = sext i8 %111 to i32
  %113 = load ptr, ptr %17, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %113, i32 0, i32 1
  %115 = load i8, ptr %114, align 1, !tbaa !26
  %116 = sext i8 %115 to i32
  %117 = add nsw i32 %112, %116
  %118 = icmp eq i32 %117, 0
  br i1 %118, label %119, label %224

119:                                              ; preds = %100
  %120 = load i64, ptr %19, align 8, !tbaa !18
  %121 = load i64, ptr %18, align 8, !tbaa !18
  %122 = icmp sgt i64 %120, %121
  br i1 %122, label %123, label %224

123:                                              ; preds = %119
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #2
  %124 = load ptr, ptr %16, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %124, i32 0, i32 4
  %126 = load i16, ptr %125, align 2, !tbaa !31
  %127 = sext i16 %126 to i64
  store i64 %127, ptr %20, align 8, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #2
  %128 = load ptr, ptr %16, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %128, i32 0, i32 5
  %130 = load i16, ptr %129, align 8, !tbaa !32
  %131 = sext i16 %130 to i64
  store i64 %131, ptr %21, align 8, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #2
  %132 = load i64, ptr %20, align 8, !tbaa !18
  %133 = load ptr, ptr %17, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %133, i32 0, i32 4
  %135 = load i16, ptr %134, align 2, !tbaa !31
  %136 = sext i16 %135 to i64
  %137 = icmp slt i64 %132, %136
  br i1 %137, label %138, label %143

138:                                              ; preds = %123
  %139 = load ptr, ptr %17, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %139, i32 0, i32 4
  %141 = load i16, ptr %140, align 2, !tbaa !31
  %142 = sext i16 %141 to i64
  store i64 %142, ptr %20, align 8, !tbaa !18
  br label %143

143:                                              ; preds = %138, %123
  %144 = load i64, ptr %21, align 8, !tbaa !18
  %145 = load ptr, ptr %17, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %145, i32 0, i32 5
  %147 = load i16, ptr %146, align 8, !tbaa !32
  %148 = sext i16 %147 to i64
  %149 = icmp sgt i64 %144, %148
  br i1 %149, label %150, label %155

150:                                              ; preds = %143
  %151 = load ptr, ptr %17, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %151, i32 0, i32 5
  %153 = load i16, ptr %152, align 8, !tbaa !32
  %154 = sext i16 %153 to i64
  store i64 %154, ptr %21, align 8, !tbaa !18
  br label %155

155:                                              ; preds = %150, %143
  %156 = load i64, ptr %21, align 8, !tbaa !18
  %157 = load i64, ptr %20, align 8, !tbaa !18
  %158 = sub nsw i64 %156, %157
  store i64 %158, ptr %22, align 8, !tbaa !18
  %159 = load i64, ptr %22, align 8, !tbaa !18
  %160 = load i64, ptr %12, align 8, !tbaa !18
  %161 = icmp sge i64 %159, %160
  br i1 %161, label %162, label %223

162:                                              ; preds = %155
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #2
  %163 = load i64, ptr %19, align 8, !tbaa !18
  %164 = load i64, ptr %18, align 8, !tbaa !18
  %165 = sub nsw i64 %163, %164
  store i64 %165, ptr %23, align 8, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #2
  %166 = load i64, ptr %15, align 8, !tbaa !18
  %167 = icmp ne i64 %166, 0
  br i1 %167, label %168, label %189

168:                                              ; preds = %162
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #2
  %169 = load i64, ptr %23, align 8, !tbaa !18
  %170 = shl i64 %169, 10
  %171 = load i64, ptr %15, align 8, !tbaa !18
  %172 = sdiv i64 %170, %171
  %173 = sub nsw i64 %172, 1024
  store i64 %173, ptr %26, align 8, !tbaa !18
  %174 = load i64, ptr %26, align 8, !tbaa !18
  %175 = icmp sgt i64 %174, 10000
  br i1 %175, label %176, label %177

176:                                              ; preds = %168
  store i64 32000, ptr %24, align 8, !tbaa !18
  br label %188

177:                                              ; preds = %168
  %178 = load i64, ptr %26, align 8, !tbaa !18
  %179 = icmp sgt i64 %178, 0
  br i1 %179, label %180, label %186

180:                                              ; preds = %177
  %181 = load i64, ptr %26, align 8, !tbaa !18
  %182 = load i64, ptr %26, align 8, !tbaa !18
  %183 = mul nsw i64 %181, %182
  %184 = load i64, ptr %14, align 8, !tbaa !18
  %185 = sdiv i64 %183, %184
  store i64 %185, ptr %24, align 8, !tbaa !18
  br label %187

186:                                              ; preds = %177
  store i64 0, ptr %24, align 8, !tbaa !18
  br label %187

187:                                              ; preds = %186, %180
  br label %188

188:                                              ; preds = %187, %176
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #2
  br label %191

189:                                              ; preds = %162
  %190 = load i64, ptr %23, align 8, !tbaa !18
  store i64 %190, ptr %24, align 8, !tbaa !18
  br label %191

191:                                              ; preds = %189, %188
  %192 = load i64, ptr %24, align 8, !tbaa !18
  %193 = load i64, ptr %13, align 8, !tbaa !18
  %194 = load i64, ptr %22, align 8, !tbaa !18
  %195 = sdiv i64 %193, %194
  %196 = add nsw i64 %192, %195
  store i64 %196, ptr %25, align 8, !tbaa !18
  %197 = load i64, ptr %25, align 8, !tbaa !18
  %198 = load ptr, ptr %16, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %198, i32 0, i32 11
  %200 = load i64, ptr %199, align 8, !tbaa !33
  %201 = icmp slt i64 %197, %200
  br i1 %201, label %202, label %209

202:                                              ; preds = %191
  %203 = load i64, ptr %25, align 8, !tbaa !18
  %204 = load ptr, ptr %16, align 8, !tbaa !5
  %205 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %204, i32 0, i32 11
  store i64 %203, ptr %205, align 8, !tbaa !33
  %206 = load ptr, ptr %17, align 8, !tbaa !5
  %207 = load ptr, ptr %16, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %207, i32 0, i32 9
  store ptr %206, ptr %208, align 8, !tbaa !34
  br label %209

209:                                              ; preds = %202, %191
  %210 = load i64, ptr %25, align 8, !tbaa !18
  %211 = load ptr, ptr %17, align 8, !tbaa !5
  %212 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %211, i32 0, i32 11
  %213 = load i64, ptr %212, align 8, !tbaa !33
  %214 = icmp slt i64 %210, %213
  br i1 %214, label %215, label %222

215:                                              ; preds = %209
  %216 = load i64, ptr %25, align 8, !tbaa !18
  %217 = load ptr, ptr %17, align 8, !tbaa !5
  %218 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %217, i32 0, i32 11
  store i64 %216, ptr %218, align 8, !tbaa !33
  %219 = load ptr, ptr %16, align 8, !tbaa !5
  %220 = load ptr, ptr %17, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %220, i32 0, i32 9
  store ptr %219, ptr %221, align 8, !tbaa !34
  br label %222

222:                                              ; preds = %215, %209
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #2
  br label %223

223:                                              ; preds = %222, %155
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #2
  br label %224

224:                                              ; preds = %223, %119, %100
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #2
  br label %225

225:                                              ; preds = %224
  %226 = load ptr, ptr %17, align 8, !tbaa !5
  %227 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %226, i32 1
  store ptr %227, ptr %17, align 8, !tbaa !5
  br label %96, !llvm.loop !35

228:                                              ; preds = %96
  br label %229

229:                                              ; preds = %228, %93
  %230 = load ptr, ptr %16, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %230, i32 1
  store ptr %231, ptr %16, align 8, !tbaa !5
  br label %80, !llvm.loop !37

232:                                              ; preds = %80
  %233 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %233, ptr %16, align 8, !tbaa !5
  br label %234

234:                                              ; preds = %260, %232
  %235 = load ptr, ptr %16, align 8, !tbaa !5
  %236 = load ptr, ptr %11, align 8, !tbaa !5
  %237 = icmp ult ptr %235, %236
  br i1 %237, label %238, label %263

238:                                              ; preds = %234
  %239 = load ptr, ptr %16, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %239, i32 0, i32 9
  %241 = load ptr, ptr %240, align 8, !tbaa !34
  store ptr %241, ptr %17, align 8, !tbaa !5
  %242 = load ptr, ptr %17, align 8, !tbaa !5
  %243 = icmp ne ptr %242, null
  br i1 %243, label %244, label %259

244:                                              ; preds = %238
  %245 = load ptr, ptr %17, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %245, i32 0, i32 9
  %247 = load ptr, ptr %246, align 8, !tbaa !34
  %248 = load ptr, ptr %16, align 8, !tbaa !5
  %249 = icmp ne ptr %247, %248
  br i1 %249, label %250, label %258

250:                                              ; preds = %244
  %251 = load ptr, ptr %16, align 8, !tbaa !5
  %252 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %251, i32 0, i32 9
  store ptr null, ptr %252, align 8, !tbaa !34
  %253 = load ptr, ptr %17, align 8, !tbaa !5
  %254 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %253, i32 0, i32 9
  %255 = load ptr, ptr %254, align 8, !tbaa !34
  %256 = load ptr, ptr %16, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %256, i32 0, i32 10
  store ptr %255, ptr %257, align 8, !tbaa !38
  br label %258

258:                                              ; preds = %250, %244
  br label %259

259:                                              ; preds = %258, %238
  br label %260

260:                                              ; preds = %259
  %261 = load ptr, ptr %16, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %261, i32 1
  store ptr %262, ptr %16, align 8, !tbaa !5
  br label %234, !llvm.loop !39

263:                                              ; preds = %234
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #2
  ret void
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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, !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, !6, i64 8}
!12 = !{!"AF_AxisHintsRec_", !10, i64 0, !10, i64 4, !6, i64 8, !10, i64 16, !10, i64 20, !6, i64 24, !10, i64 32, !13, i64 40}
!13 = !{!"", !7, i64 0, !7, i64 1440}
!14 = !{!12, !10, i64 0}
!15 = !{!16, !17, i64 0}
!16 = !{!"AF_WidthRec_", !17, i64 0, !17, i64 8, !17, i64 16}
!17 = !{!"long", !7, i64 0}
!18 = !{!17, !17, i64 0}
!19 = !{!20, !6, i64 5152}
!20 = !{!"AF_GlyphHintsRec_", !6, i64 0, !17, i64 8, !17, i64 16, !17, i64 24, !17, i64 32, !10, i64 40, !10, i64 44, !6, i64 48, !10, i64 56, !10, i64 60, !6, i64 64, !7, i64 72, !10, i64 5144, !10, i64 5148, !6, i64 5152, !21, i64 5160}
!21 = !{!"", !7, i64 0, !7, i64 64}
!22 = !{!23, !10, i64 72}
!23 = !{!"AF_LatinMetricsRec_", !24, i64 0, !10, i64 72, !7, i64 80}
!24 = !{!"AF_StyleMetricsRec_", !6, i64 0, !25, i64 8, !7, i64 56, !6, i64 64}
!25 = !{!"AF_ScalerRec_", !6, i64 0, !17, i64 8, !17, i64 16, !17, i64 24, !17, i64 32, !10, i64 40, !10, i64 44}
!26 = !{!27, !7, i64 1}
!27 = !{!"AF_SegmentRec_", !7, i64 0, !7, i64 1, !28, i64 2, !28, i64 4, !28, i64 6, !28, i64 8, !28, i64 10, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !17, i64 48, !17, i64 56, !6, i64 64, !6, i64 72}
!28 = !{!"short", !7, i64 0}
!29 = !{!12, !10, i64 32}
!30 = !{!27, !28, i64 2}
!31 = !{!27, !28, i64 6}
!32 = !{!27, !28, i64 8}
!33 = !{!27, !17, i64 48}
!34 = !{!27, !6, i64 32}
!35 = distinct !{!35, !36}
!36 = !{!"llvm.loop.mustprogress"}
!37 = distinct !{!37, !36}
!38 = !{!27, !6, i64 40}
!39 = distinct !{!39, !36}


; 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.AF_AxisHintsRec_ = type { i32, i32, ptr, i32, i32, ptr, i32, %struct.anon }
%struct.anon = type { [18 x %struct.AF_SegmentRec_], [12 x %struct.AF_EdgeRec_] }
%struct.AF_SegmentRec_ = type { i8, i8, i16, i16, i16, i16, i16, ptr, ptr, ptr, ptr, i64, i64, ptr, ptr }
%struct.AF_EdgeRec_ = type { i16, i64, i64, i8, i8, i64, ptr, ptr, ptr, i32, ptr, ptr }
%struct.AF_WidthRec_ = type { i64, i64, i64 }

; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable
define hidden void @af_latin_hints_link_segments(ptr nocapture noundef readonly %0, i32 noundef %1, ptr nocapture noundef readonly %2, i32 noundef %3) local_unnamed_addr #0 {
  %5 = getelementptr inbounds i8, ptr %0, i64 72
  %6 = zext i32 %3 to i64
  %7 = getelementptr inbounds [2 x %struct.AF_AxisHintsRec_], ptr %5, i64 0, i64 %6
  %8 = getelementptr inbounds i8, ptr %7, i64 8
  %9 = load ptr, ptr %8, align 8, !tbaa !5
  %.not = icmp eq ptr %9, null
  br i1 %.not, label %14, label %10

10:                                               ; preds = %4
  %11 = load i32, ptr %7, align 8, !tbaa !12
  %12 = zext i32 %11 to i64
  %13 = getelementptr inbounds %struct.AF_SegmentRec_, ptr %9, i64 %12
  br label %14

14:                                               ; preds = %4, %10
  %15 = phi ptr [ %13, %10 ], [ null, %4 ]
  %.not97 = icmp eq i32 %1, 0
  br i1 %.not97, label %22, label %16

16:                                               ; preds = %14
  %17 = add i32 %1, -1
  %18 = zext i32 %17 to i64
  %19 = getelementptr inbounds %struct.AF_WidthRec_, ptr %2, i64 %18
  %20 = load i64, ptr %19, align 8, !tbaa !13
  %21 = freeze i64 %20
  br label %22

22:                                               ; preds = %14, %16
  %.0 = phi i64 [ %21, %16 ], [ 0, %14 ]
  %23 = getelementptr inbounds i8, ptr %0, i64 5152
  %24 = load ptr, ptr %23, align 8, !tbaa !16
  %25 = getelementptr inbounds i8, ptr %24, i64 72
  %26 = load i32, ptr %25, align 8, !tbaa !19
  %27 = zext i32 %26 to i64
  %28 = lshr i64 %27, 8
  %29 = icmp ult i32 %26, 256
  %spec.store.select = select i1 %29, i64 1, i64 %28
  %30 = mul nuw nsw i64 %27, 6000
  %31 = lshr i64 %30, 11
  %32 = icmp ult ptr %9, %15
  br i1 %32, label %.lr.ph108.split.us, label %._crit_edge

.lr.ph108.split.us:                               ; preds = %22
  %33 = getelementptr inbounds i8, ptr %7, i64 32
  %34 = load i32, ptr %33, align 8, !tbaa !23
  %.not102 = icmp eq i64 %.0, 0
  br i1 %.not102, label %.lr.ph108.split.us.split.us, label %.lr.ph108.split.us.split

.lr.ph108.split.us.split.us:                      ; preds = %.lr.ph108.split.us, %..loopexit_crit_edge.split.us.us.us
  %.077105.us.us = phi ptr [ %38, %..loopexit_crit_edge.split.us.us.us ], [ %9, %.lr.ph108.split.us ]
  %35 = getelementptr inbounds i8, ptr %.077105.us.us, i64 1
  %36 = load i8, ptr %35, align 1, !tbaa !24
  %37 = sext i8 %36 to i32
  %.not100.us.us = icmp eq i32 %34, %37
  br i1 %.not100.us.us, label %.preheader103.us.us, label %..loopexit_crit_edge.split.us.us.us

..loopexit_crit_edge.split.us.us.us:              ; preds = %78, %.lr.ph108.split.us.split.us
  %38 = getelementptr inbounds i8, ptr %.077105.us.us, i64 80
  %39 = icmp ult ptr %38, %15
  br i1 %39, label %.lr.ph108.split.us.split.us, label %.preheader, !llvm.loop !27

.preheader103.us.us:                              ; preds = %.lr.ph108.split.us.split.us
  %40 = getelementptr inbounds i8, ptr %.077105.us.us, i64 2
  %41 = load i16, ptr %40, align 2, !tbaa !29
  %42 = sext i16 %41 to i64
  %43 = getelementptr inbounds i8, ptr %.077105.us.us, i64 6
  %44 = getelementptr inbounds i8, ptr %.077105.us.us, i64 8
  %45 = getelementptr inbounds i8, ptr %.077105.us.us, i64 48
  %46 = getelementptr inbounds i8, ptr %.077105.us.us, i64 32
  br label %47

47:                                               ; preds = %78, %.preheader103.us.us
  %.079104.us.us.us = phi ptr [ %9, %.preheader103.us.us ], [ %79, %78 ]
  %48 = getelementptr inbounds i8, ptr %.079104.us.us.us, i64 2
  %49 = load i16, ptr %48, align 2, !tbaa !29
  %50 = sext i16 %49 to i64
  %51 = getelementptr inbounds i8, ptr %.079104.us.us.us, i64 1
  %52 = load i8, ptr %51, align 1, !tbaa !24
  %53 = sext i8 %52 to i32
  %54 = sub nsw i32 0, %53
  %55 = icmp eq i32 %34, %54
  %56 = icmp sgt i16 %49, %41
  %or.cond.us.us.us = select i1 %55, i1 %56, i1 false
  br i1 %or.cond.us.us.us, label %57, label %78

57:                                               ; preds = %47
  %58 = load i16, ptr %43, align 2, !tbaa !30
  %59 = load i16, ptr %44, align 8, !tbaa !31
  %60 = getelementptr inbounds i8, ptr %.079104.us.us.us, i64 6
  %61 = load i16, ptr %60, align 2, !tbaa !30
  %spec.select.us.us.us = tail call i16 @llvm.smax.i16(i16 %58, i16 %61)
  %.081.us.us.us = sext i16 %spec.select.us.us.us to i64
  %62 = getelementptr inbounds i8, ptr %.079104.us.us.us, i64 8
  %63 = load i16, ptr %62, align 8, !tbaa !31
  %.080.in.us.us.us = tail call i16 @llvm.smin.i16(i16 %59, i16 %63)
  %.080.us.us.us = sext i16 %.080.in.us.us.us to i64
  %64 = sub nsw i64 %.080.us.us.us, %.081.us.us.us
  %.not101.us.us.us = icmp slt i64 %64, %spec.store.select
  br i1 %.not101.us.us.us, label %78, label %65

65:                                               ; preds = %57
  %66 = sub nsw i64 %50, %42
  %67 = sdiv i64 %31, %64
  %68 = add nsw i64 %67, %66
  %69 = load i64, ptr %45, align 8, !tbaa !32
  %70 = icmp slt i64 %68, %69
  br i1 %70, label %71, label %72

71:                                               ; preds = %65
  store i64 %68, ptr %45, align 8, !tbaa !32
  store ptr %.079104.us.us.us, ptr %46, align 8, !tbaa !33
  br label %72

72:                                               ; preds = %71, %65
  %73 = getelementptr inbounds i8, ptr %.079104.us.us.us, i64 48
  %74 = load i64, ptr %73, align 8, !tbaa !32
  %75 = icmp slt i64 %68, %74
  br i1 %75, label %76, label %78

76:                                               ; preds = %72
  store i64 %68, ptr %73, align 8, !tbaa !32
  %77 = getelementptr inbounds i8, ptr %.079104.us.us.us, i64 32
  store ptr %.077105.us.us, ptr %77, align 8, !tbaa !33
  br label %78

78:                                               ; preds = %76, %72, %57, %47
  %79 = getelementptr inbounds i8, ptr %.079104.us.us.us, i64 80
  %80 = icmp ult ptr %79, %15
  br i1 %80, label %47, label %..loopexit_crit_edge.split.us.us.us, !llvm.loop !34

.lr.ph108.split.us.split:                         ; preds = %.lr.ph108.split.us, %..loopexit_crit_edge.split.us116
  %.077105.us = phi ptr [ %84, %..loopexit_crit_edge.split.us116 ], [ %9, %.lr.ph108.split.us ]
  %81 = getelementptr inbounds i8, ptr %.077105.us, i64 1
  %82 = load i8, ptr %81, align 1, !tbaa !24
  %83 = sext i8 %82 to i32
  %.not100.us = icmp eq i32 %34, %83
  br i1 %.not100.us, label %.preheader103.us, label %..loopexit_crit_edge.split.us116

..loopexit_crit_edge.split.us116:                 ; preds = %127, %.lr.ph108.split.us.split
  %84 = getelementptr inbounds i8, ptr %.077105.us, i64 80
  %85 = icmp ult ptr %84, %15
  br i1 %85, label %.lr.ph108.split.us.split, label %.preheader, !llvm.loop !27

86:                                               ; preds = %.preheader103.us, %127
  %.079104.us109 = phi ptr [ %9, %.preheader103.us ], [ %128, %127 ]
  %87 = getelementptr inbounds i8, ptr %.079104.us109, i64 2
  %88 = load i16, ptr %87, align 2, !tbaa !29
  %89 = sext i16 %88 to i64
  %90 = getelementptr inbounds i8, ptr %.079104.us109, i64 1
  %91 = load i8, ptr %90, align 1, !tbaa !24
  %92 = sext i8 %91 to i32
  %93 = sub nsw i32 0, %92
  %94 = icmp eq i32 %34, %93
  %95 = icmp sgt i16 %88, %131
  %or.cond.us110 = select i1 %94, i1 %95, i1 false
  br i1 %or.cond.us110, label %96, label %127

96:                                               ; preds = %86
  %97 = load i16, ptr %133, align 2, !tbaa !30
  %98 = load i16, ptr %134, align 8, !tbaa !31
  %99 = getelementptr inbounds i8, ptr %.079104.us109, i64 6
  %100 = load i16, ptr %99, align 2, !tbaa !30
  %spec.select.us111 = tail call i16 @llvm.smax.i16(i16 %97, i16 %100)
  %.081.us112 = sext i16 %spec.select.us111 to i64
  %101 = getelementptr inbounds i8, ptr %.079104.us109, i64 8
  %102 = load i16, ptr %101, align 8, !tbaa !31
  %.080.in.us113 = tail call i16 @llvm.smin.i16(i16 %98, i16 %102)
  %.080.us114 = sext i16 %.080.in.us113 to i64
  %103 = sub nsw i64 %.080.us114, %.081.us112
  %.not101.us115 = icmp slt i64 %103, %spec.store.select
  br i1 %.not101.us115, label %127, label %104

104:                                              ; preds = %96
  %105 = sub nsw i64 %89, %132
  %106 = shl nsw i64 %105, 10
  %107 = sdiv i64 %106, %.0
  %108 = add nsw i64 %107, -1024
  %109 = icmp sgt i64 %107, 11024
  br i1 %109, label %115, label %110

110:                                              ; preds = %104
  %111 = icmp sgt i64 %107, 1024
  br i1 %111, label %112, label %115

112:                                              ; preds = %110
  %113 = mul nuw nsw i64 %108, %108
  %.lhs.trunc.us = trunc i64 %113 to i32
  %114 = udiv i32 %.lhs.trunc.us, 3000
  %.zext.us = zext nneg i32 %114 to i64
  br label %115

115:                                              ; preds = %112, %110, %104
  %.1.us = phi i64 [ %.zext.us, %112 ], [ 32000, %104 ], [ 0, %110 ]
  %116 = sdiv i64 %31, %103
  %117 = add nsw i64 %116, %.1.us
  %118 = load i64, ptr %135, align 8, !tbaa !32
  %119 = icmp slt i64 %117, %118
  br i1 %119, label %120, label %121

120:                                              ; preds = %115
  store i64 %117, ptr %135, align 8, !tbaa !32
  store ptr %.079104.us109, ptr %136, align 8, !tbaa !33
  br label %121

121:                                              ; preds = %120, %115
  %122 = getelementptr inbounds i8, ptr %.079104.us109, i64 48
  %123 = load i64, ptr %122, align 8, !tbaa !32
  %124 = icmp slt i64 %117, %123
  br i1 %124, label %125, label %127

125:                                              ; preds = %121
  store i64 %117, ptr %122, align 8, !tbaa !32
  %126 = getelementptr inbounds i8, ptr %.079104.us109, i64 32
  store ptr %.077105.us, ptr %126, align 8, !tbaa !33
  br label %127

127:                                              ; preds = %125, %121, %96, %86
  %128 = getelementptr inbounds i8, ptr %.079104.us109, i64 80
  %129 = icmp ult ptr %128, %15
  br i1 %129, label %86, label %..loopexit_crit_edge.split.us116, !llvm.loop !34

.preheader103.us:                                 ; preds = %.lr.ph108.split.us.split
  %130 = getelementptr inbounds i8, ptr %.077105.us, i64 2
  %131 = load i16, ptr %130, align 2, !tbaa !29
  %132 = sext i16 %131 to i64
  %133 = getelementptr inbounds i8, ptr %.077105.us, i64 6
  %134 = getelementptr inbounds i8, ptr %.077105.us, i64 8
  %135 = getelementptr inbounds i8, ptr %.077105.us, i64 48
  %136 = getelementptr inbounds i8, ptr %.077105.us, i64 32
  br label %86

.preheader:                                       ; preds = %..loopexit_crit_edge.split.us116, %..loopexit_crit_edge.split.us.us.us
  br i1 %32, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %.preheader, %145
  %.178118 = phi ptr [ %146, %145 ], [ %9, %.preheader ]
  %137 = getelementptr inbounds i8, ptr %.178118, i64 32
  %138 = load ptr, ptr %137, align 8, !tbaa !33
  %.not98 = icmp eq ptr %138, null
  br i1 %.not98, label %145, label %139

139:                                              ; preds = %.lr.ph
  %140 = getelementptr inbounds i8, ptr %138, i64 32
  %141 = load ptr, ptr %140, align 8, !tbaa !33
  %.not99 = icmp eq ptr %141, %.178118
  br i1 %.not99, label %145, label %142

142:                                              ; preds = %139
  store ptr null, ptr %137, align 8, !tbaa !33
  %143 = load ptr, ptr %140, align 8, !tbaa !33
  %144 = getelementptr inbounds i8, ptr %.178118, i64 40
  store ptr %143, ptr %144, align 8, !tbaa !35
  br label %145

145:                                              ; preds = %.lr.ph, %142, %139
  %146 = getelementptr inbounds i8, ptr %.178118, i64 80
  %147 = icmp ult ptr %146, %15
  br i1 %147, label %.lr.ph, label %._crit_edge, !llvm.loop !36

._crit_edge:                                      ; preds = %145, %22, %.preheader
  ret void
}

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i16 @llvm.smax.i16(i16, i16) #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i16 @llvm.smin.i16(i16, i16) #1

attributes #0 = { nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !10, i64 8}
!6 = !{!"AF_AxisHintsRec_", !7, i64 0, !7, i64 4, !10, i64 8, !7, i64 16, !7, i64 20, !10, i64 24, !7, i64 32, !11, i64 40}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"", !8, i64 0, !8, i64 1440}
!12 = !{!6, !7, i64 0}
!13 = !{!14, !15, i64 0}
!14 = !{!"AF_WidthRec_", !15, i64 0, !15, i64 8, !15, i64 16}
!15 = !{!"long", !8, i64 0}
!16 = !{!17, !10, i64 5152}
!17 = !{!"AF_GlyphHintsRec_", !10, i64 0, !15, i64 8, !15, i64 16, !15, i64 24, !15, i64 32, !7, i64 40, !7, i64 44, !10, i64 48, !7, i64 56, !7, i64 60, !10, i64 64, !8, i64 72, !7, i64 5144, !7, i64 5148, !10, i64 5152, !18, i64 5160}
!18 = !{!"", !8, i64 0, !8, i64 64}
!19 = !{!20, !7, i64 72}
!20 = !{!"AF_LatinMetricsRec_", !21, i64 0, !7, i64 72, !8, i64 80}
!21 = !{!"AF_StyleMetricsRec_", !10, i64 0, !22, i64 8, !8, i64 56, !10, i64 64}
!22 = !{!"AF_ScalerRec_", !10, i64 0, !15, i64 8, !15, i64 16, !15, i64 24, !15, i64 32, !7, i64 40, !7, i64 44}
!23 = !{!6, !7, i64 32}
!24 = !{!25, !8, i64 1}
!25 = !{!"AF_SegmentRec_", !8, i64 0, !8, i64 1, !26, i64 2, !26, i64 4, !26, i64 6, !26, i64 8, !26, i64 10, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !15, i64 48, !15, i64 56, !10, i64 64, !10, i64 72}
!26 = !{!"short", !8, i64 0}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}
!29 = !{!25, !26, i64 2}
!30 = !{!25, !26, i64 6}
!31 = !{!25, !26, i64 8}
!32 = !{!25, !15, i64 48}
!33 = !{!25, !10, i64 32}
!34 = distinct !{!34, !28}
!35 = !{!25, !10, i64 40}
!36 = distinct !{!36, !28}


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