; LLVM IR from caryll/otfcc :: lib/libcff (charstring-il)

; 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.__caryll_vectorinterface_VQ = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.__caryll_vectorinterface_glyf_Contour = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.__caryll_elementinterface_glyf_Point = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.VQ = type { double, %struct.vq_SegList }
%struct.vq_SegList = type { i64, i64, ptr }
%struct.glyf_Point = type { %struct.VQ, %struct.VQ, i8 }
%struct.glyf_Glyph = type { ptr, %struct.VQ, %struct.VQ, %struct.VQ, %struct.VQ, %struct.glyf_ContourList, %struct.glyf_ReferenceList, %struct.glyf_StemDefList, %struct.glyf_StemDefList, %struct.glyf_MaskList, %struct.glyf_MaskList, i16, ptr, i8, %struct.otfcc_Handle, i16, %struct.glyf_GlyphStat }
%struct.glyf_ContourList = type { i64, i64, ptr }
%struct.glyf_ReferenceList = type { i64, i64, ptr }
%struct.glyf_StemDefList = type { i64, i64, ptr }
%struct.glyf_MaskList = type { i64, i64, ptr }
%struct.otfcc_Handle = type { i32, i16, ptr }
%struct.glyf_GlyphStat = type { double, double, double, double, i16, i16, i16, i16, i16 }
%struct.glyf_Contour = type { i64, i64, ptr }

@iVQ = external constant %struct.__caryll_vectorinterface_VQ, align 8
@glyf_iContour = external constant %struct.__caryll_vectorinterface_glyf_Contour, align 8
@glyf_iPoint = external constant %struct.__caryll_elementinterface_glyf_Point, align 8

; Function Attrs: nounwind uwtable
declare dso_local void @il_push_operand(ptr noundef, double noundef) #0

; Function Attrs: nounwind uwtable
declare dso_local void @il_push_op(ptr noundef, i32 noundef) #0

; Function Attrs: nounwind uwtable
define dso_local ptr @cff_compileGlyphToIL(ptr noundef %0, i16 noundef zeroext %1, i16 noundef zeroext %2) #0 {
  %4 = alloca ptr, align 8
  %5 = alloca i16, align 2
  %6 = alloca i16, align 2
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca %struct.VQ, align 8
  %10 = alloca %struct.VQ, align 8
  %11 = alloca i16, align 2
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i16, align 2
  %16 = alloca %struct.glyf_Point, align 8
  %17 = alloca %struct.glyf_Point, align 8
  %18 = alloca i16, align 2
  %19 = alloca %struct.VQ, align 8
  %20 = alloca %struct.VQ, align 8
  %21 = alloca i8, align 1
  %22 = alloca double, align 8
  %23 = alloca i8, align 1
  %24 = alloca i16, align 2
  %25 = alloca i16, align 2
  %26 = alloca i16, align 2
  %27 = alloca i16, align 2
  %28 = alloca i16, align 2
  %29 = alloca ptr, align 8
  %30 = alloca i16, align 2
  %31 = alloca i16, align 2
  %32 = alloca i16, align 2
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i16 %1, ptr %5, align 2, !tbaa !9
  store i16 %2, ptr %6, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #4
  %33 = call ptr @__caryll_allocate_clean(i64 noundef 16, i64 noundef 143)
  store ptr %33, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #4
  store ptr null, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 32, ptr %9) #4
  %34 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 8), align 8, !tbaa !11
  call void (ptr, ...) %34(ptr dead_on_unwind writable sret(%struct.VQ) align 8 %9)
  call void @llvm.lifetime.start.p0(i64 32, ptr %10) #4
  %35 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 8), align 8, !tbaa !11
  call void (ptr, ...) %35(ptr dead_on_unwind writable sret(%struct.VQ) align 8 %10)
  %36 = load ptr, ptr %4, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.glyf_Glyph, ptr %36, i32 0, i32 5
  %38 = getelementptr inbounds %struct.glyf_ContourList, ptr %37, i32 0, i32 0
  %39 = load i64, ptr %38, align 8, !tbaa !13
  %40 = mul i64 24, %39
  %41 = call ptr @__caryll_allocate_clean(i64 noundef %40, i64 noundef 149)
  store ptr %41, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %11) #4
  store i16 0, ptr %11, align 2, !tbaa !9
  br label %42

42:                                               ; preds = %173, %3
  %43 = load i16, ptr %11, align 2, !tbaa !9
  %44 = zext i16 %43 to i64
  %45 = load ptr, ptr %4, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.glyf_Glyph, ptr %45, i32 0, i32 5
  %47 = getelementptr inbounds %struct.glyf_ContourList, ptr %46, i32 0, i32 0
  %48 = load i64, ptr %47, align 8, !tbaa !13
  %49 = icmp ult i64 %44, %48
  br i1 %49, label %51, label %50

50:                                               ; preds = %42
  store i32 2, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %11) #4
  br label %176

51:                                               ; preds = %42
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #4
  %52 = load ptr, ptr %4, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct.glyf_Glyph, ptr %52, i32 0, i32 5
  %54 = getelementptr inbounds %struct.glyf_ContourList, ptr %53, i32 0, i32 2
  %55 = load ptr, ptr %54, align 8, !tbaa !22
  %56 = load i16, ptr %11, align 2, !tbaa !9
  %57 = zext i16 %56 to i64
  %58 = getelementptr inbounds %struct.glyf_Contour, ptr %55, i64 %57
  store ptr %58, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #4
  %59 = load ptr, ptr %8, align 8, !tbaa !5
  %60 = load i16, ptr %11, align 2, !tbaa !9
  %61 = zext i16 %60 to i64
  %62 = getelementptr inbounds %struct.glyf_Contour, ptr %59, i64 %61
  store ptr %62, ptr %14, align 8, !tbaa !5
  %63 = load ptr, ptr @glyf_iContour, align 8, !tbaa !23
  %64 = load ptr, ptr %14, align 8, !tbaa !5
  call void %63(ptr noundef %64)
  call void @llvm.lifetime.start.p0(i64 2, ptr %15) #4
  store i16 0, ptr %15, align 2, !tbaa !9
  br label %65

65:                                               ; preds = %83, %51
  %66 = load i16, ptr %15, align 2, !tbaa !9
  %67 = zext i16 %66 to i64
  %68 = load ptr, ptr %13, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.glyf_Contour, ptr %68, i32 0, i32 0
  %70 = load i64, ptr %69, align 8, !tbaa !25
  %71 = icmp ult i64 %67, %70
  br i1 %71, label %73, label %72

72:                                               ; preds = %65
  store i32 5, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %15) #4
  br label %86

73:                                               ; preds = %65
  %74 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_glyf_Contour, ptr @glyf_iContour, i32 0, i32 13), align 8, !tbaa !26
  %75 = load ptr, ptr %14, align 8, !tbaa !5
  %76 = load ptr, ptr getelementptr inbounds (%struct.__caryll_elementinterface_glyf_Point, ptr @glyf_iPoint, i32 0, i32 7), align 8, !tbaa !27
  %77 = load ptr, ptr %13, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.glyf_Contour, ptr %77, i32 0, i32 2
  %79 = load ptr, ptr %78, align 8, !tbaa !29
  %80 = load i16, ptr %15, align 2, !tbaa !9
  %81 = zext i16 %80 to i64
  %82 = getelementptr inbounds %struct.glyf_Point, ptr %79, i64 %81
  call void %76(ptr dead_on_unwind writable sret(%struct.glyf_Point) align 8 %16, ptr noundef byval(%struct.glyf_Point) align 8 %82)
  call void %74(ptr noundef %75, ptr noundef byval(%struct.glyf_Point) align 8 %16)
  br label %83

83:                                               ; preds = %73
  %84 = load i16, ptr %15, align 2, !tbaa !9
  %85 = add i16 %84, 1
  store i16 %85, ptr %15, align 2, !tbaa !9
  br label %65, !llvm.loop !30

86:                                               ; preds = %72
  %87 = load ptr, ptr %14, align 8, !tbaa !5
  %88 = getelementptr inbounds %struct.glyf_Contour, ptr %87, i32 0, i32 0
  %89 = load i64, ptr %88, align 8, !tbaa !25
  %90 = icmp ugt i64 %89, 2
  br i1 %90, label %91, label %111

91:                                               ; preds = %86
  %92 = load ptr, ptr %14, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.glyf_Contour, ptr %92, i32 0, i32 2
  %94 = load ptr, ptr %93, align 8, !tbaa !29
  %95 = load ptr, ptr %14, align 8, !tbaa !5
  %96 = getelementptr inbounds %struct.glyf_Contour, ptr %95, i32 0, i32 0
  %97 = load i64, ptr %96, align 8, !tbaa !25
  %98 = sub i64 %97, 1
  %99 = getelementptr inbounds %struct.glyf_Point, ptr %94, i64 %98
  %100 = getelementptr inbounds %struct.glyf_Point, ptr %99, i32 0, i32 2
  %101 = load i8, ptr %100, align 8, !tbaa !32
  %102 = icmp ne i8 %101, 0
  br i1 %102, label %111, label %103

103:                                              ; preds = %91
  %104 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_glyf_Contour, ptr @glyf_iContour, i32 0, i32 13), align 8, !tbaa !26
  %105 = load ptr, ptr %14, align 8, !tbaa !5
  %106 = load ptr, ptr getelementptr inbounds (%struct.__caryll_elementinterface_glyf_Point, ptr @glyf_iPoint, i32 0, i32 7), align 8, !tbaa !27
  %107 = load ptr, ptr %14, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.glyf_Contour, ptr %107, i32 0, i32 2
  %109 = load ptr, ptr %108, align 8, !tbaa !29
  %110 = getelementptr inbounds %struct.glyf_Point, ptr %109, i64 0
  call void %106(ptr dead_on_unwind writable sret(%struct.glyf_Point) align 8 %17, ptr noundef byval(%struct.glyf_Point) align 8 %110)
  call void %104(ptr noundef %105, ptr noundef byval(%struct.glyf_Point) align 8 %17)
  br label %111

111:                                              ; preds = %103, %91, %86
  call void @llvm.lifetime.start.p0(i64 2, ptr %18) #4
  store i16 0, ptr %18, align 2, !tbaa !9
  br label %112

112:                                              ; preds = %169, %111
  %113 = load i16, ptr %18, align 2, !tbaa !9
  %114 = zext i16 %113 to i64
  %115 = load ptr, ptr %14, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.glyf_Contour, ptr %115, i32 0, i32 0
  %117 = load i64, ptr %116, align 8, !tbaa !25
  %118 = icmp ult i64 %114, %117
  br i1 %118, label %120, label %119

119:                                              ; preds = %112
  store i32 8, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %18) #4
  br label %172

120:                                              ; preds = %112
  call void @llvm.lifetime.start.p0(i64 32, ptr %19) #4
  %121 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 14), align 8, !tbaa !34
  %122 = load ptr, ptr %14, align 8, !tbaa !5
  %123 = getelementptr inbounds %struct.glyf_Contour, ptr %122, i32 0, i32 2
  %124 = load ptr, ptr %123, align 8, !tbaa !29
  %125 = load i16, ptr %18, align 2, !tbaa !9
  %126 = zext i16 %125 to i64
  %127 = getelementptr inbounds %struct.glyf_Point, ptr %124, i64 %126
  %128 = getelementptr inbounds %struct.glyf_Point, ptr %127, i32 0, i32 0
  call void %121(ptr dead_on_unwind writable sret(%struct.VQ) align 8 %19, ptr noundef byval(%struct.VQ) align 8 %128, ptr noundef byval(%struct.VQ) align 8 %9)
  call void @llvm.lifetime.start.p0(i64 32, ptr %20) #4
  %129 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 14), align 8, !tbaa !34
  %130 = load ptr, ptr %14, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.glyf_Contour, ptr %130, i32 0, i32 2
  %132 = load ptr, ptr %131, align 8, !tbaa !29
  %133 = load i16, ptr %18, align 2, !tbaa !9
  %134 = zext i16 %133 to i64
  %135 = getelementptr inbounds %struct.glyf_Point, ptr %132, i64 %134
  %136 = getelementptr inbounds %struct.glyf_Point, ptr %135, i32 0, i32 1
  call void %129(ptr dead_on_unwind writable sret(%struct.VQ) align 8 %20, ptr noundef byval(%struct.VQ) align 8 %136, ptr noundef byval(%struct.VQ) align 8 %10)
  %137 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 5), align 8, !tbaa !35
  %138 = load ptr, ptr %14, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.glyf_Contour, ptr %138, i32 0, i32 2
  %140 = load ptr, ptr %139, align 8, !tbaa !29
  %141 = load i16, ptr %18, align 2, !tbaa !9
  %142 = zext i16 %141 to i64
  %143 = getelementptr inbounds %struct.glyf_Point, ptr %140, i64 %142
  %144 = getelementptr inbounds %struct.glyf_Point, ptr %143, i32 0, i32 0
  call void %137(ptr noundef %9, ptr noundef byval(%struct.VQ) align 8 %144)
  %145 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 5), align 8, !tbaa !35
  %146 = load ptr, ptr %14, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.glyf_Contour, ptr %146, i32 0, i32 2
  %148 = load ptr, ptr %147, align 8, !tbaa !29
  %149 = load i16, ptr %18, align 2, !tbaa !9
  %150 = zext i16 %149 to i64
  %151 = getelementptr inbounds %struct.glyf_Point, ptr %148, i64 %150
  %152 = getelementptr inbounds %struct.glyf_Point, ptr %151, i32 0, i32 1
  call void %145(ptr noundef %10, ptr noundef byval(%struct.VQ) align 8 %152)
  %153 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 4), align 8, !tbaa !36
  %154 = load ptr, ptr %14, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.glyf_Contour, ptr %154, i32 0, i32 2
  %156 = load ptr, ptr %155, align 8, !tbaa !29
  %157 = load i16, ptr %18, align 2, !tbaa !9
  %158 = zext i16 %157 to i64
  %159 = getelementptr inbounds %struct.glyf_Point, ptr %156, i64 %158
  %160 = getelementptr inbounds %struct.glyf_Point, ptr %159, i32 0, i32 0
  call void %153(ptr noundef %160, ptr noundef byval(%struct.VQ) align 8 %19)
  %161 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 4), align 8, !tbaa !36
  %162 = load ptr, ptr %14, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.glyf_Contour, ptr %162, i32 0, i32 2
  %164 = load ptr, ptr %163, align 8, !tbaa !29
  %165 = load i16, ptr %18, align 2, !tbaa !9
  %166 = zext i16 %165 to i64
  %167 = getelementptr inbounds %struct.glyf_Point, ptr %164, i64 %166
  %168 = getelementptr inbounds %struct.glyf_Point, ptr %167, i32 0, i32 1
  call void %161(ptr noundef %168, ptr noundef byval(%struct.VQ) align 8 %20)
  call void @llvm.lifetime.end.p0(i64 32, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr %19) #4
  br label %169

169:                                              ; preds = %120
  %170 = load i16, ptr %18, align 2, !tbaa !9
  %171 = add i16 %170, 1
  store i16 %171, ptr %18, align 2, !tbaa !9
  br label %112, !llvm.loop !37

172:                                              ; preds = %119
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #4
  br label %173

173:                                              ; preds = %172
  %174 = load i16, ptr %11, align 2, !tbaa !9
  %175 = add i16 %174, 1
  store i16 %175, ptr %11, align 2, !tbaa !9
  br label %42, !llvm.loop !38

176:                                              ; preds = %50
  %177 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 3), align 8, !tbaa !39
  call void %177(ptr noundef %9)
  %178 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 3), align 8, !tbaa !39
  call void %178(ptr noundef %10)
  call void @llvm.lifetime.end.p0(i64 32, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr %9) #4
  call void @llvm.lifetime.start.p0(i64 1, ptr %21) #4
  %179 = load ptr, ptr %4, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.glyf_Glyph, ptr %179, i32 0, i32 9
  %181 = getelementptr inbounds %struct.glyf_MaskList, ptr %180, i32 0, i32 0
  %182 = load i64, ptr %181, align 8, !tbaa !40
  %183 = icmp ne i64 %182, 0
  br i1 %183, label %190, label %184

184:                                              ; preds = %176
  %185 = load ptr, ptr %4, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.glyf_Glyph, ptr %185, i32 0, i32 10
  %187 = getelementptr inbounds %struct.glyf_MaskList, ptr %186, i32 0, i32 0
  %188 = load i64, ptr %187, align 8, !tbaa !41
  %189 = icmp ne i64 %188, 0
  br label %190

190:                                              ; preds = %184, %176
  %191 = phi i1 [ true, %176 ], [ %189, %184 ]
  %192 = zext i1 %191 to i8
  store i8 %192, ptr %21, align 1, !tbaa !42
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  %193 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_VQ, ptr @iVQ, i32 0, i32 22), align 8, !tbaa !44
  %194 = load ptr, ptr %4, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct.glyf_Glyph, ptr %194, i32 0, i32 2
  %196 = call double %193(ptr noundef byval(%struct.VQ) align 8 %195)
  store double %196, ptr %22, align 8, !tbaa !45
  call void @llvm.lifetime.start.p0(i64 1, ptr %23) #4
  %197 = load double, ptr %22, align 8, !tbaa !45
  %198 = load i16, ptr %5, align 2, !tbaa !9
  %199 = zext i16 %198 to i32
  %200 = sitofp i32 %199 to double
  %201 = fcmp une double %197, %200
  %202 = zext i1 %201 to i8
  store i8 %202, ptr %23, align 1, !tbaa !42
  %203 = load i8, ptr %23, align 1, !tbaa !42, !range !46, !noundef !47
  %204 = trunc i8 %203 to i1
  br i1 %204, label %205, label %213

205:                                              ; preds = %190
  %206 = load ptr, ptr %7, align 8, !tbaa !5
  %207 = load double, ptr %22, align 8, !tbaa !45
  %208 = fptosi double %207 to i32
  %209 = load i16, ptr %6, align 2, !tbaa !9
  %210 = zext i16 %209 to i32
  %211 = sub nsw i32 %208, %210
  %212 = sitofp i32 %211 to double
  call void @il_push_operand(ptr noundef %206, double noundef %212)
  br label %213

213:                                              ; preds = %205, %190
  %214 = load ptr, ptr %7, align 8, !tbaa !5
  %215 = load ptr, ptr %4, align 8, !tbaa !5
  %216 = load i8, ptr %21, align 1, !tbaa !42, !range !46, !noundef !47
  %217 = trunc i8 %216 to i1
  %218 = load i8, ptr %23, align 1, !tbaa !42, !range !46, !noundef !47
  %219 = trunc i8 %218 to i1
  call void @il_push_stems(ptr noundef %214, ptr noundef %215, i1 noundef zeroext %217, i1 noundef zeroext %219)
  call void @llvm.lifetime.start.p0(i64 2, ptr %24) #4
  store i16 0, ptr %24, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %25) #4
  store i16 0, ptr %25, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %26) #4
  store i16 0, ptr %26, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %27) #4
  store i16 0, ptr %27, align 2, !tbaa !9
  %220 = load i8, ptr %21, align 1, !tbaa !42, !range !46, !noundef !47
  %221 = trunc i8 %220 to i1
  br i1 %221, label %222, label %227

222:                                              ; preds = %213
  %223 = load ptr, ptr %7, align 8, !tbaa !5
  %224 = load ptr, ptr %4, align 8, !tbaa !5
  %225 = load i16, ptr %24, align 2, !tbaa !9
  %226 = load i16, ptr %25, align 2, !tbaa !9
  call void @il_push_masks(ptr noundef %223, ptr noundef %224, i16 noundef zeroext %225, i16 noundef zeroext %226, ptr noundef %26, ptr noundef %27)
  br label %227

227:                                              ; preds = %222, %213
  call void @llvm.lifetime.start.p0(i64 2, ptr %28) #4
  store i16 0, ptr %28, align 2, !tbaa !9
  br label %228

228:                                              ; preds = %440, %227
  %229 = load i16, ptr %28, align 2, !tbaa !9
  %230 = zext i16 %229 to i64
  %231 = load ptr, ptr %4, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.glyf_Glyph, ptr %231, i32 0, i32 5
  %233 = getelementptr inbounds %struct.glyf_ContourList, ptr %232, i32 0, i32 0
  %234 = load i64, ptr %233, align 8, !tbaa !13
  %235 = icmp ult i64 %230, %234
  br i1 %235, label %237, label %236

236:                                              ; preds = %228
  store i32 11, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %28) #4
  br label %443

237:                                              ; preds = %228
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #4
  %238 = load ptr, ptr %8, align 8, !tbaa !5
  %239 = load i16, ptr %28, align 2, !tbaa !9
  %240 = zext i16 %239 to i64
  %241 = getelementptr inbounds %struct.glyf_Contour, ptr %238, i64 %240
  store ptr %241, ptr %29, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %30) #4
  %242 = load ptr, ptr %29, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.glyf_Contour, ptr %242, i32 0, i32 0
  %244 = load i64, ptr %243, align 8, !tbaa !25
  %245 = trunc i64 %244 to i16
  store i16 %245, ptr %30, align 2, !tbaa !9
  %246 = load i16, ptr %30, align 2, !tbaa !9
  %247 = zext i16 %246 to i32
  %248 = icmp eq i32 %247, 0
  br i1 %248, label %249, label %250

249:                                              ; preds = %237
  store i32 13, ptr %12, align 4
  br label %437

250:                                              ; preds = %237
  %251 = load ptr, ptr %7, align 8, !tbaa !5
  %252 = load ptr, ptr %29, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.glyf_Contour, ptr %252, i32 0, i32 2
  %254 = load ptr, ptr %253, align 8, !tbaa !29
  %255 = getelementptr inbounds %struct.glyf_Point, ptr %254, i64 0
  %256 = getelementptr inbounds %struct.glyf_Point, ptr %255, i32 0, i32 0
  %257 = load ptr, ptr %29, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.glyf_Contour, ptr %257, i32 0, i32 2
  %259 = load ptr, ptr %258, align 8, !tbaa !29
  %260 = getelementptr inbounds %struct.glyf_Point, ptr %259, i64 0
  %261 = getelementptr inbounds %struct.glyf_Point, ptr %260, i32 0, i32 1
  call void @il_moveto(ptr noundef %251, ptr noundef byval(%struct.VQ) align 8 %256, ptr noundef byval(%struct.VQ) align 8 %261)
  %262 = load i16, ptr %25, align 2, !tbaa !9
  %263 = add i16 %262, 1
  store i16 %263, ptr %25, align 2, !tbaa !9
  %264 = load i8, ptr %21, align 1, !tbaa !42, !range !46, !noundef !47
  %265 = trunc i8 %264 to i1
  br i1 %265, label %266, label %271

266:                                              ; preds = %250
  %267 = load ptr, ptr %7, align 8, !tbaa !5
  %268 = load ptr, ptr %4, align 8, !tbaa !5
  %269 = load i16, ptr %24, align 2, !tbaa !9
  %270 = load i16, ptr %25, align 2, !tbaa !9
  call void @il_push_masks(ptr noundef %267, ptr noundef %268, i16 noundef zeroext %269, i16 noundef zeroext %270, ptr noundef %26, ptr noundef %27)
  br label %271

271:                                              ; preds = %266, %250
  call void @llvm.lifetime.start.p0(i64 2, ptr %31) #4
  store i16 1, ptr %31, align 2, !tbaa !9
  br label %272

272:                                              ; preds = %429, %271
  %273 = load i16, ptr %31, align 2, !tbaa !9
  %274 = zext i16 %273 to i32
  %275 = load i16, ptr %30, align 2, !tbaa !9
  %276 = zext i16 %275 to i32
  %277 = icmp slt i32 %274, %276
  br i1 %277, label %279, label %278

278:                                              ; preds = %272
  store i32 14, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %31) #4
  br label %432

279:                                              ; preds = %272
  %280 = load ptr, ptr %29, align 8, !tbaa !5
  %281 = getelementptr inbounds %struct.glyf_Contour, ptr %280, i32 0, i32 2
  %282 = load ptr, ptr %281, align 8, !tbaa !29
  %283 = load i16, ptr %31, align 2, !tbaa !9
  %284 = zext i16 %283 to i64
  %285 = getelementptr inbounds %struct.glyf_Point, ptr %282, i64 %284
  %286 = getelementptr inbounds %struct.glyf_Point, ptr %285, i32 0, i32 2
  %287 = load i8, ptr %286, align 8, !tbaa !32
  %288 = icmp ne i8 %287, 0
  br i1 %288, label %289, label %309

289:                                              ; preds = %279
  %290 = load ptr, ptr %7, align 8, !tbaa !5
  %291 = load ptr, ptr %29, align 8, !tbaa !5
  %292 = getelementptr inbounds %struct.glyf_Contour, ptr %291, i32 0, i32 2
  %293 = load ptr, ptr %292, align 8, !tbaa !29
  %294 = load i16, ptr %31, align 2, !tbaa !9
  %295 = zext i16 %294 to i64
  %296 = getelementptr inbounds %struct.glyf_Point, ptr %293, i64 %295
  %297 = getelementptr inbounds %struct.glyf_Point, ptr %296, i32 0, i32 0
  %298 = load ptr, ptr %29, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.glyf_Contour, ptr %298, i32 0, i32 2
  %300 = load ptr, ptr %299, align 8, !tbaa !29
  %301 = load i16, ptr %31, align 2, !tbaa !9
  %302 = zext i16 %301 to i64
  %303 = getelementptr inbounds %struct.glyf_Point, ptr %300, i64 %302
  %304 = getelementptr inbounds %struct.glyf_Point, ptr %303, i32 0, i32 1
  call void @il_lineto(ptr noundef %290, ptr noundef byval(%struct.VQ) align 8 %297, ptr noundef byval(%struct.VQ) align 8 %304)
  %305 = load i16, ptr %25, align 2, !tbaa !9
  %306 = zext i16 %305 to i32
  %307 = add nsw i32 %306, 1
  %308 = trunc i32 %307 to i16
  store i16 %308, ptr %25, align 2, !tbaa !9
  br label %420

309:                                              ; preds = %279
  %310 = load i16, ptr %31, align 2, !tbaa !9
  %311 = zext i16 %310 to i32
  %312 = load i16, ptr %30, align 2, !tbaa !9
  %313 = zext i16 %312 to i32
  %314 = sub nsw i32 %313, 2
  %315 = icmp slt i32 %311, %314
  br i1 %315, label %316, label %401

316:                                              ; preds = %309
  %317 = load ptr, ptr %29, align 8, !tbaa !5
  %318 = getelementptr inbounds %struct.glyf_Contour, ptr %317, i32 0, i32 2
  %319 = load ptr, ptr %318, align 8, !tbaa !29
  %320 = load i16, ptr %31, align 2, !tbaa !9
  %321 = zext i16 %320 to i32
  %322 = add nsw i32 %321, 1
  %323 = sext i32 %322 to i64
  %324 = getelementptr inbounds %struct.glyf_Point, ptr %319, i64 %323
  %325 = getelementptr inbounds %struct.glyf_Point, ptr %324, i32 0, i32 2
  %326 = load i8, ptr %325, align 8, !tbaa !32
  %327 = icmp ne i8 %326, 0
  br i1 %327, label %401, label %328

328:                                              ; preds = %316
  %329 = load ptr, ptr %29, align 8, !tbaa !5
  %330 = getelementptr inbounds %struct.glyf_Contour, ptr %329, i32 0, i32 2
  %331 = load ptr, ptr %330, align 8, !tbaa !29
  %332 = load i16, ptr %31, align 2, !tbaa !9
  %333 = zext i16 %332 to i32
  %334 = add nsw i32 %333, 2
  %335 = sext i32 %334 to i64
  %336 = getelementptr inbounds %struct.glyf_Point, ptr %331, i64 %335
  %337 = getelementptr inbounds %struct.glyf_Point, ptr %336, i32 0, i32 2
  %338 = load i8, ptr %337, align 8, !tbaa !32
  %339 = sext i8 %338 to i32
  %340 = icmp ne i32 %339, 0
  br i1 %340, label %341, label %401

341:                                              ; preds = %328
  %342 = load ptr, ptr %7, align 8, !tbaa !5
  %343 = load ptr, ptr %29, align 8, !tbaa !5
  %344 = getelementptr inbounds %struct.glyf_Contour, ptr %343, i32 0, i32 2
  %345 = load ptr, ptr %344, align 8, !tbaa !29
  %346 = load i16, ptr %31, align 2, !tbaa !9
  %347 = zext i16 %346 to i64
  %348 = getelementptr inbounds %struct.glyf_Point, ptr %345, i64 %347
  %349 = getelementptr inbounds %struct.glyf_Point, ptr %348, i32 0, i32 0
  %350 = load ptr, ptr %29, align 8, !tbaa !5
  %351 = getelementptr inbounds %struct.glyf_Contour, ptr %350, i32 0, i32 2
  %352 = load ptr, ptr %351, align 8, !tbaa !29
  %353 = load i16, ptr %31, align 2, !tbaa !9
  %354 = zext i16 %353 to i64
  %355 = getelementptr inbounds %struct.glyf_Point, ptr %352, i64 %354
  %356 = getelementptr inbounds %struct.glyf_Point, ptr %355, i32 0, i32 1
  %357 = load ptr, ptr %29, align 8, !tbaa !5
  %358 = getelementptr inbounds %struct.glyf_Contour, ptr %357, i32 0, i32 2
  %359 = load ptr, ptr %358, align 8, !tbaa !29
  %360 = load i16, ptr %31, align 2, !tbaa !9
  %361 = zext i16 %360 to i32
  %362 = add nsw i32 %361, 1
  %363 = sext i32 %362 to i64
  %364 = getelementptr inbounds %struct.glyf_Point, ptr %359, i64 %363
  %365 = getelementptr inbounds %struct.glyf_Point, ptr %364, i32 0, i32 0
  %366 = load ptr, ptr %29, align 8, !tbaa !5
  %367 = getelementptr inbounds %struct.glyf_Contour, ptr %366, i32 0, i32 2
  %368 = load ptr, ptr %367, align 8, !tbaa !29
  %369 = load i16, ptr %31, align 2, !tbaa !9
  %370 = zext i16 %369 to i32
  %371 = add nsw i32 %370, 1
  %372 = sext i32 %371 to i64
  %373 = getelementptr inbounds %struct.glyf_Point, ptr %368, i64 %372
  %374 = getelementptr inbounds %struct.glyf_Point, ptr %373, i32 0, i32 1
  %375 = load ptr, ptr %29, align 8, !tbaa !5
  %376 = getelementptr inbounds %struct.glyf_Contour, ptr %375, i32 0, i32 2
  %377 = load ptr, ptr %376, align 8, !tbaa !29
  %378 = load i16, ptr %31, align 2, !tbaa !9
  %379 = zext i16 %378 to i32
  %380 = add nsw i32 %379, 2
  %381 = sext i32 %380 to i64
  %382 = getelementptr inbounds %struct.glyf_Point, ptr %377, i64 %381
  %383 = getelementptr inbounds %struct.glyf_Point, ptr %382, i32 0, i32 0
  %384 = load ptr, ptr %29, align 8, !tbaa !5
  %385 = getelementptr inbounds %struct.glyf_Contour, ptr %384, i32 0, i32 2
  %386 = load ptr, ptr %385, align 8, !tbaa !29
  %387 = load i16, ptr %31, align 2, !tbaa !9
  %388 = zext i16 %387 to i32
  %389 = add nsw i32 %388, 2
  %390 = sext i32 %389 to i64
  %391 = getelementptr inbounds %struct.glyf_Point, ptr %386, i64 %390
  %392 = getelementptr inbounds %struct.glyf_Point, ptr %391, i32 0, i32 1
  call void @il_curveto(ptr noundef %342, ptr noundef byval(%struct.VQ) align 8 %349, ptr noundef byval(%struct.VQ) align 8 %356, ptr noundef byval(%struct.VQ) align 8 %365, ptr noundef byval(%struct.VQ) align 8 %374, ptr noundef byval(%struct.VQ) align 8 %383, ptr noundef byval(%struct.VQ) align 8 %392)
  %393 = load i16, ptr %25, align 2, !tbaa !9
  %394 = zext i16 %393 to i32
  %395 = add nsw i32 %394, 3
  %396 = trunc i32 %395 to i16
  store i16 %396, ptr %25, align 2, !tbaa !9
  %397 = load i16, ptr %31, align 2, !tbaa !9
  %398 = zext i16 %397 to i32
  %399 = add nsw i32 %398, 2
  %400 = trunc i32 %399 to i16
  store i16 %400, ptr %31, align 2, !tbaa !9
  br label %419

401:                                              ; preds = %328, %316, %309
  %402 = load ptr, ptr %7, align 8, !tbaa !5
  %403 = load ptr, ptr %29, align 8, !tbaa !5
  %404 = getelementptr inbounds %struct.glyf_Contour, ptr %403, i32 0, i32 2
  %405 = load ptr, ptr %404, align 8, !tbaa !29
  %406 = load i16, ptr %31, align 2, !tbaa !9
  %407 = zext i16 %406 to i64
  %408 = getelementptr inbounds %struct.glyf_Point, ptr %405, i64 %407
  %409 = getelementptr inbounds %struct.glyf_Point, ptr %408, i32 0, i32 0
  %410 = load ptr, ptr %29, align 8, !tbaa !5
  %411 = getelementptr inbounds %struct.glyf_Contour, ptr %410, i32 0, i32 2
  %412 = load ptr, ptr %411, align 8, !tbaa !29
  %413 = load i16, ptr %31, align 2, !tbaa !9
  %414 = zext i16 %413 to i64
  %415 = getelementptr inbounds %struct.glyf_Point, ptr %412, i64 %414
  %416 = getelementptr inbounds %struct.glyf_Point, ptr %415, i32 0, i32 1
  call void @il_lineto(ptr noundef %402, ptr noundef byval(%struct.VQ) align 8 %409, ptr noundef byval(%struct.VQ) align 8 %416)
  %417 = load i16, ptr %25, align 2, !tbaa !9
  %418 = add i16 %417, 1
  store i16 %418, ptr %25, align 2, !tbaa !9
  br label %419

419:                                              ; preds = %401, %341
  br label %420

420:                                              ; preds = %419, %289
  %421 = load i8, ptr %21, align 1, !tbaa !42, !range !46, !noundef !47
  %422 = trunc i8 %421 to i1
  br i1 %422, label %423, label %428

423:                                              ; preds = %420
  %424 = load ptr, ptr %7, align 8, !tbaa !5
  %425 = load ptr, ptr %4, align 8, !tbaa !5
  %426 = load i16, ptr %24, align 2, !tbaa !9
  %427 = load i16, ptr %25, align 2, !tbaa !9
  call void @il_push_masks(ptr noundef %424, ptr noundef %425, i16 noundef zeroext %426, i16 noundef zeroext %427, ptr noundef %26, ptr noundef %27)
  br label %428

428:                                              ; preds = %423, %420
  br label %429

429:                                              ; preds = %428
  %430 = load i16, ptr %31, align 2, !tbaa !9
  %431 = add i16 %430, 1
  store i16 %431, ptr %31, align 2, !tbaa !9
  br label %272, !llvm.loop !48

432:                                              ; preds = %278
  %433 = load i16, ptr %24, align 2, !tbaa !9
  %434 = zext i16 %433 to i32
  %435 = add nsw i32 %434, 1
  %436 = trunc i32 %435 to i16
  store i16 %436, ptr %24, align 2, !tbaa !9
  store i16 0, ptr %25, align 2, !tbaa !9
  store i32 0, ptr %12, align 4
  br label %437

437:                                              ; preds = %432, %249
  call void @llvm.lifetime.end.p0(i64 2, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #4
  %438 = load i32, ptr %12, align 4
  switch i32 %438, label %466 [
    i32 0, label %439
    i32 13, label %440
  ]

439:                                              ; preds = %437
  br label %440

440:                                              ; preds = %439, %437
  %441 = load i16, ptr %28, align 2, !tbaa !9
  %442 = add i16 %441, 1
  store i16 %442, ptr %28, align 2, !tbaa !9
  br label %228, !llvm.loop !49

443:                                              ; preds = %236
  %444 = load ptr, ptr %7, align 8, !tbaa !5
  call void @il_push_op(ptr noundef %444, i32 noundef 14)
  call void @llvm.lifetime.start.p0(i64 2, ptr %32) #4
  store i16 0, ptr %32, align 2, !tbaa !9
  br label %445

445:                                              ; preds = %460, %443
  %446 = load i16, ptr %32, align 2, !tbaa !9
  %447 = zext i16 %446 to i64
  %448 = load ptr, ptr %4, align 8, !tbaa !5
  %449 = getelementptr inbounds %struct.glyf_Glyph, ptr %448, i32 0, i32 5
  %450 = getelementptr inbounds %struct.glyf_ContourList, ptr %449, i32 0, i32 0
  %451 = load i64, ptr %450, align 8, !tbaa !13
  %452 = icmp ult i64 %447, %451
  br i1 %452, label %454, label %453

453:                                              ; preds = %445
  store i32 17, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %32) #4
  br label %463

454:                                              ; preds = %445
  %455 = load ptr, ptr getelementptr inbounds (%struct.__caryll_vectorinterface_glyf_Contour, ptr @glyf_iContour, i32 0, i32 3), align 8, !tbaa !50
  %456 = load ptr, ptr %8, align 8, !tbaa !5
  %457 = load i16, ptr %32, align 2, !tbaa !9
  %458 = zext i16 %457 to i64
  %459 = getelementptr inbounds %struct.glyf_Contour, ptr %456, i64 %458
  call void %455(ptr noundef %459)
  br label %460

460:                                              ; preds = %454
  %461 = load i16, ptr %32, align 2, !tbaa !9
  %462 = add i16 %461, 1
  store i16 %462, ptr %32, align 2, !tbaa !9
  br label %445, !llvm.loop !51

463:                                              ; preds = %453
  %464 = load ptr, ptr %8, align 8, !tbaa !5
  call void @free(ptr noundef %464) #4
  store ptr null, ptr %8, align 8, !tbaa !5
  %465 = load ptr, ptr %7, align 8, !tbaa !5
  store i32 1, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 2, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 2, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 2, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 1, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 1, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #4
  ret ptr %465

466:                                              ; preds = %437
  unreachable
}

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @__caryll_allocate_clean(i64 noundef, i64 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 uwtable
declare hidden void @il_push_stems(ptr noundef, ptr noundef, i1 noundef zeroext, i1 noundef zeroext) #0

; Function Attrs: nounwind uwtable
declare hidden void @il_push_masks(ptr noundef, ptr noundef, i16 noundef zeroext, i16 noundef zeroext, ptr noundef, ptr noundef) #0

; Function Attrs: nounwind uwtable
declare hidden void @il_moveto(ptr noundef, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8) #0

; Function Attrs: nounwind uwtable
declare hidden void @il_lineto(ptr noundef, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8) #0

; Function Attrs: nounwind uwtable
declare hidden void @il_curveto(ptr noundef, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8) #0

; Function Attrs: nounwind
declare void @free(ptr noundef) #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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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 #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 }

!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 = !{!"short", !7, i64 0}
!11 = !{!12, !6, i64 64}
!12 = !{!"__caryll_vectorinterface_VQ", !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, !6, i64 128, !6, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216}
!13 = !{!14, !18, i64 136}
!14 = !{!"", !6, i64 0, !15, i64 8, !15, i64 40, !15, i64 72, !15, i64 104, !17, i64 136, !17, i64 160, !17, i64 184, !17, i64 208, !17, i64 232, !17, i64 256, !10, i64 280, !6, i64 288, !7, i64 296, !19, i64 304, !10, i64 320, !21, i64 328}
!15 = !{!"", !16, i64 0, !17, i64 8}
!16 = !{!"double", !7, i64 0}
!17 = !{!"", !18, i64 0, !18, i64 8, !6, i64 16}
!18 = !{!"long", !7, i64 0}
!19 = !{!"otfcc_Handle", !20, i64 0, !10, i64 4, !6, i64 8}
!20 = !{!"int", !7, i64 0}
!21 = !{!"", !16, i64 0, !16, i64 8, !16, i64 16, !16, i64 24, !10, i64 32, !10, i64 34, !10, i64 36, !10, i64 38, !10, i64 40}
!22 = !{!14, !6, i64 152}
!23 = !{!24, !6, i64 0}
!24 = !{!"__caryll_vectorinterface_glyf_Contour", !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, !6, i64 128, !6, i64 136, !6, i64 144}
!25 = !{!17, !18, i64 0}
!26 = !{!24, !6, i64 104}
!27 = !{!28, !6, i64 56}
!28 = !{!"__caryll_elementinterface_glyf_Point", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56}
!29 = !{!17, !6, i64 16}
!30 = distinct !{!30, !31}
!31 = !{!"llvm.loop.mustprogress"}
!32 = !{!33, !7, i64 64}
!33 = !{!"", !15, i64 0, !15, i64 32, !7, i64 64}
!34 = !{!12, !6, i64 112}
!35 = !{!12, !6, i64 40}
!36 = !{!12, !6, i64 32}
!37 = distinct !{!37, !31}
!38 = distinct !{!38, !31}
!39 = !{!12, !6, i64 24}
!40 = !{!14, !18, i64 232}
!41 = !{!14, !18, i64 256}
!42 = !{!43, !43, i64 0}
!43 = !{!"_Bool", !7, i64 0}
!44 = !{!12, !6, i64 176}
!45 = !{!16, !16, i64 0}
!46 = !{i8 0, i8 2}
!47 = !{}
!48 = distinct !{!48, !31}
!49 = distinct !{!49, !31}
!50 = !{!24, !6, i64 24}
!51 = distinct !{!51, !31}


; 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.__caryll_vectorinterface_VQ = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.__caryll_vectorinterface_glyf_Contour = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.__caryll_elementinterface_glyf_Point = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.VQ = type { double, %struct.vq_SegList }
%struct.vq_SegList = type { i64, i64, ptr }
%struct.glyf_Point = type { %struct.VQ, %struct.VQ, i8 }
%struct.glyf_Contour = type { i64, i64, ptr }

@iVQ = external local_unnamed_addr constant %struct.__caryll_vectorinterface_VQ, align 8
@glyf_iContour = external local_unnamed_addr constant %struct.__caryll_vectorinterface_glyf_Contour, align 8
@glyf_iPoint = external local_unnamed_addr constant %struct.__caryll_elementinterface_glyf_Point, align 8

; Function Attrs: nounwind uwtable
declare dso_local void @il_push_operand(ptr noundef, double noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local void @il_push_op(ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local ptr @cff_compileGlyphToIL(ptr noundef %0, i16 noundef zeroext %1, i16 noundef zeroext %2) local_unnamed_addr #0 {
  %4 = alloca %struct.VQ, align 8
  %5 = alloca %struct.VQ, align 8
  %6 = alloca %struct.glyf_Point, align 8
  %7 = alloca %struct.glyf_Point, align 8
  %8 = alloca %struct.VQ, align 8
  %9 = alloca %struct.VQ, align 8
  %10 = alloca i16, align 2
  %11 = alloca i16, align 2
  %12 = tail call ptr @__caryll_allocate_clean(i64 noundef 16, i64 noundef 143)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %4) #4
  %13 = load ptr, ptr getelementptr inbounds (i8, ptr @iVQ, i64 64), align 8, !tbaa !5
  call void (ptr, ...) %13(ptr dead_on_unwind nonnull writable sret(%struct.VQ) align 8 %4) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %5) #4
  call void (ptr, ...) %13(ptr dead_on_unwind nonnull writable sret(%struct.VQ) align 8 %5) #4
  %14 = getelementptr inbounds i8, ptr %0, i64 136
  %15 = load i64, ptr %14, align 8, !tbaa !10
  %16 = mul i64 %15, 24
  %17 = call ptr @__caryll_allocate_clean(i64 noundef %16, i64 noundef 149)
  %18 = load i64, ptr %14, align 8, !tbaa !10
  %.not166 = icmp eq i64 %18, 0
  br i1 %.not166, label %._crit_edge150, label %.lr.ph149

.lr.ph149:                                        ; preds = %3
  %19 = getelementptr inbounds i8, ptr %0, i64 152
  %20 = load ptr, ptr @glyf_iContour, align 8, !tbaa !20
  %21 = load ptr, ptr getelementptr inbounds (i8, ptr @glyf_iContour, i64 104), align 8
  %22 = load ptr, ptr getelementptr inbounds (i8, ptr @glyf_iPoint, i64 56), align 8
  %23 = load ptr, ptr getelementptr inbounds (i8, ptr @iVQ, i64 112), align 8
  %24 = load ptr, ptr getelementptr inbounds (i8, ptr @iVQ, i64 40), align 8
  %25 = load ptr, ptr getelementptr inbounds (i8, ptr @iVQ, i64 32), align 8
  br label %29

._crit_edge150:                                   ; preds = %._crit_edge146, %3
  %26 = load ptr, ptr getelementptr inbounds (i8, ptr @iVQ, i64 24), align 8, !tbaa !22
  call void %26(ptr noundef nonnull %4) #4
  call void %26(ptr noundef nonnull %5) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %5) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %4) #4
  %27 = getelementptr inbounds i8, ptr %0, i64 232
  %28 = load i64, ptr %27, align 8, !tbaa !23
  %.not = icmp eq i64 %28, 0
  br i1 %.not, label %78, label %82

29:                                               ; preds = %.lr.ph149, %._crit_edge146
  %30 = phi i64 [ 0, %.lr.ph149 ], [ %57, %._crit_edge146 ]
  %.0121147 = phi i16 [ 0, %.lr.ph149 ], [ %56, %._crit_edge146 ]
  %31 = load ptr, ptr %19, align 8, !tbaa !24
  %32 = getelementptr inbounds %struct.glyf_Contour, ptr %31, i64 %30
  %33 = getelementptr inbounds %struct.glyf_Contour, ptr %17, i64 %30
  call void %20(ptr noundef %33) #4
  %34 = load i64, ptr %32, align 8, !tbaa !25
  %.not167 = icmp eq i64 %34, 0
  br i1 %.not167, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %29
  %35 = getelementptr inbounds i8, ptr %32, i64 16
  br label %38

._crit_edge:                                      ; preds = %38, %29
  %36 = load i64, ptr %33, align 8, !tbaa !25
  %37 = icmp ugt i64 %36, 2
  br i1 %37, label %46, label %53

38:                                               ; preds = %.lr.ph, %38
  %39 = phi i64 [ 0, %.lr.ph ], [ %43, %38 ]
  %.0127142 = phi i16 [ 0, %.lr.ph ], [ %42, %38 ]
  %40 = load ptr, ptr %35, align 8, !tbaa !26
  %41 = getelementptr inbounds %struct.glyf_Point, ptr %40, i64 %39
  call void %22(ptr dead_on_unwind nonnull writable sret(%struct.glyf_Point) align 8 %6, ptr noundef byval(%struct.glyf_Point) align 8 %41) #4
  call void %21(ptr noundef %33, ptr noundef nonnull byval(%struct.glyf_Point) align 8 %6) #4
  %42 = add i16 %.0127142, 1
  %43 = zext i16 %42 to i64
  %44 = load i64, ptr %32, align 8, !tbaa !25
  %45 = icmp ugt i64 %44, %43
  br i1 %45, label %38, label %._crit_edge, !llvm.loop !27

46:                                               ; preds = %._crit_edge
  %47 = getelementptr inbounds i8, ptr %33, i64 16
  %48 = load ptr, ptr %47, align 8, !tbaa !26
  %49 = getelementptr %struct.glyf_Point, ptr %48, i64 %36
  %50 = getelementptr i8, ptr %49, i64 -8
  %51 = load i8, ptr %50, align 8, !tbaa !29
  %.not141 = icmp eq i8 %51, 0
  br i1 %.not141, label %52, label %.lr.ph145

52:                                               ; preds = %46
  call void %22(ptr dead_on_unwind nonnull writable sret(%struct.glyf_Point) align 8 %7, ptr noundef nonnull byval(%struct.glyf_Point) align 8 %48) #4
  call void %21(ptr noundef nonnull %33, ptr noundef nonnull byval(%struct.glyf_Point) align 8 %7) #4
  %.pre = load i64, ptr %33, align 8, !tbaa !25
  br label %53

53:                                               ; preds = %52, %._crit_edge
  %54 = phi i64 [ %.pre, %52 ], [ %36, %._crit_edge ]
  %.not168 = icmp eq i64 %54, 0
  br i1 %.not168, label %._crit_edge146, label %.lr.ph145

.lr.ph145:                                        ; preds = %46, %53
  %55 = getelementptr inbounds i8, ptr %33, i64 16
  br label %60

._crit_edge146:                                   ; preds = %60, %53
  %56 = add i16 %.0121147, 1
  %57 = zext i16 %56 to i64
  %58 = load i64, ptr %14, align 8, !tbaa !10
  %59 = icmp ugt i64 %58, %57
  br i1 %59, label %29, label %._crit_edge150, !llvm.loop !31

60:                                               ; preds = %.lr.ph145, %60
  %61 = phi i64 [ 0, %.lr.ph145 ], [ %75, %60 ]
  %.0128143 = phi i16 [ 0, %.lr.ph145 ], [ %74, %60 ]
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %8) #4
  %62 = load ptr, ptr %55, align 8, !tbaa !26
  %63 = getelementptr inbounds %struct.glyf_Point, ptr %62, i64 %61
  call void %23(ptr dead_on_unwind nonnull writable sret(%struct.VQ) align 8 %8, ptr noundef byval(%struct.VQ) align 8 %63, ptr noundef nonnull byval(%struct.VQ) align 8 %4) #4
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %9) #4
  %64 = load ptr, ptr %55, align 8, !tbaa !26
  %65 = getelementptr inbounds %struct.glyf_Point, ptr %64, i64 %61, i32 1
  call void %23(ptr dead_on_unwind nonnull writable sret(%struct.VQ) align 8 %9, ptr noundef nonnull byval(%struct.VQ) align 8 %65, ptr noundef nonnull byval(%struct.VQ) align 8 %5) #4
  %66 = load ptr, ptr %55, align 8, !tbaa !26
  %67 = getelementptr inbounds %struct.glyf_Point, ptr %66, i64 %61
  call void %24(ptr noundef nonnull %4, ptr noundef byval(%struct.VQ) align 8 %67) #4
  %68 = load ptr, ptr %55, align 8, !tbaa !26
  %69 = getelementptr inbounds %struct.glyf_Point, ptr %68, i64 %61, i32 1
  call void %24(ptr noundef nonnull %5, ptr noundef nonnull byval(%struct.VQ) align 8 %69) #4
  %70 = load ptr, ptr %55, align 8, !tbaa !26
  %71 = getelementptr inbounds %struct.glyf_Point, ptr %70, i64 %61
  call void %25(ptr noundef %71, ptr noundef nonnull byval(%struct.VQ) align 8 %8) #4
  %72 = load ptr, ptr %55, align 8, !tbaa !26
  %73 = getelementptr inbounds %struct.glyf_Point, ptr %72, i64 %61, i32 1
  call void %25(ptr noundef nonnull %73, ptr noundef nonnull byval(%struct.VQ) align 8 %9) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %9) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %8) #4
  %74 = add i16 %.0128143, 1
  %75 = zext i16 %74 to i64
  %76 = load i64, ptr %33, align 8, !tbaa !25
  %77 = icmp ugt i64 %76, %75
  br i1 %77, label %60, label %._crit_edge146, !llvm.loop !32

78:                                               ; preds = %._crit_edge150
  %79 = getelementptr inbounds i8, ptr %0, i64 256
  %80 = load i64, ptr %79, align 8, !tbaa !33
  %81 = icmp ne i64 %80, 0
  br label %82

82:                                               ; preds = %78, %._crit_edge150
  %83 = phi i1 [ true, %._crit_edge150 ], [ %81, %78 ]
  %84 = load ptr, ptr getelementptr inbounds (i8, ptr @iVQ, i64 176), align 8, !tbaa !34
  %85 = getelementptr inbounds i8, ptr %0, i64 40
  %86 = call double %84(ptr noundef nonnull byval(%struct.VQ) align 8 %85) #4
  %87 = uitofp i16 %1 to double
  %88 = fcmp une double %86, %87
  br i1 %88, label %89, label %94

89:                                               ; preds = %82
  %90 = fptosi double %86 to i32
  %91 = zext i16 %2 to i32
  %92 = sub nsw i32 %90, %91
  %93 = sitofp i32 %92 to double
  call void @il_push_operand(ptr noundef %12, double noundef %93)
  br label %94

94:                                               ; preds = %89, %82
  call void @il_push_stems(ptr noundef %12, ptr noundef nonnull %0, i1 noundef zeroext %83, i1 noundef zeroext %88)
  call void @llvm.lifetime.start.p0(i64 2, ptr nonnull %10) #4
  store i16 0, ptr %10, align 2, !tbaa !35
  call void @llvm.lifetime.start.p0(i64 2, ptr nonnull %11) #4
  store i16 0, ptr %11, align 2, !tbaa !35
  br i1 %83, label %95, label %.thread177

95:                                               ; preds = %94
  call void @il_push_masks(ptr noundef %12, ptr noundef nonnull %0, i16 noundef zeroext 0, i16 noundef zeroext 0, ptr noundef nonnull %10, ptr noundef nonnull %11)
  %96 = load i64, ptr %14, align 8, !tbaa !10
  %.not169 = icmp eq i64 %96, 0
  br i1 %.not169, label %._crit_edge161, label %.lr.ph160.split.us

.thread177:                                       ; preds = %94
  %97 = load i64, ptr %14, align 8, !tbaa !10
  %.not169178 = icmp eq i64 %97, 0
  br i1 %.not169178, label %._crit_edge161, label %.lr.ph160.split

.lr.ph160.split.us:                               ; preds = %95, %110
  %98 = phi i64 [ %111, %110 ], [ %96, %95 ]
  %99 = phi i64 [ %113, %110 ], [ 0, %95 ]
  %.0122158.us = phi i16 [ %112, %110 ], [ 0, %95 ]
  %.0125156.us = phi i16 [ %.1126.us, %110 ], [ 0, %95 ]
  %100 = getelementptr inbounds %struct.glyf_Contour, ptr %17, i64 %99
  %101 = load i64, ptr %100, align 8, !tbaa !25
  %102 = trunc i64 %101 to i32
  %103 = and i32 %102, 65535
  %104 = icmp eq i32 %103, 0
  br i1 %104, label %110, label %105

105:                                              ; preds = %.lr.ph160.split.us
  %106 = getelementptr inbounds i8, ptr %100, i64 16
  %107 = load ptr, ptr %106, align 8, !tbaa !26
  %108 = getelementptr inbounds i8, ptr %107, i64 32
  call void @il_moveto(ptr noundef %12, ptr noundef byval(%struct.VQ) align 8 %107, ptr noundef nonnull byval(%struct.VQ) align 8 %108)
  call void @il_push_masks(ptr noundef %12, ptr noundef nonnull %0, i16 noundef zeroext %.0125156.us, i16 noundef zeroext 1, ptr noundef nonnull %10, ptr noundef nonnull %11)
  %.not171 = icmp eq i32 %103, 1
  br i1 %.not171, label %._crit_edge155.split.us.us, label %.lr.ph154.us

._crit_edge155.split.us.us:                       ; preds = %147, %105
  %109 = add i16 %.0125156.us, 1
  %.pre175 = load i64, ptr %14, align 8, !tbaa !10
  br label %110

110:                                              ; preds = %._crit_edge155.split.us.us, %.lr.ph160.split.us
  %111 = phi i64 [ %.pre175, %._crit_edge155.split.us.us ], [ %98, %.lr.ph160.split.us ]
  %.1126.us = phi i16 [ %109, %._crit_edge155.split.us.us ], [ %.0125156.us, %.lr.ph160.split.us ]
  %112 = add i16 %.0122158.us, 1
  %113 = zext i16 %112 to i64
  %114 = icmp ugt i64 %111, %113
  br i1 %114, label %.lr.ph160.split.us, label %._crit_edge161, !llvm.loop !36

.lr.ph154.us:                                     ; preds = %105
  %115 = add nsw i32 %103, -2
  br label %116

116:                                              ; preds = %147, %.lr.ph154.us
  %117 = phi i32 [ 1, %.lr.ph154.us ], [ %149, %147 ]
  %.0120152.us.us = phi i16 [ 1, %.lr.ph154.us ], [ %148, %147 ]
  %.1124151.us.us = phi i16 [ 1, %.lr.ph154.us ], [ %.2.us.us, %147 ]
  %118 = load ptr, ptr %106, align 8, !tbaa !26
  %119 = zext i16 %.0120152.us.us to i64
  %120 = getelementptr inbounds %struct.glyf_Point, ptr %118, i64 %119
  %121 = getelementptr inbounds i8, ptr %120, i64 64
  %122 = load i8, ptr %121, align 8, !tbaa !29
  %.not138.us.us = icmp eq i8 %122, 0
  br i1 %.not138.us.us, label %126, label %123

123:                                              ; preds = %116
  %124 = getelementptr inbounds i8, ptr %120, i64 32
  call void @il_lineto(ptr noundef %12, ptr noundef nonnull byval(%struct.VQ) align 8 %120, ptr noundef nonnull byval(%struct.VQ) align 8 %124)
  %125 = add i16 %.1124151.us.us, 1
  br label %147

126:                                              ; preds = %116
  %127 = icmp sgt i32 %115, %117
  br i1 %127, label %128, label %144

128:                                              ; preds = %126
  %129 = getelementptr inbounds i8, ptr %120, i64 72
  %130 = getelementptr inbounds i8, ptr %120, i64 136
  %131 = load i8, ptr %130, align 8, !tbaa !29
  %.not139.us.us = icmp eq i8 %131, 0
  br i1 %.not139.us.us, label %132, label %144

132:                                              ; preds = %128
  %133 = add nuw nsw i32 %117, 2
  %134 = zext nneg i32 %133 to i64
  %135 = getelementptr inbounds %struct.glyf_Point, ptr %118, i64 %134
  %136 = getelementptr inbounds i8, ptr %135, i64 64
  %137 = load i8, ptr %136, align 8, !tbaa !29
  %.not140.us.us = icmp eq i8 %137, 0
  br i1 %.not140.us.us, label %144, label %138

138:                                              ; preds = %132
  %139 = getelementptr inbounds i8, ptr %120, i64 32
  %140 = getelementptr inbounds i8, ptr %120, i64 104
  %141 = getelementptr inbounds i8, ptr %135, i64 32
  call void @il_curveto(ptr noundef %12, ptr noundef nonnull byval(%struct.VQ) align 8 %120, ptr noundef nonnull byval(%struct.VQ) align 8 %139, ptr noundef nonnull byval(%struct.VQ) align 8 %129, ptr noundef nonnull byval(%struct.VQ) align 8 %140, ptr noundef nonnull byval(%struct.VQ) align 8 %135, ptr noundef nonnull byval(%struct.VQ) align 8 %141)
  %142 = add i16 %.1124151.us.us, 3
  %143 = trunc nuw i32 %133 to i16
  br label %147

144:                                              ; preds = %132, %128, %126
  %145 = getelementptr inbounds i8, ptr %120, i64 32
  call void @il_lineto(ptr noundef %12, ptr noundef nonnull byval(%struct.VQ) align 8 %120, ptr noundef nonnull byval(%struct.VQ) align 8 %145)
  %146 = add i16 %.1124151.us.us, 1
  br label %147

147:                                              ; preds = %144, %138, %123
  %.2.us.us = phi i16 [ %125, %123 ], [ %146, %144 ], [ %142, %138 ]
  %.1.us.us = phi i16 [ %.0120152.us.us, %123 ], [ %.0120152.us.us, %144 ], [ %143, %138 ]
  call void @il_push_masks(ptr noundef %12, ptr noundef %0, i16 noundef zeroext %.0125156.us, i16 noundef zeroext %.2.us.us, ptr noundef nonnull %10, ptr noundef nonnull %11)
  %148 = add i16 %.1.us.us, 1
  %149 = zext i16 %148 to i32
  %150 = icmp ugt i32 %103, %149
  br i1 %150, label %116, label %._crit_edge155.split.us.us, !llvm.loop !37

._crit_edge161:                                   ; preds = %197, %110, %.thread177, %95
  call void @il_push_op(ptr noundef %12, i32 noundef 14)
  %151 = load i64, ptr %14, align 8, !tbaa !10
  %.not172 = icmp eq i64 %151, 0
  br i1 %.not172, label %._crit_edge165, label %.lr.ph164

.lr.ph164:                                        ; preds = %._crit_edge161
  %152 = load ptr, ptr getelementptr inbounds (i8, ptr @glyf_iContour, i64 24), align 8, !tbaa !38
  br label %202

.lr.ph160.split:                                  ; preds = %.thread177, %197
  %153 = phi i64 [ %198, %197 ], [ %97, %.thread177 ]
  %154 = phi i64 [ %200, %197 ], [ 0, %.thread177 ]
  %.0122158 = phi i16 [ %199, %197 ], [ 0, %.thread177 ]
  %155 = getelementptr inbounds %struct.glyf_Contour, ptr %17, i64 %154
  %156 = load i64, ptr %155, align 8, !tbaa !25
  %157 = trunc i64 %156 to i32
  %158 = and i32 %157, 65535
  %159 = icmp eq i32 %158, 0
  br i1 %159, label %197, label %160

160:                                              ; preds = %.lr.ph160.split
  %161 = getelementptr inbounds i8, ptr %155, i64 16
  %162 = load ptr, ptr %161, align 8, !tbaa !26
  %163 = getelementptr inbounds i8, ptr %162, i64 32
  call void @il_moveto(ptr noundef %12, ptr noundef byval(%struct.VQ) align 8 %162, ptr noundef nonnull byval(%struct.VQ) align 8 %163)
  %.not170 = icmp eq i32 %158, 1
  br i1 %.not170, label %._crit_edge155.split, label %.lr.ph154

.lr.ph154:                                        ; preds = %160
  %164 = add nsw i32 %158, -2
  br label %165

._crit_edge155.split:                             ; preds = %193, %160
  %.pre174 = load i64, ptr %14, align 8, !tbaa !10
  br label %197

165:                                              ; preds = %.lr.ph154, %193
  %166 = phi i32 [ 1, %.lr.ph154 ], [ %195, %193 ]
  %.0120152 = phi i16 [ 1, %.lr.ph154 ], [ %194, %193 ]
  %167 = load ptr, ptr %161, align 8, !tbaa !26
  %168 = zext i16 %.0120152 to i64
  %169 = getelementptr inbounds %struct.glyf_Point, ptr %167, i64 %168
  %170 = getelementptr inbounds i8, ptr %169, i64 64
  %171 = load i8, ptr %170, align 8, !tbaa !29
  %.not138 = icmp eq i8 %171, 0
  br i1 %.not138, label %174, label %172

172:                                              ; preds = %165
  %173 = getelementptr inbounds i8, ptr %169, i64 32
  call void @il_lineto(ptr noundef %12, ptr noundef nonnull byval(%struct.VQ) align 8 %169, ptr noundef nonnull byval(%struct.VQ) align 8 %173)
  br label %193

174:                                              ; preds = %165
  %175 = icmp sgt i32 %164, %166
  br i1 %175, label %176, label %191

176:                                              ; preds = %174
  %177 = getelementptr inbounds i8, ptr %169, i64 72
  %178 = getelementptr inbounds i8, ptr %169, i64 136
  %179 = load i8, ptr %178, align 8, !tbaa !29
  %.not139 = icmp eq i8 %179, 0
  br i1 %.not139, label %180, label %191

180:                                              ; preds = %176
  %181 = add nuw nsw i32 %166, 2
  %182 = zext nneg i32 %181 to i64
  %183 = getelementptr inbounds %struct.glyf_Point, ptr %167, i64 %182
  %184 = getelementptr inbounds i8, ptr %183, i64 64
  %185 = load i8, ptr %184, align 8, !tbaa !29
  %.not140 = icmp eq i8 %185, 0
  br i1 %.not140, label %191, label %186

186:                                              ; preds = %180
  %187 = getelementptr inbounds i8, ptr %169, i64 32
  %188 = getelementptr inbounds i8, ptr %169, i64 104
  %189 = getelementptr inbounds i8, ptr %183, i64 32
  call void @il_curveto(ptr noundef %12, ptr noundef nonnull byval(%struct.VQ) align 8 %169, ptr noundef nonnull byval(%struct.VQ) align 8 %187, ptr noundef nonnull byval(%struct.VQ) align 8 %177, ptr noundef nonnull byval(%struct.VQ) align 8 %188, ptr noundef nonnull byval(%struct.VQ) align 8 %183, ptr noundef nonnull byval(%struct.VQ) align 8 %189)
  %190 = trunc nuw i32 %181 to i16
  br label %193

191:                                              ; preds = %180, %176, %174
  %192 = getelementptr inbounds i8, ptr %169, i64 32
  call void @il_lineto(ptr noundef %12, ptr noundef nonnull byval(%struct.VQ) align 8 %169, ptr noundef nonnull byval(%struct.VQ) align 8 %192)
  br label %193

193:                                              ; preds = %186, %191, %172
  %.1 = phi i16 [ %.0120152, %172 ], [ %.0120152, %191 ], [ %190, %186 ]
  %194 = add i16 %.1, 1
  %195 = zext i16 %194 to i32
  %196 = icmp ugt i32 %158, %195
  br i1 %196, label %165, label %._crit_edge155.split, !llvm.loop !37

197:                                              ; preds = %.lr.ph160.split, %._crit_edge155.split
  %198 = phi i64 [ %.pre174, %._crit_edge155.split ], [ %153, %.lr.ph160.split ]
  %199 = add i16 %.0122158, 1
  %200 = zext i16 %199 to i64
  %201 = icmp ugt i64 %198, %200
  br i1 %201, label %.lr.ph160.split, label %._crit_edge161, !llvm.loop !36

._crit_edge165:                                   ; preds = %202, %._crit_edge161
  call void @free(ptr noundef %17) #4
  call void @llvm.lifetime.end.p0(i64 2, ptr nonnull %11) #4
  call void @llvm.lifetime.end.p0(i64 2, ptr nonnull %10) #4
  ret ptr %12

202:                                              ; preds = %.lr.ph164, %202
  %203 = phi i64 [ 0, %.lr.ph164 ], [ %206, %202 ]
  %.0162 = phi i16 [ 0, %.lr.ph164 ], [ %205, %202 ]
  %204 = getelementptr inbounds %struct.glyf_Contour, ptr %17, i64 %203
  call void %152(ptr noundef %204) #4
  %205 = add i16 %.0162, 1
  %206 = zext i16 %205 to i64
  %207 = load i64, ptr %14, align 8, !tbaa !10
  %208 = icmp ugt i64 %207, %206
  br i1 %208, label %202, label %._crit_edge165, !llvm.loop !39
}

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

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

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

; Function Attrs: nounwind uwtable
declare hidden void @il_push_stems(ptr noundef, ptr noundef, i1 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden void @il_push_masks(ptr noundef, ptr noundef, i16 noundef zeroext, i16 noundef zeroext, ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden void @il_moveto(ptr noundef, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden void @il_lineto(ptr noundef, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden void @il_curveto(ptr noundef, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8, ptr noundef byval(%struct.VQ) align 8) 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 #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 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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 #3 = { 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 #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, !7, i64 64}
!6 = !{!"__caryll_vectorinterface_VQ", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !7, i64 120, !7, i64 128, !7, i64 136, !7, i64 144, !7, i64 152, !7, i64 160, !7, i64 168, !7, i64 176, !7, i64 184, !7, i64 192, !7, i64 200, !7, i64 208, !7, i64 216}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!11, !15, i64 136}
!11 = !{!"", !7, i64 0, !12, i64 8, !12, i64 40, !12, i64 72, !12, i64 104, !14, i64 136, !14, i64 160, !14, i64 184, !14, i64 208, !14, i64 232, !14, i64 256, !16, i64 280, !7, i64 288, !8, i64 296, !17, i64 304, !16, i64 320, !19, i64 328}
!12 = !{!"", !13, i64 0, !14, i64 8}
!13 = !{!"double", !8, i64 0}
!14 = !{!"", !15, i64 0, !15, i64 8, !7, i64 16}
!15 = !{!"long", !8, i64 0}
!16 = !{!"short", !8, i64 0}
!17 = !{!"otfcc_Handle", !18, i64 0, !16, i64 4, !7, i64 8}
!18 = !{!"int", !8, i64 0}
!19 = !{!"", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24, !16, i64 32, !16, i64 34, !16, i64 36, !16, i64 38, !16, i64 40}
!20 = !{!21, !7, i64 0}
!21 = !{!"__caryll_vectorinterface_glyf_Contour", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !7, i64 120, !7, i64 128, !7, i64 136, !7, i64 144}
!22 = !{!6, !7, i64 24}
!23 = !{!11, !15, i64 232}
!24 = !{!11, !7, i64 152}
!25 = !{!14, !15, i64 0}
!26 = !{!14, !7, i64 16}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}
!29 = !{!30, !8, i64 64}
!30 = !{!"", !12, i64 0, !12, i64 32, !8, i64 64}
!31 = distinct !{!31, !28}
!32 = distinct !{!32, !28}
!33 = !{!11, !15, i64 256}
!34 = !{!6, !7, i64 176}
!35 = !{!16, !16, i64 0}
!36 = distinct !{!36, !28}
!37 = distinct !{!37, !28}
!38 = !{!21, !7, i64 24}
!39 = distinct !{!39, !28}


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