; LLVM IR from jingweizhanghuai/Morn :: src/image (morn_image_geometry2)

; 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.MList = type { i32, ptr }
%struct.MImagePoint = type { float, float }
%struct.MChainNode = type { ptr, ptr, ptr }
%struct.MObject = type { i32, %union.anon }
%union.anon = type { ptr }

@.str = external hidden unnamed_addr constant [88 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [14 x i8], align 1
@__FUNCTION__.mConvexHull = external hidden unnamed_addr constant [12 x i8], align 1

; 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 speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #1

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

declare void @m_Exception(i32 noundef, i32 noundef, ptr noundef, i32 noundef, ptr noundef, ptr noundef, ...) #2

declare ptr @ListCreate(i32 noundef, ptr noundef) #2

declare ptr @mListWrite(ptr noundef, i32 noundef, ptr noundef, i32 noundef) #2

declare void @mListRelease(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local void @ConvexHull(ptr noundef, ptr noundef, ptr noundef) #3

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

declare ptr @mChainNode(ptr noundef, ptr noundef, i32 noundef) #2

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

; Function Attrs: nounwind uwtable
define dso_local void @mConvexHull(ptr noundef %0, ptr noundef %1) #3 {
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca float, align 4
  %11 = alloca float, align 4
  %12 = alloca float, align 4
  %13 = alloca float, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca double, align 8
  %19 = alloca double, align 8
  %20 = alloca double, align 8
  %21 = alloca double, align 8
  %22 = alloca double, align 8
  %23 = alloca double, align 8
  %24 = alloca double, align 8
  %25 = alloca double, align 8
  %26 = alloca double, align 8
  %27 = alloca double, align 8
  %28 = alloca double, align 8
  %29 = alloca double, align 8
  %30 = alloca ptr, align 8
  %31 = alloca i32, align 4
  %32 = alloca ptr, align 8
  %33 = alloca i32, align 4
  %34 = alloca ptr, align 8
  %35 = alloca i32, align 4
  %36 = alloca ptr, align 8
  %37 = alloca i32, align 4
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca ptr, align 8
  %41 = alloca ptr, align 8
  %42 = alloca ptr, align 8
  %43 = alloca ptr, align 8
  %44 = alloca %struct.MList, align 8
  store ptr %0, ptr %3, align 8, !tbaa !5
  store ptr %1, ptr %4, align 8, !tbaa !5
  br label %45

45:                                               ; preds = %2
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #5
  %46 = load ptr, ptr %3, align 8, !tbaa !5
  %47 = icmp eq ptr %46, null
  br i1 %47, label %52, label %48

48:                                               ; preds = %45
  %49 = load ptr, ptr %3, align 8, !tbaa !5
  %50 = ptrtoint ptr %49 to i64
  %51 = icmp eq i64 %50, -1
  br label %52

52:                                               ; preds = %48, %45
  %53 = phi i1 [ true, %45 ], [ %51, %48 ]
  %54 = zext i1 %53 to i32
  store i32 %54, ptr %5, align 4, !tbaa !9
  %55 = load i32, ptr %5, align 4, !tbaa !9
  %56 = icmp ne i32 %55, 0
  br i1 %56, label %57, label %59

57:                                               ; preds = %52
  %58 = load i32, ptr %5, align 4, !tbaa !9
  call void (i32, i32, ptr, i32, ptr, ptr, ...) @m_Exception(i32 noundef %58, i32 noundef -1, ptr noundef @.str, i32 noundef 614, ptr noundef @__FUNCTION__.mConvexHull, ptr noundef @.str.1)
  br label %59

59:                                               ; preds = %57, %52
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #5
  br label %60

60:                                               ; preds = %59
  br label %61

61:                                               ; preds = %60
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #5
  %62 = load ptr, ptr %3, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.MList, ptr %62, i32 0, i32 0
  %64 = load i32, ptr %63, align 8, !tbaa !11
  %65 = icmp slt i32 %64, 3
  %66 = zext i1 %65 to i32
  store i32 %66, ptr %6, align 4, !tbaa !9
  %67 = load i32, ptr %6, align 4, !tbaa !9
  %68 = icmp ne i32 %67, 0
  br i1 %68, label %69, label %71

69:                                               ; preds = %61
  %70 = load i32, ptr %6, align 4, !tbaa !9
  call void (i32, i32, ptr, i32, ptr, ptr, ...) @m_Exception(i32 noundef %70, i32 noundef -1, ptr noundef @.str, i32 noundef 615, ptr noundef @__FUNCTION__.mConvexHull, ptr noundef @.str.1)
  br label %71

71:                                               ; preds = %69, %61
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #5
  br label %72

72:                                               ; preds = %71
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #5
  %73 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %73, ptr %7, align 8, !tbaa !5
  %74 = load ptr, ptr %4, align 8, !tbaa !5
  %75 = icmp eq ptr %74, null
  br i1 %75, label %80, label %76

76:                                               ; preds = %72
  %77 = load ptr, ptr %4, align 8, !tbaa !5
  %78 = load ptr, ptr %3, align 8, !tbaa !5
  %79 = icmp eq ptr %77, %78
  br i1 %79, label %80, label %82

80:                                               ; preds = %76, %72
  %81 = call ptr @ListCreate(i32 noundef -1, ptr noundef null)
  store ptr %81, ptr %4, align 8, !tbaa !5
  br label %82

82:                                               ; preds = %80, %76
  %83 = load ptr, ptr %4, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.MList, ptr %83, i32 0, i32 0
  store i32 0, ptr %84, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #5
  %85 = load ptr, ptr %3, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.MList, ptr %85, i32 0, i32 1
  %87 = load ptr, ptr %86, align 8, !tbaa !13
  store ptr %87, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #5
  %88 = load ptr, ptr %8, align 8, !tbaa !5
  %89 = getelementptr inbounds ptr, ptr %88, i64 0
  %90 = load ptr, ptr %89, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.MImagePoint, ptr %90, i32 0, i32 0
  %92 = load float, ptr %91, align 4, !tbaa !14
  store float %92, ptr %10, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #5
  %93 = load float, ptr %10, align 4, !tbaa !17
  store float %93, ptr %11, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  %94 = load ptr, ptr %8, align 8, !tbaa !5
  %95 = getelementptr inbounds ptr, ptr %94, i64 0
  %96 = load ptr, ptr %95, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.MImagePoint, ptr %96, i32 0, i32 1
  %98 = load float, ptr %97, align 4, !tbaa !18
  store float %98, ptr %12, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #5
  %99 = load float, ptr %12, align 4, !tbaa !17
  store float %99, ptr %13, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  store i32 0, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #5
  store i32 0, ptr %15, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #5
  store i32 0, ptr %16, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #5
  store i32 0, ptr %17, align 4, !tbaa !9
  store i32 1, ptr %9, align 4, !tbaa !9
  br label %100

100:                                              ; preds = %185, %82
  %101 = load i32, ptr %9, align 4, !tbaa !9
  %102 = load ptr, ptr %3, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct.MList, ptr %102, i32 0, i32 0
  %104 = load i32, ptr %103, align 8, !tbaa !11
  %105 = icmp slt i32 %101, %104
  br i1 %105, label %106, label %188

106:                                              ; preds = %100
  %107 = load ptr, ptr %8, align 8, !tbaa !5
  %108 = load i32, ptr %9, align 4, !tbaa !9
  %109 = sext i32 %108 to i64
  %110 = getelementptr inbounds ptr, ptr %107, i64 %109
  %111 = load ptr, ptr %110, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.MImagePoint, ptr %111, i32 0, i32 0
  %113 = load float, ptr %112, align 4, !tbaa !14
  %114 = load float, ptr %10, align 4, !tbaa !17
  %115 = fcmp ogt float %113, %114
  br i1 %115, label %116, label %125

116:                                              ; preds = %106
  %117 = load ptr, ptr %8, align 8, !tbaa !5
  %118 = load i32, ptr %9, align 4, !tbaa !9
  %119 = sext i32 %118 to i64
  %120 = getelementptr inbounds ptr, ptr %117, i64 %119
  %121 = load ptr, ptr %120, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.MImagePoint, ptr %121, i32 0, i32 0
  %123 = load float, ptr %122, align 4, !tbaa !14
  store float %123, ptr %10, align 4, !tbaa !17
  %124 = load i32, ptr %9, align 4, !tbaa !9
  store i32 %124, ptr %14, align 4, !tbaa !9
  br label %145

125:                                              ; preds = %106
  %126 = load ptr, ptr %8, align 8, !tbaa !5
  %127 = load i32, ptr %9, align 4, !tbaa !9
  %128 = sext i32 %127 to i64
  %129 = getelementptr inbounds ptr, ptr %126, i64 %128
  %130 = load ptr, ptr %129, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.MImagePoint, ptr %130, i32 0, i32 0
  %132 = load float, ptr %131, align 4, !tbaa !14
  %133 = load float, ptr %11, align 4, !tbaa !17
  %134 = fcmp olt float %132, %133
  br i1 %134, label %135, label %144

135:                                              ; preds = %125
  %136 = load ptr, ptr %8, align 8, !tbaa !5
  %137 = load i32, ptr %9, align 4, !tbaa !9
  %138 = sext i32 %137 to i64
  %139 = getelementptr inbounds ptr, ptr %136, i64 %138
  %140 = load ptr, ptr %139, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct.MImagePoint, ptr %140, i32 0, i32 0
  %142 = load float, ptr %141, align 4, !tbaa !14
  store float %142, ptr %11, align 4, !tbaa !17
  %143 = load i32, ptr %9, align 4, !tbaa !9
  store i32 %143, ptr %16, align 4, !tbaa !9
  br label %144

144:                                              ; preds = %135, %125
  br label %145

145:                                              ; preds = %144, %116
  %146 = load ptr, ptr %8, align 8, !tbaa !5
  %147 = load i32, ptr %9, align 4, !tbaa !9
  %148 = sext i32 %147 to i64
  %149 = getelementptr inbounds ptr, ptr %146, i64 %148
  %150 = load ptr, ptr %149, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.MImagePoint, ptr %150, i32 0, i32 1
  %152 = load float, ptr %151, align 4, !tbaa !18
  %153 = load float, ptr %12, align 4, !tbaa !17
  %154 = fcmp ogt float %152, %153
  br i1 %154, label %155, label %164

155:                                              ; preds = %145
  %156 = load ptr, ptr %8, align 8, !tbaa !5
  %157 = load i32, ptr %9, align 4, !tbaa !9
  %158 = sext i32 %157 to i64
  %159 = getelementptr inbounds ptr, ptr %156, i64 %158
  %160 = load ptr, ptr %159, align 8, !tbaa !5
  %161 = getelementptr inbounds %struct.MImagePoint, ptr %160, i32 0, i32 1
  %162 = load float, ptr %161, align 4, !tbaa !18
  store float %162, ptr %12, align 4, !tbaa !17
  %163 = load i32, ptr %9, align 4, !tbaa !9
  store i32 %163, ptr %15, align 4, !tbaa !9
  br label %184

164:                                              ; preds = %145
  %165 = load ptr, ptr %8, align 8, !tbaa !5
  %166 = load i32, ptr %9, align 4, !tbaa !9
  %167 = sext i32 %166 to i64
  %168 = getelementptr inbounds ptr, ptr %165, i64 %167
  %169 = load ptr, ptr %168, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.MImagePoint, ptr %169, i32 0, i32 1
  %171 = load float, ptr %170, align 4, !tbaa !18
  %172 = load float, ptr %13, align 4, !tbaa !17
  %173 = fcmp olt float %171, %172
  br i1 %173, label %174, label %183

174:                                              ; preds = %164
  %175 = load ptr, ptr %8, align 8, !tbaa !5
  %176 = load i32, ptr %9, align 4, !tbaa !9
  %177 = sext i32 %176 to i64
  %178 = getelementptr inbounds ptr, ptr %175, i64 %177
  %179 = load ptr, ptr %178, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.MImagePoint, ptr %179, i32 0, i32 1
  %181 = load float, ptr %180, align 4, !tbaa !18
  store float %181, ptr %13, align 4, !tbaa !17
  %182 = load i32, ptr %9, align 4, !tbaa !9
  store i32 %182, ptr %17, align 4, !tbaa !9
  br label %183

183:                                              ; preds = %174, %164
  br label %184

184:                                              ; preds = %183, %155
  br label %185

185:                                              ; preds = %184
  %186 = load i32, ptr %9, align 4, !tbaa !9
  %187 = add nsw i32 %186, 1
  store i32 %187, ptr %9, align 4, !tbaa !9
  br label %100, !llvm.loop !19

188:                                              ; preds = %100
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  store double 0.000000e+00, ptr %18, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #5
  store double 0.000000e+00, ptr %19, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #5
  store double 0.000000e+00, ptr %20, align 8, !tbaa !21
  %189 = load i32, ptr %14, align 4, !tbaa !9
  %190 = load i32, ptr %15, align 4, !tbaa !9
  %191 = icmp ne i32 %189, %190
  br i1 %191, label %192, label %246

192:                                              ; preds = %188
  %193 = load ptr, ptr %8, align 8, !tbaa !5
  %194 = load i32, ptr %14, align 4, !tbaa !9
  %195 = sext i32 %194 to i64
  %196 = getelementptr inbounds ptr, ptr %193, i64 %195
  %197 = load ptr, ptr %196, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct.MImagePoint, ptr %197, i32 0, i32 0
  %199 = load float, ptr %198, align 4, !tbaa !14
  %200 = load ptr, ptr %8, align 8, !tbaa !5
  %201 = load i32, ptr %15, align 4, !tbaa !9
  %202 = sext i32 %201 to i64
  %203 = getelementptr inbounds ptr, ptr %200, i64 %202
  %204 = load ptr, ptr %203, align 8, !tbaa !5
  %205 = getelementptr inbounds %struct.MImagePoint, ptr %204, i32 0, i32 0
  %206 = load float, ptr %205, align 4, !tbaa !14
  %207 = fsub float %199, %206
  %208 = fpext float %207 to double
  store double %208, ptr %19, align 8, !tbaa !21
  %209 = load ptr, ptr %8, align 8, !tbaa !5
  %210 = load i32, ptr %14, align 4, !tbaa !9
  %211 = sext i32 %210 to i64
  %212 = getelementptr inbounds ptr, ptr %209, i64 %211
  %213 = load ptr, ptr %212, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.MImagePoint, ptr %213, i32 0, i32 1
  %215 = load float, ptr %214, align 4, !tbaa !18
  %216 = load ptr, ptr %8, align 8, !tbaa !5
  %217 = load i32, ptr %15, align 4, !tbaa !9
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds ptr, ptr %216, i64 %218
  %220 = load ptr, ptr %219, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.MImagePoint, ptr %220, i32 0, i32 1
  %222 = load float, ptr %221, align 4, !tbaa !18
  %223 = fsub float %215, %222
  %224 = fpext float %223 to double
  store double %224, ptr %18, align 8, !tbaa !21
  %225 = load double, ptr %18, align 8, !tbaa !21
  %226 = load ptr, ptr %8, align 8, !tbaa !5
  %227 = load i32, ptr %14, align 4, !tbaa !9
  %228 = sext i32 %227 to i64
  %229 = getelementptr inbounds ptr, ptr %226, i64 %228
  %230 = load ptr, ptr %229, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.MImagePoint, ptr %230, i32 0, i32 0
  %232 = load float, ptr %231, align 4, !tbaa !14
  %233 = fpext float %232 to double
  %234 = load double, ptr %19, align 8, !tbaa !21
  %235 = load ptr, ptr %8, align 8, !tbaa !5
  %236 = load i32, ptr %14, align 4, !tbaa !9
  %237 = sext i32 %236 to i64
  %238 = getelementptr inbounds ptr, ptr %235, i64 %237
  %239 = load ptr, ptr %238, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.MImagePoint, ptr %239, i32 0, i32 1
  %241 = load float, ptr %240, align 4, !tbaa !18
  %242 = fpext float %241 to double
  %243 = fmul double %234, %242
  %244 = fneg double %243
  %245 = call double @llvm.fmuladd.f64(double %225, double %233, double %244)
  store double %245, ptr %20, align 8, !tbaa !21
  br label %246

246:                                              ; preds = %192, %188
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #5
  store double 0.000000e+00, ptr %21, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  store double 0.000000e+00, ptr %22, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  store double 0.000000e+00, ptr %23, align 8, !tbaa !21
  %247 = load i32, ptr %15, align 4, !tbaa !9
  %248 = load i32, ptr %16, align 4, !tbaa !9
  %249 = icmp ne i32 %247, %248
  br i1 %249, label %250, label %304

250:                                              ; preds = %246
  %251 = load ptr, ptr %8, align 8, !tbaa !5
  %252 = load i32, ptr %15, align 4, !tbaa !9
  %253 = sext i32 %252 to i64
  %254 = getelementptr inbounds ptr, ptr %251, i64 %253
  %255 = load ptr, ptr %254, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.MImagePoint, ptr %255, i32 0, i32 0
  %257 = load float, ptr %256, align 4, !tbaa !14
  %258 = load ptr, ptr %8, align 8, !tbaa !5
  %259 = load i32, ptr %16, align 4, !tbaa !9
  %260 = sext i32 %259 to i64
  %261 = getelementptr inbounds ptr, ptr %258, i64 %260
  %262 = load ptr, ptr %261, align 8, !tbaa !5
  %263 = getelementptr inbounds %struct.MImagePoint, ptr %262, i32 0, i32 0
  %264 = load float, ptr %263, align 4, !tbaa !14
  %265 = fsub float %257, %264
  %266 = fpext float %265 to double
  store double %266, ptr %22, align 8, !tbaa !21
  %267 = load ptr, ptr %8, align 8, !tbaa !5
  %268 = load i32, ptr %15, align 4, !tbaa !9
  %269 = sext i32 %268 to i64
  %270 = getelementptr inbounds ptr, ptr %267, i64 %269
  %271 = load ptr, ptr %270, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct.MImagePoint, ptr %271, i32 0, i32 1
  %273 = load float, ptr %272, align 4, !tbaa !18
  %274 = load ptr, ptr %8, align 8, !tbaa !5
  %275 = load i32, ptr %16, align 4, !tbaa !9
  %276 = sext i32 %275 to i64
  %277 = getelementptr inbounds ptr, ptr %274, i64 %276
  %278 = load ptr, ptr %277, align 8, !tbaa !5
  %279 = getelementptr inbounds %struct.MImagePoint, ptr %278, i32 0, i32 1
  %280 = load float, ptr %279, align 4, !tbaa !18
  %281 = fsub float %273, %280
  %282 = fpext float %281 to double
  store double %282, ptr %21, align 8, !tbaa !21
  %283 = load double, ptr %21, align 8, !tbaa !21
  %284 = load ptr, ptr %8, align 8, !tbaa !5
  %285 = load i32, ptr %15, align 4, !tbaa !9
  %286 = sext i32 %285 to i64
  %287 = getelementptr inbounds ptr, ptr %284, i64 %286
  %288 = load ptr, ptr %287, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct.MImagePoint, ptr %288, i32 0, i32 0
  %290 = load float, ptr %289, align 4, !tbaa !14
  %291 = fpext float %290 to double
  %292 = load double, ptr %22, align 8, !tbaa !21
  %293 = load ptr, ptr %8, align 8, !tbaa !5
  %294 = load i32, ptr %15, align 4, !tbaa !9
  %295 = sext i32 %294 to i64
  %296 = getelementptr inbounds ptr, ptr %293, i64 %295
  %297 = load ptr, ptr %296, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.MImagePoint, ptr %297, i32 0, i32 1
  %299 = load float, ptr %298, align 4, !tbaa !18
  %300 = fpext float %299 to double
  %301 = fmul double %292, %300
  %302 = fneg double %301
  %303 = call double @llvm.fmuladd.f64(double %283, double %291, double %302)
  store double %303, ptr %23, align 8, !tbaa !21
  br label %304

304:                                              ; preds = %250, %246
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #5
  store double 0.000000e+00, ptr %24, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #5
  store double 0.000000e+00, ptr %25, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #5
  store double 0.000000e+00, ptr %26, align 8, !tbaa !21
  %305 = load i32, ptr %16, align 4, !tbaa !9
  %306 = load i32, ptr %17, align 4, !tbaa !9
  %307 = icmp ne i32 %305, %306
  br i1 %307, label %308, label %362

308:                                              ; preds = %304
  %309 = load ptr, ptr %8, align 8, !tbaa !5
  %310 = load i32, ptr %16, align 4, !tbaa !9
  %311 = sext i32 %310 to i64
  %312 = getelementptr inbounds ptr, ptr %309, i64 %311
  %313 = load ptr, ptr %312, align 8, !tbaa !5
  %314 = getelementptr inbounds %struct.MImagePoint, ptr %313, i32 0, i32 0
  %315 = load float, ptr %314, align 4, !tbaa !14
  %316 = load ptr, ptr %8, align 8, !tbaa !5
  %317 = load i32, ptr %17, align 4, !tbaa !9
  %318 = sext i32 %317 to i64
  %319 = getelementptr inbounds ptr, ptr %316, i64 %318
  %320 = load ptr, ptr %319, align 8, !tbaa !5
  %321 = getelementptr inbounds %struct.MImagePoint, ptr %320, i32 0, i32 0
  %322 = load float, ptr %321, align 4, !tbaa !14
  %323 = fsub float %315, %322
  %324 = fpext float %323 to double
  store double %324, ptr %25, align 8, !tbaa !21
  %325 = load ptr, ptr %8, align 8, !tbaa !5
  %326 = load i32, ptr %16, align 4, !tbaa !9
  %327 = sext i32 %326 to i64
  %328 = getelementptr inbounds ptr, ptr %325, i64 %327
  %329 = load ptr, ptr %328, align 8, !tbaa !5
  %330 = getelementptr inbounds %struct.MImagePoint, ptr %329, i32 0, i32 1
  %331 = load float, ptr %330, align 4, !tbaa !18
  %332 = load ptr, ptr %8, align 8, !tbaa !5
  %333 = load i32, ptr %17, align 4, !tbaa !9
  %334 = sext i32 %333 to i64
  %335 = getelementptr inbounds ptr, ptr %332, i64 %334
  %336 = load ptr, ptr %335, align 8, !tbaa !5
  %337 = getelementptr inbounds %struct.MImagePoint, ptr %336, i32 0, i32 1
  %338 = load float, ptr %337, align 4, !tbaa !18
  %339 = fsub float %331, %338
  %340 = fpext float %339 to double
  store double %340, ptr %24, align 8, !tbaa !21
  %341 = load double, ptr %24, align 8, !tbaa !21
  %342 = load ptr, ptr %8, align 8, !tbaa !5
  %343 = load i32, ptr %16, align 4, !tbaa !9
  %344 = sext i32 %343 to i64
  %345 = getelementptr inbounds ptr, ptr %342, i64 %344
  %346 = load ptr, ptr %345, align 8, !tbaa !5
  %347 = getelementptr inbounds %struct.MImagePoint, ptr %346, i32 0, i32 0
  %348 = load float, ptr %347, align 4, !tbaa !14
  %349 = fpext float %348 to double
  %350 = load double, ptr %25, align 8, !tbaa !21
  %351 = load ptr, ptr %8, align 8, !tbaa !5
  %352 = load i32, ptr %16, align 4, !tbaa !9
  %353 = sext i32 %352 to i64
  %354 = getelementptr inbounds ptr, ptr %351, i64 %353
  %355 = load ptr, ptr %354, align 8, !tbaa !5
  %356 = getelementptr inbounds %struct.MImagePoint, ptr %355, i32 0, i32 1
  %357 = load float, ptr %356, align 4, !tbaa !18
  %358 = fpext float %357 to double
  %359 = fmul double %350, %358
  %360 = fneg double %359
  %361 = call double @llvm.fmuladd.f64(double %341, double %349, double %360)
  store double %361, ptr %26, align 8, !tbaa !21
  br label %362

362:                                              ; preds = %308, %304
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #5
  store double 0.000000e+00, ptr %27, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #5
  store double 0.000000e+00, ptr %28, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #5
  store double 0.000000e+00, ptr %29, align 8, !tbaa !21
  %363 = load i32, ptr %17, align 4, !tbaa !9
  %364 = load i32, ptr %14, align 4, !tbaa !9
  %365 = icmp ne i32 %363, %364
  br i1 %365, label %366, label %420

366:                                              ; preds = %362
  %367 = load ptr, ptr %8, align 8, !tbaa !5
  %368 = load i32, ptr %17, align 4, !tbaa !9
  %369 = sext i32 %368 to i64
  %370 = getelementptr inbounds ptr, ptr %367, i64 %369
  %371 = load ptr, ptr %370, align 8, !tbaa !5
  %372 = getelementptr inbounds %struct.MImagePoint, ptr %371, i32 0, i32 0
  %373 = load float, ptr %372, align 4, !tbaa !14
  %374 = load ptr, ptr %8, align 8, !tbaa !5
  %375 = load i32, ptr %14, align 4, !tbaa !9
  %376 = sext i32 %375 to i64
  %377 = getelementptr inbounds ptr, ptr %374, i64 %376
  %378 = load ptr, ptr %377, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.MImagePoint, ptr %378, i32 0, i32 0
  %380 = load float, ptr %379, align 4, !tbaa !14
  %381 = fsub float %373, %380
  %382 = fpext float %381 to double
  store double %382, ptr %28, align 8, !tbaa !21
  %383 = load ptr, ptr %8, align 8, !tbaa !5
  %384 = load i32, ptr %17, align 4, !tbaa !9
  %385 = sext i32 %384 to i64
  %386 = getelementptr inbounds ptr, ptr %383, i64 %385
  %387 = load ptr, ptr %386, align 8, !tbaa !5
  %388 = getelementptr inbounds %struct.MImagePoint, ptr %387, i32 0, i32 1
  %389 = load float, ptr %388, align 4, !tbaa !18
  %390 = load ptr, ptr %8, align 8, !tbaa !5
  %391 = load i32, ptr %14, align 4, !tbaa !9
  %392 = sext i32 %391 to i64
  %393 = getelementptr inbounds ptr, ptr %390, i64 %392
  %394 = load ptr, ptr %393, align 8, !tbaa !5
  %395 = getelementptr inbounds %struct.MImagePoint, ptr %394, i32 0, i32 1
  %396 = load float, ptr %395, align 4, !tbaa !18
  %397 = fsub float %389, %396
  %398 = fpext float %397 to double
  store double %398, ptr %27, align 8, !tbaa !21
  %399 = load double, ptr %27, align 8, !tbaa !21
  %400 = load ptr, ptr %8, align 8, !tbaa !5
  %401 = load i32, ptr %17, align 4, !tbaa !9
  %402 = sext i32 %401 to i64
  %403 = getelementptr inbounds ptr, ptr %400, i64 %402
  %404 = load ptr, ptr %403, align 8, !tbaa !5
  %405 = getelementptr inbounds %struct.MImagePoint, ptr %404, i32 0, i32 0
  %406 = load float, ptr %405, align 4, !tbaa !14
  %407 = fpext float %406 to double
  %408 = load double, ptr %28, align 8, !tbaa !21
  %409 = load ptr, ptr %8, align 8, !tbaa !5
  %410 = load i32, ptr %17, align 4, !tbaa !9
  %411 = sext i32 %410 to i64
  %412 = getelementptr inbounds ptr, ptr %409, i64 %411
  %413 = load ptr, ptr %412, align 8, !tbaa !5
  %414 = getelementptr inbounds %struct.MImagePoint, ptr %413, i32 0, i32 1
  %415 = load float, ptr %414, align 4, !tbaa !18
  %416 = fpext float %415 to double
  %417 = fmul double %408, %416
  %418 = fneg double %417
  %419 = call double @llvm.fmuladd.f64(double %399, double %407, double %418)
  store double %419, ptr %29, align 8, !tbaa !21
  br label %420

420:                                              ; preds = %366, %362
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #5
  %421 = load ptr, ptr %3, align 8, !tbaa !5
  %422 = getelementptr inbounds %struct.MList, ptr %421, i32 0, i32 0
  %423 = load i32, ptr %422, align 8, !tbaa !11
  %424 = add nsw i32 %423, 0
  %425 = call ptr @ListCreate(i32 noundef %424, ptr noundef null)
  store ptr %425, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #5
  store i32 0, ptr %31, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #5
  %426 = load ptr, ptr %3, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct.MList, ptr %426, i32 0, i32 0
  %428 = load i32, ptr %427, align 8, !tbaa !11
  %429 = add nsw i32 %428, 0
  %430 = call ptr @ListCreate(i32 noundef %429, ptr noundef null)
  store ptr %430, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #5
  store i32 0, ptr %33, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #5
  %431 = load ptr, ptr %3, align 8, !tbaa !5
  %432 = getelementptr inbounds %struct.MList, ptr %431, i32 0, i32 0
  %433 = load i32, ptr %432, align 8, !tbaa !11
  %434 = add nsw i32 %433, 0
  %435 = call ptr @ListCreate(i32 noundef %434, ptr noundef null)
  store ptr %435, ptr %34, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #5
  store i32 0, ptr %35, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #5
  %436 = load ptr, ptr %3, align 8, !tbaa !5
  %437 = getelementptr inbounds %struct.MList, ptr %436, i32 0, i32 0
  %438 = load i32, ptr %437, align 8, !tbaa !11
  %439 = add nsw i32 %438, 0
  %440 = call ptr @ListCreate(i32 noundef %439, ptr noundef null)
  store ptr %440, ptr %36, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #5
  store i32 0, ptr %37, align 4, !tbaa !9
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %441

441:                                              ; preds = %620, %420
  %442 = load i32, ptr %9, align 4, !tbaa !9
  %443 = load ptr, ptr %3, align 8, !tbaa !5
  %444 = getelementptr inbounds %struct.MList, ptr %443, i32 0, i32 0
  %445 = load i32, ptr %444, align 8, !tbaa !11
  %446 = icmp slt i32 %442, %445
  br i1 %446, label %447, label %623

447:                                              ; preds = %441
  %448 = load i32, ptr %14, align 4, !tbaa !9
  %449 = load i32, ptr %15, align 4, !tbaa !9
  %450 = icmp ne i32 %448, %449
  br i1 %450, label %451, label %490

451:                                              ; preds = %447
  %452 = load double, ptr %18, align 8, !tbaa !21
  %453 = load ptr, ptr %8, align 8, !tbaa !5
  %454 = load i32, ptr %9, align 4, !tbaa !9
  %455 = sext i32 %454 to i64
  %456 = getelementptr inbounds ptr, ptr %453, i64 %455
  %457 = load ptr, ptr %456, align 8, !tbaa !5
  %458 = getelementptr inbounds %struct.MImagePoint, ptr %457, i32 0, i32 0
  %459 = load float, ptr %458, align 4, !tbaa !14
  %460 = fpext float %459 to double
  %461 = load double, ptr %19, align 8, !tbaa !21
  %462 = load ptr, ptr %8, align 8, !tbaa !5
  %463 = load i32, ptr %9, align 4, !tbaa !9
  %464 = sext i32 %463 to i64
  %465 = getelementptr inbounds ptr, ptr %462, i64 %464
  %466 = load ptr, ptr %465, align 8, !tbaa !5
  %467 = getelementptr inbounds %struct.MImagePoint, ptr %466, i32 0, i32 1
  %468 = load float, ptr %467, align 4, !tbaa !18
  %469 = fpext float %468 to double
  %470 = fmul double %461, %469
  %471 = fneg double %470
  %472 = call double @llvm.fmuladd.f64(double %452, double %460, double %471)
  %473 = load double, ptr %20, align 8, !tbaa !21
  %474 = fcmp olt double %472, %473
  br i1 %474, label %475, label %489

475:                                              ; preds = %451
  %476 = load ptr, ptr %8, align 8, !tbaa !5
  %477 = load i32, ptr %9, align 4, !tbaa !9
  %478 = sext i32 %477 to i64
  %479 = getelementptr inbounds ptr, ptr %476, i64 %478
  %480 = load ptr, ptr %479, align 8, !tbaa !5
  %481 = load ptr, ptr %30, align 8, !tbaa !5
  %482 = getelementptr inbounds %struct.MList, ptr %481, i32 0, i32 1
  %483 = load ptr, ptr %482, align 8, !tbaa !13
  %484 = load i32, ptr %31, align 4, !tbaa !9
  %485 = sext i32 %484 to i64
  %486 = getelementptr inbounds ptr, ptr %483, i64 %485
  store ptr %480, ptr %486, align 8, !tbaa !5
  %487 = load i32, ptr %31, align 4, !tbaa !9
  %488 = add nsw i32 %487, 1
  store i32 %488, ptr %31, align 4, !tbaa !9
  br label %620

489:                                              ; preds = %451
  br label %490

490:                                              ; preds = %489, %447
  %491 = load i32, ptr %15, align 4, !tbaa !9
  %492 = load i32, ptr %16, align 4, !tbaa !9
  %493 = icmp ne i32 %491, %492
  br i1 %493, label %494, label %533

494:                                              ; preds = %490
  %495 = load double, ptr %21, align 8, !tbaa !21
  %496 = load ptr, ptr %8, align 8, !tbaa !5
  %497 = load i32, ptr %9, align 4, !tbaa !9
  %498 = sext i32 %497 to i64
  %499 = getelementptr inbounds ptr, ptr %496, i64 %498
  %500 = load ptr, ptr %499, align 8, !tbaa !5
  %501 = getelementptr inbounds %struct.MImagePoint, ptr %500, i32 0, i32 0
  %502 = load float, ptr %501, align 4, !tbaa !14
  %503 = fpext float %502 to double
  %504 = load double, ptr %22, align 8, !tbaa !21
  %505 = load ptr, ptr %8, align 8, !tbaa !5
  %506 = load i32, ptr %9, align 4, !tbaa !9
  %507 = sext i32 %506 to i64
  %508 = getelementptr inbounds ptr, ptr %505, i64 %507
  %509 = load ptr, ptr %508, align 8, !tbaa !5
  %510 = getelementptr inbounds %struct.MImagePoint, ptr %509, i32 0, i32 1
  %511 = load float, ptr %510, align 4, !tbaa !18
  %512 = fpext float %511 to double
  %513 = fmul double %504, %512
  %514 = fneg double %513
  %515 = call double @llvm.fmuladd.f64(double %495, double %503, double %514)
  %516 = load double, ptr %23, align 8, !tbaa !21
  %517 = fcmp olt double %515, %516
  br i1 %517, label %518, label %532

518:                                              ; preds = %494
  %519 = load ptr, ptr %8, align 8, !tbaa !5
  %520 = load i32, ptr %9, align 4, !tbaa !9
  %521 = sext i32 %520 to i64
  %522 = getelementptr inbounds ptr, ptr %519, i64 %521
  %523 = load ptr, ptr %522, align 8, !tbaa !5
  %524 = load ptr, ptr %32, align 8, !tbaa !5
  %525 = getelementptr inbounds %struct.MList, ptr %524, i32 0, i32 1
  %526 = load ptr, ptr %525, align 8, !tbaa !13
  %527 = load i32, ptr %33, align 4, !tbaa !9
  %528 = sext i32 %527 to i64
  %529 = getelementptr inbounds ptr, ptr %526, i64 %528
  store ptr %523, ptr %529, align 8, !tbaa !5
  %530 = load i32, ptr %33, align 4, !tbaa !9
  %531 = add nsw i32 %530, 1
  store i32 %531, ptr %33, align 4, !tbaa !9
  br label %620

532:                                              ; preds = %494
  br label %533

533:                                              ; preds = %532, %490
  %534 = load i32, ptr %16, align 4, !tbaa !9
  %535 = load i32, ptr %17, align 4, !tbaa !9
  %536 = icmp ne i32 %534, %535
  br i1 %536, label %537, label %576

537:                                              ; preds = %533
  %538 = load double, ptr %24, align 8, !tbaa !21
  %539 = load ptr, ptr %8, align 8, !tbaa !5
  %540 = load i32, ptr %9, align 4, !tbaa !9
  %541 = sext i32 %540 to i64
  %542 = getelementptr inbounds ptr, ptr %539, i64 %541
  %543 = load ptr, ptr %542, align 8, !tbaa !5
  %544 = getelementptr inbounds %struct.MImagePoint, ptr %543, i32 0, i32 0
  %545 = load float, ptr %544, align 4, !tbaa !14
  %546 = fpext float %545 to double
  %547 = load double, ptr %25, align 8, !tbaa !21
  %548 = load ptr, ptr %8, align 8, !tbaa !5
  %549 = load i32, ptr %9, align 4, !tbaa !9
  %550 = sext i32 %549 to i64
  %551 = getelementptr inbounds ptr, ptr %548, i64 %550
  %552 = load ptr, ptr %551, align 8, !tbaa !5
  %553 = getelementptr inbounds %struct.MImagePoint, ptr %552, i32 0, i32 1
  %554 = load float, ptr %553, align 4, !tbaa !18
  %555 = fpext float %554 to double
  %556 = fmul double %547, %555
  %557 = fneg double %556
  %558 = call double @llvm.fmuladd.f64(double %538, double %546, double %557)
  %559 = load double, ptr %26, align 8, !tbaa !21
  %560 = fcmp olt double %558, %559
  br i1 %560, label %561, label %575

561:                                              ; preds = %537
  %562 = load ptr, ptr %8, align 8, !tbaa !5
  %563 = load i32, ptr %9, align 4, !tbaa !9
  %564 = sext i32 %563 to i64
  %565 = getelementptr inbounds ptr, ptr %562, i64 %564
  %566 = load ptr, ptr %565, align 8, !tbaa !5
  %567 = load ptr, ptr %34, align 8, !tbaa !5
  %568 = getelementptr inbounds %struct.MList, ptr %567, i32 0, i32 1
  %569 = load ptr, ptr %568, align 8, !tbaa !13
  %570 = load i32, ptr %35, align 4, !tbaa !9
  %571 = sext i32 %570 to i64
  %572 = getelementptr inbounds ptr, ptr %569, i64 %571
  store ptr %566, ptr %572, align 8, !tbaa !5
  %573 = load i32, ptr %35, align 4, !tbaa !9
  %574 = add nsw i32 %573, 1
  store i32 %574, ptr %35, align 4, !tbaa !9
  br label %620

575:                                              ; preds = %537
  br label %576

576:                                              ; preds = %575, %533
  %577 = load i32, ptr %17, align 4, !tbaa !9
  %578 = load i32, ptr %14, align 4, !tbaa !9
  %579 = icmp ne i32 %577, %578
  br i1 %579, label %580, label %619

580:                                              ; preds = %576
  %581 = load double, ptr %27, align 8, !tbaa !21
  %582 = load ptr, ptr %8, align 8, !tbaa !5
  %583 = load i32, ptr %9, align 4, !tbaa !9
  %584 = sext i32 %583 to i64
  %585 = getelementptr inbounds ptr, ptr %582, i64 %584
  %586 = load ptr, ptr %585, align 8, !tbaa !5
  %587 = getelementptr inbounds %struct.MImagePoint, ptr %586, i32 0, i32 0
  %588 = load float, ptr %587, align 4, !tbaa !14
  %589 = fpext float %588 to double
  %590 = load double, ptr %28, align 8, !tbaa !21
  %591 = load ptr, ptr %8, align 8, !tbaa !5
  %592 = load i32, ptr %9, align 4, !tbaa !9
  %593 = sext i32 %592 to i64
  %594 = getelementptr inbounds ptr, ptr %591, i64 %593
  %595 = load ptr, ptr %594, align 8, !tbaa !5
  %596 = getelementptr inbounds %struct.MImagePoint, ptr %595, i32 0, i32 1
  %597 = load float, ptr %596, align 4, !tbaa !18
  %598 = fpext float %597 to double
  %599 = fmul double %590, %598
  %600 = fneg double %599
  %601 = call double @llvm.fmuladd.f64(double %581, double %589, double %600)
  %602 = load double, ptr %29, align 8, !tbaa !21
  %603 = fcmp olt double %601, %602
  br i1 %603, label %604, label %618

604:                                              ; preds = %580
  %605 = load ptr, ptr %8, align 8, !tbaa !5
  %606 = load i32, ptr %9, align 4, !tbaa !9
  %607 = sext i32 %606 to i64
  %608 = getelementptr inbounds ptr, ptr %605, i64 %607
  %609 = load ptr, ptr %608, align 8, !tbaa !5
  %610 = load ptr, ptr %36, align 8, !tbaa !5
  %611 = getelementptr inbounds %struct.MList, ptr %610, i32 0, i32 1
  %612 = load ptr, ptr %611, align 8, !tbaa !13
  %613 = load i32, ptr %37, align 4, !tbaa !9
  %614 = sext i32 %613 to i64
  %615 = getelementptr inbounds ptr, ptr %612, i64 %614
  store ptr %609, ptr %615, align 8, !tbaa !5
  %616 = load i32, ptr %37, align 4, !tbaa !9
  %617 = add nsw i32 %616, 1
  store i32 %617, ptr %37, align 4, !tbaa !9
  br label %620

618:                                              ; preds = %580
  br label %619

619:                                              ; preds = %618, %576
  br label %620

620:                                              ; preds = %619, %604, %561, %518, %475
  %621 = load i32, ptr %9, align 4, !tbaa !9
  %622 = add nsw i32 %621, 1
  store i32 %622, ptr %9, align 4, !tbaa !9
  br label %441, !llvm.loop !23

623:                                              ; preds = %441
  %624 = load i32, ptr %31, align 4, !tbaa !9
  %625 = load ptr, ptr %30, align 8, !tbaa !5
  %626 = getelementptr inbounds %struct.MList, ptr %625, i32 0, i32 0
  store i32 %624, ptr %626, align 8, !tbaa !11
  %627 = load i32, ptr %33, align 4, !tbaa !9
  %628 = load ptr, ptr %32, align 8, !tbaa !5
  %629 = getelementptr inbounds %struct.MList, ptr %628, i32 0, i32 0
  store i32 %627, ptr %629, align 8, !tbaa !11
  %630 = load i32, ptr %35, align 4, !tbaa !9
  %631 = load ptr, ptr %34, align 8, !tbaa !5
  %632 = getelementptr inbounds %struct.MList, ptr %631, i32 0, i32 0
  store i32 %630, ptr %632, align 8, !tbaa !11
  %633 = load i32, ptr %37, align 4, !tbaa !9
  %634 = load ptr, ptr %36, align 8, !tbaa !5
  %635 = getelementptr inbounds %struct.MList, ptr %634, i32 0, i32 0
  store i32 %633, ptr %635, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #5
  %636 = call ptr (...) @mChainCreate()
  store ptr %636, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #5
  store ptr null, ptr %39, align 8, !tbaa !5
  %637 = load i32, ptr %14, align 4, !tbaa !9
  %638 = load i32, ptr %15, align 4, !tbaa !9
  %639 = icmp ne i32 %637, %638
  br i1 %639, label %640, label %653

640:                                              ; preds = %623
  %641 = load ptr, ptr %38, align 8, !tbaa !5
  %642 = call ptr @mChainNode(ptr noundef %641, ptr noundef null, i32 noundef -1)
  store ptr %642, ptr %39, align 8, !tbaa !5
  %643 = load ptr, ptr %8, align 8, !tbaa !5
  %644 = load i32, ptr %14, align 4, !tbaa !9
  %645 = sext i32 %644 to i64
  %646 = getelementptr inbounds ptr, ptr %643, i64 %645
  %647 = load ptr, ptr %646, align 8, !tbaa !5
  %648 = load ptr, ptr %39, align 8, !tbaa !5
  %649 = getelementptr inbounds %struct.MChainNode, ptr %648, i32 0, i32 0
  store ptr %647, ptr %649, align 8, !tbaa !24
  %650 = load ptr, ptr %39, align 8, !tbaa !5
  %651 = load ptr, ptr %38, align 8, !tbaa !5
  %652 = getelementptr inbounds %struct.MObject, ptr %651, i32 0, i32 1
  store ptr %650, ptr %652, align 8, !tbaa !26
  br label %653

653:                                              ; preds = %640, %623
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #5
  store ptr null, ptr %40, align 8, !tbaa !5
  %654 = load i32, ptr %15, align 4, !tbaa !9
  %655 = load i32, ptr %16, align 4, !tbaa !9
  %656 = icmp ne i32 %654, %655
  br i1 %656, label %657, label %681

657:                                              ; preds = %653
  %658 = load ptr, ptr %38, align 8, !tbaa !5
  %659 = call ptr @mChainNode(ptr noundef %658, ptr noundef null, i32 noundef -1)
  store ptr %659, ptr %40, align 8, !tbaa !5
  %660 = load ptr, ptr %8, align 8, !tbaa !5
  %661 = load i32, ptr %15, align 4, !tbaa !9
  %662 = sext i32 %661 to i64
  %663 = getelementptr inbounds ptr, ptr %660, i64 %662
  %664 = load ptr, ptr %663, align 8, !tbaa !5
  %665 = load ptr, ptr %40, align 8, !tbaa !5
  %666 = getelementptr inbounds %struct.MChainNode, ptr %665, i32 0, i32 0
  store ptr %664, ptr %666, align 8, !tbaa !24
  %667 = load ptr, ptr %38, align 8, !tbaa !5
  %668 = getelementptr inbounds %struct.MObject, ptr %667, i32 0, i32 1
  %669 = load ptr, ptr %668, align 8, !tbaa !26
  %670 = icmp eq ptr %669, null
  br i1 %670, label %671, label %675

671:                                              ; preds = %657
  %672 = load ptr, ptr %40, align 8, !tbaa !5
  %673 = load ptr, ptr %38, align 8, !tbaa !5
  %674 = getelementptr inbounds %struct.MObject, ptr %673, i32 0, i32 1
  store ptr %672, ptr %674, align 8, !tbaa !26
  br label %680

675:                                              ; preds = %657
  %676 = load ptr, ptr %40, align 8, !tbaa !5
  %677 = load ptr, ptr %38, align 8, !tbaa !5
  %678 = getelementptr inbounds %struct.MObject, ptr %677, i32 0, i32 1
  %679 = load ptr, ptr %678, align 8, !tbaa !26
  call void @mChainNodeInsert(ptr noundef null, ptr noundef %676, ptr noundef %679)
  br label %680

680:                                              ; preds = %675, %671
  br label %681

681:                                              ; preds = %680, %653
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #5
  store ptr null, ptr %41, align 8, !tbaa !5
  %682 = load i32, ptr %16, align 4, !tbaa !9
  %683 = load i32, ptr %17, align 4, !tbaa !9
  %684 = icmp ne i32 %682, %683
  br i1 %684, label %685, label %709

685:                                              ; preds = %681
  %686 = load ptr, ptr %38, align 8, !tbaa !5
  %687 = call ptr @mChainNode(ptr noundef %686, ptr noundef null, i32 noundef -1)
  store ptr %687, ptr %41, align 8, !tbaa !5
  %688 = load ptr, ptr %8, align 8, !tbaa !5
  %689 = load i32, ptr %16, align 4, !tbaa !9
  %690 = sext i32 %689 to i64
  %691 = getelementptr inbounds ptr, ptr %688, i64 %690
  %692 = load ptr, ptr %691, align 8, !tbaa !5
  %693 = load ptr, ptr %41, align 8, !tbaa !5
  %694 = getelementptr inbounds %struct.MChainNode, ptr %693, i32 0, i32 0
  store ptr %692, ptr %694, align 8, !tbaa !24
  %695 = load ptr, ptr %38, align 8, !tbaa !5
  %696 = getelementptr inbounds %struct.MObject, ptr %695, i32 0, i32 1
  %697 = load ptr, ptr %696, align 8, !tbaa !26
  %698 = icmp eq ptr %697, null
  br i1 %698, label %699, label %703

699:                                              ; preds = %685
  %700 = load ptr, ptr %41, align 8, !tbaa !5
  %701 = load ptr, ptr %38, align 8, !tbaa !5
  %702 = getelementptr inbounds %struct.MObject, ptr %701, i32 0, i32 1
  store ptr %700, ptr %702, align 8, !tbaa !26
  br label %708

703:                                              ; preds = %685
  %704 = load ptr, ptr %41, align 8, !tbaa !5
  %705 = load ptr, ptr %38, align 8, !tbaa !5
  %706 = getelementptr inbounds %struct.MObject, ptr %705, i32 0, i32 1
  %707 = load ptr, ptr %706, align 8, !tbaa !26
  call void @mChainNodeInsert(ptr noundef null, ptr noundef %704, ptr noundef %707)
  br label %708

708:                                              ; preds = %703, %699
  br label %709

709:                                              ; preds = %708, %681
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #5
  store ptr null, ptr %42, align 8, !tbaa !5
  %710 = load i32, ptr %17, align 4, !tbaa !9
  %711 = load i32, ptr %14, align 4, !tbaa !9
  %712 = icmp ne i32 %710, %711
  br i1 %712, label %713, label %737

713:                                              ; preds = %709
  %714 = load ptr, ptr %38, align 8, !tbaa !5
  %715 = call ptr @mChainNode(ptr noundef %714, ptr noundef null, i32 noundef -1)
  store ptr %715, ptr %42, align 8, !tbaa !5
  %716 = load ptr, ptr %8, align 8, !tbaa !5
  %717 = load i32, ptr %17, align 4, !tbaa !9
  %718 = sext i32 %717 to i64
  %719 = getelementptr inbounds ptr, ptr %716, i64 %718
  %720 = load ptr, ptr %719, align 8, !tbaa !5
  %721 = load ptr, ptr %42, align 8, !tbaa !5
  %722 = getelementptr inbounds %struct.MChainNode, ptr %721, i32 0, i32 0
  store ptr %720, ptr %722, align 8, !tbaa !24
  %723 = load ptr, ptr %38, align 8, !tbaa !5
  %724 = getelementptr inbounds %struct.MObject, ptr %723, i32 0, i32 1
  %725 = load ptr, ptr %724, align 8, !tbaa !26
  %726 = icmp eq ptr %725, null
  br i1 %726, label %727, label %731

727:                                              ; preds = %713
  %728 = load ptr, ptr %42, align 8, !tbaa !5
  %729 = load ptr, ptr %38, align 8, !tbaa !5
  %730 = getelementptr inbounds %struct.MObject, ptr %729, i32 0, i32 1
  store ptr %728, ptr %730, align 8, !tbaa !26
  br label %736

731:                                              ; preds = %713
  %732 = load ptr, ptr %42, align 8, !tbaa !5
  %733 = load ptr, ptr %38, align 8, !tbaa !5
  %734 = getelementptr inbounds %struct.MObject, ptr %733, i32 0, i32 1
  %735 = load ptr, ptr %734, align 8, !tbaa !26
  call void @mChainNodeInsert(ptr noundef null, ptr noundef %732, ptr noundef %735)
  br label %736

736:                                              ; preds = %731, %727
  br label %737

737:                                              ; preds = %736, %709
  %738 = load i32, ptr %31, align 4, !tbaa !9
  %739 = icmp sgt i32 %738, 0
  br i1 %739, label %740, label %744

740:                                              ; preds = %737
  %741 = load ptr, ptr %30, align 8, !tbaa !5
  %742 = load ptr, ptr %38, align 8, !tbaa !5
  %743 = load ptr, ptr %39, align 8, !tbaa !5
  call void @ConvexHull(ptr noundef %741, ptr noundef %742, ptr noundef %743)
  br label %744

744:                                              ; preds = %740, %737
  %745 = load i32, ptr %33, align 4, !tbaa !9
  %746 = icmp sgt i32 %745, 0
  br i1 %746, label %747, label %751

747:                                              ; preds = %744
  %748 = load ptr, ptr %32, align 8, !tbaa !5
  %749 = load ptr, ptr %38, align 8, !tbaa !5
  %750 = load ptr, ptr %40, align 8, !tbaa !5
  call void @ConvexHull(ptr noundef %748, ptr noundef %749, ptr noundef %750)
  br label %751

751:                                              ; preds = %747, %744
  %752 = load i32, ptr %35, align 4, !tbaa !9
  %753 = icmp sgt i32 %752, 0
  br i1 %753, label %754, label %758

754:                                              ; preds = %751
  %755 = load ptr, ptr %34, align 8, !tbaa !5
  %756 = load ptr, ptr %38, align 8, !tbaa !5
  %757 = load ptr, ptr %41, align 8, !tbaa !5
  call void @ConvexHull(ptr noundef %755, ptr noundef %756, ptr noundef %757)
  br label %758

758:                                              ; preds = %754, %751
  %759 = load i32, ptr %37, align 4, !tbaa !9
  %760 = icmp sgt i32 %759, 0
  br i1 %760, label %761, label %765

761:                                              ; preds = %758
  %762 = load ptr, ptr %36, align 8, !tbaa !5
  %763 = load ptr, ptr %38, align 8, !tbaa !5
  %764 = load ptr, ptr %42, align 8, !tbaa !5
  call void @ConvexHull(ptr noundef %762, ptr noundef %763, ptr noundef %764)
  br label %765

765:                                              ; preds = %761, %758
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #5
  %766 = load ptr, ptr %38, align 8, !tbaa !5
  %767 = getelementptr inbounds %struct.MObject, ptr %766, i32 0, i32 1
  %768 = load ptr, ptr %767, align 8, !tbaa !26
  store ptr %768, ptr %43, align 8, !tbaa !5
  %769 = load ptr, ptr %4, align 8, !tbaa !5
  %770 = getelementptr inbounds %struct.MList, ptr %769, i32 0, i32 0
  store i32 0, ptr %770, align 8, !tbaa !11
  br label %771

771:                                              ; preds = %787, %765
  br label %772

772:                                              ; preds = %771
  %773 = load ptr, ptr %4, align 8, !tbaa !5
  %774 = load ptr, ptr %43, align 8, !tbaa !5
  %775 = getelementptr inbounds %struct.MChainNode, ptr %774, i32 0, i32 0
  %776 = load ptr, ptr %775, align 8, !tbaa !24
  %777 = call ptr @mListWrite(ptr noundef %773, i32 noundef -1, ptr noundef %776, i32 noundef 8)
  %778 = load ptr, ptr %43, align 8, !tbaa !5
  %779 = getelementptr inbounds %struct.MChainNode, ptr %778, i32 0, i32 2
  %780 = load ptr, ptr %779, align 8, !tbaa !27
  store ptr %780, ptr %43, align 8, !tbaa !5
  %781 = load ptr, ptr %43, align 8, !tbaa !5
  %782 = load ptr, ptr %38, align 8, !tbaa !5
  %783 = getelementptr inbounds %struct.MObject, ptr %782, i32 0, i32 1
  %784 = load ptr, ptr %783, align 8, !tbaa !26
  %785 = icmp eq ptr %781, %784
  br i1 %785, label %786, label %787

786:                                              ; preds = %772
  br label %788

787:                                              ; preds = %772
  br label %771

788:                                              ; preds = %786
  %789 = load ptr, ptr %30, align 8, !tbaa !5
  call void @mListRelease(ptr noundef %789)
  %790 = load ptr, ptr %32, align 8, !tbaa !5
  call void @mListRelease(ptr noundef %790)
  %791 = load ptr, ptr %34, align 8, !tbaa !5
  call void @mListRelease(ptr noundef %791)
  %792 = load ptr, ptr %36, align 8, !tbaa !5
  call void @mListRelease(ptr noundef %792)
  %793 = load ptr, ptr %38, align 8, !tbaa !5
  call void @mChainRelease(ptr noundef %793)
  %794 = load ptr, ptr %4, align 8, !tbaa !5
  %795 = getelementptr inbounds %struct.MList, ptr %794, i32 0, i32 0
  %796 = load i32, ptr %795, align 8, !tbaa !11
  %797 = icmp ne i32 %796, 0
  br i1 %797, label %798, label %812

798:                                              ; preds = %788
  %799 = load ptr, ptr %4, align 8, !tbaa !5
  %800 = load ptr, ptr %4, align 8, !tbaa !5
  %801 = getelementptr inbounds %struct.MList, ptr %800, i32 0, i32 1
  %802 = load ptr, ptr %801, align 8, !tbaa !13
  %803 = getelementptr inbounds ptr, ptr %802, i64 0
  %804 = load ptr, ptr %803, align 8, !tbaa !5
  %805 = call ptr @mListWrite(ptr noundef %799, i32 noundef -1, ptr noundef %804, i32 noundef 8)
  %806 = load ptr, ptr %4, align 8, !tbaa !5
  %807 = getelementptr inbounds %struct.MList, ptr %806, i32 0, i32 0
  %808 = load i32, ptr %807, align 8, !tbaa !11
  %809 = sub nsw i32 %808, 1
  %810 = load ptr, ptr %4, align 8, !tbaa !5
  %811 = getelementptr inbounds %struct.MList, ptr %810, i32 0, i32 0
  store i32 %809, ptr %811, align 8, !tbaa !11
  br label %812

812:                                              ; preds = %798, %788
  %813 = load ptr, ptr %7, align 8, !tbaa !5
  %814 = load ptr, ptr %4, align 8, !tbaa !5
  %815 = icmp ne ptr %813, %814
  br i1 %815, label %816, label %827

816:                                              ; preds = %812
  br label %817

817:                                              ; preds = %816
  call void @llvm.lifetime.start.p0(i64 16, ptr %44) #5
  %818 = load ptr, ptr %4, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %44, ptr align 8 %818, i64 16, i1 false), !tbaa.struct !28
  %819 = load ptr, ptr %4, align 8, !tbaa !5
  %820 = load ptr, ptr %3, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %819, ptr align 8 %820, i64 16, i1 false), !tbaa.struct !28
  %821 = load ptr, ptr %3, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %821, ptr align 8 %44, i64 16, i1 false), !tbaa.struct !28
  %822 = load ptr, ptr %4, align 8, !tbaa !5
  %823 = load ptr, ptr %3, align 8, !tbaa !5
  call void @HandleExchange(ptr noundef %822, ptr noundef %823)
  call void @llvm.lifetime.end.p0(i64 16, ptr %44) #5
  br label %824

824:                                              ; preds = %817
  br label %825

825:                                              ; preds = %824
  %826 = load ptr, ptr %4, align 8, !tbaa !5
  call void @mListRelease(ptr noundef %826)
  br label %827

827:                                              ; preds = %825, %812
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #5
  ret void
}

declare ptr @mChainCreate(...) #2

declare void @mChainRelease(ptr noundef) #2

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !10, i64 0}
!12 = !{!"MList", !10, i64 0, !6, i64 8}
!13 = !{!12, !6, i64 8}
!14 = !{!15, !16, i64 0}
!15 = !{!"MImagePoint", !16, i64 0, !16, i64 4}
!16 = !{!"float", !7, i64 0}
!17 = !{!16, !16, i64 0}
!18 = !{!15, !16, i64 4}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = !{!22, !22, i64 0}
!22 = !{!"double", !7, i64 0}
!23 = distinct !{!23, !20}
!24 = !{!25, !6, i64 0}
!25 = !{!"MChainNode", !6, i64 0, !6, i64 8, !6, i64 16}
!26 = !{!7, !7, i64 0}
!27 = !{!25, !6, i64 16}
!28 = !{i64 0, i64 4, !9, i64 8, i64 8, !5}


; 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.MList = type { i32, ptr }

@.str = external hidden unnamed_addr constant [88 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [14 x i8], align 1
@__FUNCTION__.mConvexHull = external hidden unnamed_addr constant [12 x i8], align 1

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #1

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

declare void @m_Exception(i32 noundef, i32 noundef, ptr noundef, i32 noundef, ptr noundef, ptr noundef, ...) local_unnamed_addr #2

declare ptr @ListCreate(i32 noundef, ptr noundef) local_unnamed_addr #2

declare ptr @mListWrite(ptr noundef, i32 noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

declare void @mListRelease(ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local void @ConvexHull(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

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

declare ptr @mChainNode(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

declare void @mChainNodeInsert(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local void @mConvexHull(ptr noundef %0, ptr noundef %1) local_unnamed_addr #3 {
  %3 = alloca %struct.MList, align 8
  %magicptr = ptrtoint ptr %0 to i64
  switch i64 %magicptr, label %9 [
    i64 -1, label %4
    i64 0, label %4
  ]

4:                                                ; preds = %2, %2
  %5 = icmp eq ptr %0, null
  %6 = icmp eq ptr %0, inttoptr (i64 -1 to ptr)
  %7 = or i1 %5, %6
  %8 = zext i1 %7 to i32
  tail call void (i32, i32, ptr, i32, ptr, ptr, ...) @m_Exception(i32 noundef %8, i32 noundef -1, ptr noundef nonnull @.str, i32 noundef 614, ptr noundef nonnull @__FUNCTION__.mConvexHull, ptr noundef nonnull @.str.1) #5
  br label %9

9:                                                ; preds = %2, %4
  %10 = load i32, ptr %0, align 8, !tbaa !5
  %11 = icmp slt i32 %10, 3
  br i1 %11, label %12, label %13

12:                                               ; preds = %9
  tail call void (i32, i32, ptr, i32, ptr, ptr, ...) @m_Exception(i32 noundef 1, i32 noundef -1, ptr noundef nonnull @.str, i32 noundef 615, ptr noundef nonnull @__FUNCTION__.mConvexHull, ptr noundef nonnull @.str.1) #5
  br label %13

13:                                               ; preds = %12, %9
  %14 = icmp eq ptr %1, null
  %15 = icmp eq ptr %1, %0
  %or.cond = or i1 %14, %15
  br i1 %or.cond, label %16, label %18

16:                                               ; preds = %13
  %17 = tail call ptr @ListCreate(i32 noundef -1, ptr noundef null) #5
  br label %18

18:                                               ; preds = %13, %16
  %.0265 = phi ptr [ %17, %16 ], [ %1, %13 ]
  store i32 0, ptr %.0265, align 8, !tbaa !5
  %19 = getelementptr inbounds i8, ptr %0, i64 8
  %20 = load ptr, ptr %19, align 8, !tbaa !11
  %21 = load i32, ptr %0, align 8, !tbaa !5
  %22 = icmp sgt i32 %21, 1
  br i1 %22, label %.lr.ph.preheader, label %.thread402

.lr.ph.preheader:                                 ; preds = %18
  %23 = load ptr, ptr %20, align 8, !tbaa !12
  %24 = getelementptr inbounds i8, ptr %23, i64 4
  %25 = load float, ptr %24, align 4, !tbaa !13
  %26 = load float, ptr %23, align 4, !tbaa !16
  %wide.trip.count = zext nneg i32 %21 to i64
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %42
  %indvars.iv = phi i64 [ 1, %.lr.ph.preheader ], [ %indvars.iv.next, %42 ]
  %.0271323 = phi float [ %26, %.lr.ph.preheader ], [ %.1272, %42 ]
  %.0275322 = phi float [ %26, %.lr.ph.preheader ], [ %.1276, %42 ]
  %.0279321 = phi float [ %25, %.lr.ph.preheader ], [ %.1280, %42 ]
  %.0293320 = phi i32 [ 0, %.lr.ph.preheader ], [ %.1294, %42 ]
  %.0295319 = phi i32 [ 0, %.lr.ph.preheader ], [ %.1296, %42 ]
  %.0297318 = phi i32 [ 0, %.lr.ph.preheader ], [ %.1298, %42 ]
  %.0299317 = phi i32 [ 0, %.lr.ph.preheader ], [ %.1300, %42 ]
  %.0301316 = phi float [ %25, %.lr.ph.preheader ], [ %.1302, %42 ]
  %27 = getelementptr inbounds ptr, ptr %20, i64 %indvars.iv
  %28 = load ptr, ptr %27, align 8, !tbaa !12
  %29 = load float, ptr %28, align 4, !tbaa !16
  %30 = fcmp ogt float %29, %.0271323
  %31 = trunc nuw nsw i64 %indvars.iv to i32
  br i1 %30, label %35, label %32

32:                                               ; preds = %.lr.ph
  %33 = fcmp olt float %29, %.0275322
  br i1 %33, label %34, label %35

34:                                               ; preds = %32
  br label %35

35:                                               ; preds = %.lr.ph, %32, %34
  %.1300 = phi i32 [ %.0299317, %34 ], [ %.0299317, %32 ], [ %31, %.lr.ph ]
  %.1296 = phi i32 [ %31, %34 ], [ %.0295319, %32 ], [ %.0295319, %.lr.ph ]
  %.1276 = phi float [ %29, %34 ], [ %.0275322, %32 ], [ %.0275322, %.lr.ph ]
  %.1272 = phi float [ %.0271323, %34 ], [ %.0271323, %32 ], [ %29, %.lr.ph ]
  %36 = getelementptr inbounds i8, ptr %28, i64 4
  %37 = load float, ptr %36, align 4, !tbaa !13
  %38 = fcmp ogt float %37, %.0279321
  br i1 %38, label %42, label %39

39:                                               ; preds = %35
  %40 = fcmp olt float %37, %.0301316
  br i1 %40, label %41, label %42

41:                                               ; preds = %39
  br label %42

42:                                               ; preds = %35, %41, %39
  %.1302 = phi float [ %37, %41 ], [ %.0301316, %39 ], [ %.0301316, %35 ]
  %.1298 = phi i32 [ %.0297318, %41 ], [ %.0297318, %39 ], [ %31, %35 ]
  %.1294 = phi i32 [ %31, %41 ], [ %.0293320, %39 ], [ %.0293320, %35 ]
  %.1280 = phi float [ %.0279321, %41 ], [ %.0279321, %39 ], [ %37, %35 ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !17

._crit_edge:                                      ; preds = %42
  %.not = icmp eq i32 %.1300, %.1298
  br i1 %.not, label %63, label %43

43:                                               ; preds = %._crit_edge
  %44 = sext i32 %.1300 to i64
  %45 = getelementptr inbounds ptr, ptr %20, i64 %44
  %46 = load ptr, ptr %45, align 8, !tbaa !12
  %47 = sext i32 %.1298 to i64
  %48 = getelementptr inbounds ptr, ptr %20, i64 %47
  %49 = load ptr, ptr %48, align 8, !tbaa !12
  %50 = load <2 x float>, ptr %46, align 4, !tbaa !19
  %51 = load <2 x float>, ptr %49, align 4, !tbaa !19
  %52 = fsub <2 x float> %50, %51
  %53 = fpext <2 x float> %52 to <2 x double>
  %54 = extractelement <2 x float> %50, i64 0
  %55 = fpext float %54 to double
  %56 = extractelement <2 x float> %50, i64 1
  %57 = fpext float %56 to double
  %58 = extractelement <2 x double> %53, i64 0
  %59 = fneg double %58
  %60 = fmul double %59, %57
  %61 = extractelement <2 x double> %53, i64 1
  %62 = tail call double @llvm.fmuladd.f64(double %61, double %55, double %60)
  br label %63

63:                                               ; preds = %43, %._crit_edge
  %.0290 = phi double [ %62, %43 ], [ 0.000000e+00, %._crit_edge ]
  %64 = phi <2 x double> [ %53, %43 ], [ zeroinitializer, %._crit_edge ]
  %.not311 = icmp eq i32 %.1298, %.1296
  br i1 %.not311, label %85, label %65

65:                                               ; preds = %63
  %66 = sext i32 %.1298 to i64
  %67 = getelementptr inbounds ptr, ptr %20, i64 %66
  %68 = load ptr, ptr %67, align 8, !tbaa !12
  %69 = sext i32 %.1296 to i64
  %70 = getelementptr inbounds ptr, ptr %20, i64 %69
  %71 = load ptr, ptr %70, align 8, !tbaa !12
  %72 = load <2 x float>, ptr %68, align 4, !tbaa !19
  %73 = load <2 x float>, ptr %71, align 4, !tbaa !19
  %74 = fsub <2 x float> %72, %73
  %75 = fpext <2 x float> %74 to <2 x double>
  %76 = extractelement <2 x float> %72, i64 0
  %77 = fpext float %76 to double
  %78 = extractelement <2 x float> %72, i64 1
  %79 = fpext float %78 to double
  %80 = extractelement <2 x double> %75, i64 0
  %81 = fneg double %80
  %82 = fmul double %81, %79
  %83 = extractelement <2 x double> %75, i64 1
  %84 = tail call double @llvm.fmuladd.f64(double %83, double %77, double %82)
  br label %85

85:                                               ; preds = %65, %63
  %.0287 = phi double [ %84, %65 ], [ 0.000000e+00, %63 ]
  %86 = phi <2 x double> [ %75, %65 ], [ zeroinitializer, %63 ]
  %.not312 = icmp eq i32 %.1296, %.1294
  br i1 %.not312, label %107, label %87

87:                                               ; preds = %85
  %88 = sext i32 %.1296 to i64
  %89 = getelementptr inbounds ptr, ptr %20, i64 %88
  %90 = load ptr, ptr %89, align 8, !tbaa !12
  %91 = sext i32 %.1294 to i64
  %92 = getelementptr inbounds ptr, ptr %20, i64 %91
  %93 = load ptr, ptr %92, align 8, !tbaa !12
  %94 = load <2 x float>, ptr %90, align 4, !tbaa !19
  %95 = load <2 x float>, ptr %93, align 4, !tbaa !19
  %96 = fsub <2 x float> %94, %95
  %97 = fpext <2 x float> %96 to <2 x double>
  %98 = extractelement <2 x float> %94, i64 0
  %99 = fpext float %98 to double
  %100 = extractelement <2 x float> %94, i64 1
  %101 = fpext float %100 to double
  %102 = extractelement <2 x double> %97, i64 0
  %103 = fneg double %102
  %104 = fmul double %103, %101
  %105 = extractelement <2 x double> %97, i64 1
  %106 = tail call double @llvm.fmuladd.f64(double %105, double %99, double %104)
  br label %107

107:                                              ; preds = %87, %85
  %.0284 = phi double [ %106, %87 ], [ 0.000000e+00, %85 ]
  %108 = phi <2 x double> [ %97, %87 ], [ zeroinitializer, %85 ]
  %.not313 = icmp eq i32 %.1294, %.1300
  br i1 %.not313, label %.thread402, label %109

109:                                              ; preds = %107
  %110 = sext i32 %.1294 to i64
  %111 = getelementptr inbounds ptr, ptr %20, i64 %110
  %112 = load ptr, ptr %111, align 8, !tbaa !12
  %113 = sext i32 %.1300 to i64
  %114 = getelementptr inbounds ptr, ptr %20, i64 %113
  %115 = load ptr, ptr %114, align 8, !tbaa !12
  %116 = load <2 x float>, ptr %112, align 4, !tbaa !19
  %117 = load <2 x float>, ptr %115, align 4, !tbaa !19
  %118 = fsub <2 x float> %116, %117
  %119 = fpext <2 x float> %118 to <2 x double>
  %120 = extractelement <2 x float> %116, i64 0
  %121 = fpext float %120 to double
  %122 = extractelement <2 x float> %116, i64 1
  %123 = fpext float %122 to double
  %124 = extractelement <2 x double> %119, i64 0
  %125 = fneg double %124
  %126 = fmul double %125, %123
  %127 = extractelement <2 x double> %119, i64 1
  %128 = tail call double @llvm.fmuladd.f64(double %127, double %121, double %126)
  br label %.thread402

.thread402:                                       ; preds = %18, %109, %107
  %.not313436 = phi i1 [ false, %109 ], [ true, %107 ], [ true, %18 ]
  %.0284435 = phi double [ %.0284, %109 ], [ %.0284, %107 ], [ 0.000000e+00, %18 ]
  %.not311374389432 = phi i1 [ %.not311, %109 ], [ %.not311, %107 ], [ true, %18 ]
  %.0290373390431 = phi double [ %.0290, %109 ], [ %.0290, %107 ], [ 0.000000e+00, %18 ]
  %.0299.lcssa352370393428 = phi i32 [ %.1300, %109 ], [ %.1300, %107 ], [ 0, %18 ]
  %.0297.lcssa353369394427 = phi i32 [ %.1298, %109 ], [ %.1298, %107 ], [ 0, %18 ]
  %.0295.lcssa354368395426 = phi i32 [ %.1296, %109 ], [ %.1296, %107 ], [ 0, %18 ]
  %.0293.lcssa355367396425 = phi i32 [ %.1294, %109 ], [ %.1294, %107 ], [ 0, %18 ]
  %.not356366397424 = phi i1 [ %.not, %109 ], [ %.not, %107 ], [ true, %18 ]
  %.0287400421 = phi double [ %.0287, %109 ], [ %.0287, %107 ], [ 0.000000e+00, %18 ]
  %.not312401420 = phi i1 [ %.not312, %109 ], [ %.not312, %107 ], [ true, %18 ]
  %.0281 = phi double [ %128, %109 ], [ 0.000000e+00, %107 ], [ 0.000000e+00, %18 ]
  %129 = phi <2 x double> [ %119, %109 ], [ zeroinitializer, %107 ], [ zeroinitializer, %18 ]
  %130 = phi <2 x double> [ %108, %109 ], [ %108, %107 ], [ zeroinitializer, %18 ]
  %131 = phi <2 x double> [ %86, %109 ], [ %86, %107 ], [ zeroinitializer, %18 ]
  %132 = phi <2 x double> [ %64, %109 ], [ %64, %107 ], [ zeroinitializer, %18 ]
  %133 = tail call ptr @ListCreate(i32 noundef %21, ptr noundef null) #5
  %134 = load i32, ptr %0, align 8, !tbaa !5
  %135 = tail call ptr @ListCreate(i32 noundef %134, ptr noundef null) #5
  %136 = load i32, ptr %0, align 8, !tbaa !5
  %137 = tail call ptr @ListCreate(i32 noundef %136, ptr noundef null) #5
  %138 = load i32, ptr %0, align 8, !tbaa !5
  %139 = tail call ptr @ListCreate(i32 noundef %138, ptr noundef null) #5
  %140 = load i32, ptr %0, align 8, !tbaa !5
  %141 = icmp sgt i32 %140, 0
  br i1 %141, label %.lr.ph335, label %._crit_edge336

.lr.ph335:                                        ; preds = %.thread402
  %142 = extractelement <2 x double> %132, i64 0
  %143 = fneg double %142
  %144 = getelementptr inbounds i8, ptr %133, i64 8
  %145 = extractelement <2 x double> %131, i64 0
  %146 = fneg double %145
  %147 = getelementptr inbounds i8, ptr %135, i64 8
  %148 = extractelement <2 x double> %130, i64 0
  %149 = fneg double %148
  %150 = getelementptr inbounds i8, ptr %137, i64 8
  %151 = extractelement <2 x double> %129, i64 0
  %152 = fneg double %151
  %153 = getelementptr inbounds i8, ptr %139, i64 8
  %wide.trip.count345 = zext nneg i32 %140 to i64
  %154 = extractelement <2 x double> %129, i64 1
  %155 = extractelement <2 x double> %130, i64 1
  %156 = extractelement <2 x double> %131, i64 1
  %157 = extractelement <2 x double> %132, i64 1
  br label %158

158:                                              ; preds = %.lr.ph335, %226
  %indvars.iv342 = phi i64 [ 0, %.lr.ph335 ], [ %indvars.iv.next343, %226 ]
  %.0266333 = phi i32 [ 0, %.lr.ph335 ], [ %.1, %226 ]
  %.0269331 = phi i32 [ 0, %.lr.ph335 ], [ %.1270, %226 ]
  %.0273330 = phi i32 [ 0, %.lr.ph335 ], [ %.1274, %226 ]
  %.0277329 = phi i32 [ 0, %.lr.ph335 ], [ %.1278, %226 ]
  br i1 %.not356366397424, label %175, label %159

159:                                              ; preds = %158
  %160 = getelementptr inbounds ptr, ptr %20, i64 %indvars.iv342
  %161 = load ptr, ptr %160, align 8, !tbaa !12
  %162 = load float, ptr %161, align 4, !tbaa !16
  %163 = fpext float %162 to double
  %164 = getelementptr inbounds i8, ptr %161, i64 4
  %165 = load float, ptr %164, align 4, !tbaa !13
  %166 = fpext float %165 to double
  %167 = fmul double %143, %166
  %168 = tail call double @llvm.fmuladd.f64(double %157, double %163, double %167)
  %169 = fcmp olt double %168, %.0290373390431
  br i1 %169, label %170, label %175

170:                                              ; preds = %159
  %171 = load ptr, ptr %144, align 8, !tbaa !11
  %172 = sext i32 %.0277329 to i64
  %173 = getelementptr inbounds ptr, ptr %171, i64 %172
  store ptr %161, ptr %173, align 8, !tbaa !12
  %174 = add nsw i32 %.0277329, 1
  br label %226

175:                                              ; preds = %159, %158
  br i1 %.not311374389432, label %192, label %176

176:                                              ; preds = %175
  %177 = getelementptr inbounds ptr, ptr %20, i64 %indvars.iv342
  %178 = load ptr, ptr %177, align 8, !tbaa !12
  %179 = load float, ptr %178, align 4, !tbaa !16
  %180 = fpext float %179 to double
  %181 = getelementptr inbounds i8, ptr %178, i64 4
  %182 = load float, ptr %181, align 4, !tbaa !13
  %183 = fpext float %182 to double
  %184 = fmul double %146, %183
  %185 = tail call double @llvm.fmuladd.f64(double %156, double %180, double %184)
  %186 = fcmp olt double %185, %.0287400421
  br i1 %186, label %187, label %192

187:                                              ; preds = %176
  %188 = load ptr, ptr %147, align 8, !tbaa !11
  %189 = sext i32 %.0273330 to i64
  %190 = getelementptr inbounds ptr, ptr %188, i64 %189
  store ptr %178, ptr %190, align 8, !tbaa !12
  %191 = add nsw i32 %.0273330, 1
  br label %226

192:                                              ; preds = %176, %175
  br i1 %.not312401420, label %209, label %193

193:                                              ; preds = %192
  %194 = getelementptr inbounds ptr, ptr %20, i64 %indvars.iv342
  %195 = load ptr, ptr %194, align 8, !tbaa !12
  %196 = load float, ptr %195, align 4, !tbaa !16
  %197 = fpext float %196 to double
  %198 = getelementptr inbounds i8, ptr %195, i64 4
  %199 = load float, ptr %198, align 4, !tbaa !13
  %200 = fpext float %199 to double
  %201 = fmul double %149, %200
  %202 = tail call double @llvm.fmuladd.f64(double %155, double %197, double %201)
  %203 = fcmp olt double %202, %.0284435
  br i1 %203, label %204, label %209

204:                                              ; preds = %193
  %205 = load ptr, ptr %150, align 8, !tbaa !11
  %206 = sext i32 %.0269331 to i64
  %207 = getelementptr inbounds ptr, ptr %205, i64 %206
  store ptr %195, ptr %207, align 8, !tbaa !12
  %208 = add nsw i32 %.0269331, 1
  br label %226

209:                                              ; preds = %193, %192
  br i1 %.not313436, label %226, label %210

210:                                              ; preds = %209
  %211 = getelementptr inbounds ptr, ptr %20, i64 %indvars.iv342
  %212 = load ptr, ptr %211, align 8, !tbaa !12
  %213 = load float, ptr %212, align 4, !tbaa !16
  %214 = fpext float %213 to double
  %215 = getelementptr inbounds i8, ptr %212, i64 4
  %216 = load float, ptr %215, align 4, !tbaa !13
  %217 = fpext float %216 to double
  %218 = fmul double %152, %217
  %219 = tail call double @llvm.fmuladd.f64(double %154, double %214, double %218)
  %220 = fcmp olt double %219, %.0281
  br i1 %220, label %221, label %226

221:                                              ; preds = %210
  %222 = load ptr, ptr %153, align 8, !tbaa !11
  %223 = sext i32 %.0266333 to i64
  %224 = getelementptr inbounds ptr, ptr %222, i64 %223
  store ptr %212, ptr %224, align 8, !tbaa !12
  %225 = add nsw i32 %.0266333, 1
  br label %226

226:                                              ; preds = %209, %210, %221, %204, %187, %170
  %.1278 = phi i32 [ %174, %170 ], [ %.0277329, %187 ], [ %.0277329, %204 ], [ %.0277329, %221 ], [ %.0277329, %210 ], [ %.0277329, %209 ]
  %.1274 = phi i32 [ %.0273330, %170 ], [ %191, %187 ], [ %.0273330, %204 ], [ %.0273330, %221 ], [ %.0273330, %210 ], [ %.0273330, %209 ]
  %.1270 = phi i32 [ %.0269331, %170 ], [ %.0269331, %187 ], [ %208, %204 ], [ %.0269331, %221 ], [ %.0269331, %210 ], [ %.0269331, %209 ]
  %.1 = phi i32 [ %.0266333, %170 ], [ %.0266333, %187 ], [ %.0266333, %204 ], [ %225, %221 ], [ %.0266333, %210 ], [ %.0266333, %209 ]
  %indvars.iv.next343 = add nuw nsw i64 %indvars.iv342, 1
  %exitcond346.not = icmp eq i64 %indvars.iv.next343, %wide.trip.count345
  br i1 %exitcond346.not, label %._crit_edge336, label %158, !llvm.loop !20

._crit_edge336:                                   ; preds = %226, %.thread402
  %.0277.lcssa = phi i32 [ 0, %.thread402 ], [ %.1278, %226 ]
  %.0273.lcssa = phi i32 [ 0, %.thread402 ], [ %.1274, %226 ]
  %.0269.lcssa = phi i32 [ 0, %.thread402 ], [ %.1270, %226 ]
  %.0266.lcssa = phi i32 [ 0, %.thread402 ], [ %.1, %226 ]
  store i32 %.0277.lcssa, ptr %133, align 8, !tbaa !5
  store i32 %.0273.lcssa, ptr %135, align 8, !tbaa !5
  store i32 %.0269.lcssa, ptr %137, align 8, !tbaa !5
  store i32 %.0266.lcssa, ptr %139, align 8, !tbaa !5
  %227 = tail call ptr (...) @mChainCreate() #5
  br i1 %.not356366397424, label %234, label %228

228:                                              ; preds = %._crit_edge336
  %229 = tail call ptr @mChainNode(ptr noundef %227, ptr noundef null, i32 noundef -1) #5
  %230 = sext i32 %.0299.lcssa352370393428 to i64
  %231 = getelementptr inbounds ptr, ptr %20, i64 %230
  %232 = load ptr, ptr %231, align 8, !tbaa !12
  store ptr %232, ptr %229, align 8, !tbaa !21
  %233 = getelementptr inbounds i8, ptr %227, i64 8
  store ptr %229, ptr %233, align 8, !tbaa !23
  br label %234

234:                                              ; preds = %228, %._crit_edge336
  %.0264 = phi ptr [ %229, %228 ], [ null, %._crit_edge336 ]
  br i1 %.not311374389432, label %245, label %235

235:                                              ; preds = %234
  %236 = tail call ptr @mChainNode(ptr noundef %227, ptr noundef null, i32 noundef -1) #5
  %237 = sext i32 %.0297.lcssa353369394427 to i64
  %238 = getelementptr inbounds ptr, ptr %20, i64 %237
  %239 = load ptr, ptr %238, align 8, !tbaa !12
  store ptr %239, ptr %236, align 8, !tbaa !21
  %240 = getelementptr inbounds i8, ptr %227, i64 8
  %241 = load ptr, ptr %240, align 8, !tbaa !23
  %242 = icmp eq ptr %241, null
  br i1 %242, label %243, label %244

243:                                              ; preds = %235
  store ptr %236, ptr %240, align 8, !tbaa !23
  br label %245

244:                                              ; preds = %235
  tail call void @mChainNodeInsert(ptr noundef null, ptr noundef nonnull %236, ptr noundef nonnull %241) #5
  br label %245

245:                                              ; preds = %243, %244, %234
  %.0263 = phi ptr [ %236, %243 ], [ %236, %244 ], [ null, %234 ]
  br i1 %.not312401420, label %256, label %246

246:                                              ; preds = %245
  %247 = tail call ptr @mChainNode(ptr noundef %227, ptr noundef null, i32 noundef -1) #5
  %248 = sext i32 %.0295.lcssa354368395426 to i64
  %249 = getelementptr inbounds ptr, ptr %20, i64 %248
  %250 = load ptr, ptr %249, align 8, !tbaa !12
  store ptr %250, ptr %247, align 8, !tbaa !21
  %251 = getelementptr inbounds i8, ptr %227, i64 8
  %252 = load ptr, ptr %251, align 8, !tbaa !23
  %253 = icmp eq ptr %252, null
  br i1 %253, label %254, label %255

254:                                              ; preds = %246
  store ptr %247, ptr %251, align 8, !tbaa !23
  br label %256

255:                                              ; preds = %246
  tail call void @mChainNodeInsert(ptr noundef null, ptr noundef nonnull %247, ptr noundef nonnull %252) #5
  br label %256

256:                                              ; preds = %254, %255, %245
  %.0262 = phi ptr [ %247, %254 ], [ %247, %255 ], [ null, %245 ]
  br i1 %.not313436, label %267, label %257

257:                                              ; preds = %256
  %258 = tail call ptr @mChainNode(ptr noundef %227, ptr noundef null, i32 noundef -1) #5
  %259 = sext i32 %.0293.lcssa355367396425 to i64
  %260 = getelementptr inbounds ptr, ptr %20, i64 %259
  %261 = load ptr, ptr %260, align 8, !tbaa !12
  store ptr %261, ptr %258, align 8, !tbaa !21
  %262 = getelementptr inbounds i8, ptr %227, i64 8
  %263 = load ptr, ptr %262, align 8, !tbaa !23
  %264 = icmp eq ptr %263, null
  br i1 %264, label %265, label %266

265:                                              ; preds = %257
  store ptr %258, ptr %262, align 8, !tbaa !23
  br label %267

266:                                              ; preds = %257
  tail call void @mChainNodeInsert(ptr noundef null, ptr noundef nonnull %258, ptr noundef nonnull %263) #5
  br label %267

267:                                              ; preds = %265, %266, %256
  %.0261 = phi ptr [ %258, %265 ], [ %258, %266 ], [ null, %256 ]
  %268 = icmp sgt i32 %.0277.lcssa, 0
  br i1 %268, label %269, label %270

269:                                              ; preds = %267
  tail call void @ConvexHull(ptr noundef nonnull %133, ptr noundef %227, ptr noundef %.0264)
  br label %270

270:                                              ; preds = %269, %267
  %271 = icmp sgt i32 %.0273.lcssa, 0
  br i1 %271, label %272, label %273

272:                                              ; preds = %270
  tail call void @ConvexHull(ptr noundef nonnull %135, ptr noundef %227, ptr noundef %.0263)
  br label %273

273:                                              ; preds = %272, %270
  %274 = icmp sgt i32 %.0269.lcssa, 0
  br i1 %274, label %275, label %276

275:                                              ; preds = %273
  tail call void @ConvexHull(ptr noundef nonnull %137, ptr noundef %227, ptr noundef %.0262)
  br label %276

276:                                              ; preds = %275, %273
  %277 = icmp sgt i32 %.0266.lcssa, 0
  br i1 %277, label %278, label %279

278:                                              ; preds = %276
  tail call void @ConvexHull(ptr noundef nonnull %139, ptr noundef %227, ptr noundef %.0261)
  br label %279

279:                                              ; preds = %278, %276
  %280 = getelementptr inbounds i8, ptr %227, i64 8
  %281 = load ptr, ptr %280, align 8, !tbaa !23
  store i32 0, ptr %.0265, align 8, !tbaa !5
  br label %282

282:                                              ; preds = %282, %279
  %.0 = phi ptr [ %281, %279 ], [ %286, %282 ]
  %283 = load ptr, ptr %.0, align 8, !tbaa !21
  %284 = tail call ptr @mListWrite(ptr noundef nonnull %.0265, i32 noundef -1, ptr noundef %283, i32 noundef 8) #5
  %285 = getelementptr inbounds i8, ptr %.0, i64 16
  %286 = load ptr, ptr %285, align 8, !tbaa !24
  %287 = load ptr, ptr %280, align 8, !tbaa !23
  %288 = icmp eq ptr %286, %287
  br i1 %288, label %289, label %282

289:                                              ; preds = %282
  tail call void @mListRelease(ptr noundef nonnull %133) #5
  tail call void @mListRelease(ptr noundef nonnull %135) #5
  tail call void @mListRelease(ptr noundef nonnull %137) #5
  tail call void @mListRelease(ptr noundef nonnull %139) #5
  tail call void @mChainRelease(ptr noundef nonnull %227) #5
  %290 = load i32, ptr %.0265, align 8, !tbaa !5
  %.not314 = icmp eq i32 %290, 0
  br i1 %.not314, label %298, label %291

291:                                              ; preds = %289
  %292 = getelementptr inbounds i8, ptr %.0265, i64 8
  %293 = load ptr, ptr %292, align 8, !tbaa !11
  %294 = load ptr, ptr %293, align 8, !tbaa !12
  %295 = tail call ptr @mListWrite(ptr noundef nonnull %.0265, i32 noundef -1, ptr noundef %294, i32 noundef 8) #5
  %296 = load i32, ptr %.0265, align 8, !tbaa !5
  %297 = add nsw i32 %296, -1
  store i32 %297, ptr %.0265, align 8, !tbaa !5
  br label %298

298:                                              ; preds = %291, %289
  %.not315 = icmp eq ptr %.0265, %1
  br i1 %.not315, label %300, label %299

299:                                              ; preds = %298
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %3, ptr noundef nonnull align 8 dereferenceable(16) %.0265, i64 16, i1 false), !tbaa.struct !25
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %.0265, ptr noundef nonnull align 8 dereferenceable(16) %0, i64 16, i1 false), !tbaa.struct !25
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %0, ptr noundef nonnull align 8 dereferenceable(16) %3, i64 16, i1 false), !tbaa.struct !25
  tail call void @HandleExchange(ptr noundef nonnull %.0265, ptr noundef nonnull %0) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)
  tail call void @mListRelease(ptr noundef nonnull %.0265) #5
  br label %300

300:                                              ; preds = %299, %298
  ret void
}

declare ptr @mChainCreate(...) local_unnamed_addr #2

declare void @mChainRelease(ptr noundef) local_unnamed_addr #2

declare void @HandleExchange(ptr noundef, ptr noundef) local_unnamed_addr #2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"MList", !7, i64 0, !10, i64 8}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!6, !10, i64 8}
!12 = !{!10, !10, i64 0}
!13 = !{!14, !15, i64 4}
!14 = !{!"MImagePoint", !15, i64 0, !15, i64 4}
!15 = !{!"float", !8, i64 0}
!16 = !{!14, !15, i64 0}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = !{!15, !15, i64 0}
!20 = distinct !{!20, !18}
!21 = !{!22, !10, i64 0}
!22 = !{!"MChainNode", !10, i64 0, !10, i64 8, !10, i64 16}
!23 = !{!8, !8, i64 0}
!24 = !{!22, !10, i64 16}
!25 = !{i64 0, i64 4, !26, i64 8, i64 8, !12}
!26 = !{!7, !7, i64 0}


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