; LLVM IR from robinrodricks/InspiritImage :: Inspirit.Assurf/clib (utils)

; 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._IPointMatch = type { ptr, ptr, ptr, double, double, i32, i32, i32 }
%struct._IPoint = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, double, double, i32, i32, i32, double, ptr, i32, [256 x i8] }

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

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

; Function Attrs: nounwind uwtable
declare dso_local i32 @solve_deg2(double noundef, double noundef, double noundef, ptr noundef, ptr noundef) #1

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

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #3

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #3

; Function Attrs: inlinehint nounwind uwtable
declare i32 @IMIN(i32 noundef, i32 noundef) #4

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

; Function Attrs: inlinehint nounwind uwtable
declare i32 @IMAX(i32 noundef, i32 noundef) #4

; Function Attrs: nounwind uwtable
define dso_local void @perpendicularRegression(ptr noundef %0, i32 noundef %1, ptr noundef %2) #1 {
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca double, align 8
  %9 = alloca double, align 8
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca ptr, align 8
  %15 = alloca i64, align 8
  %16 = alloca ptr, align 8
  %17 = alloca double, align 8
  %18 = alloca double, align 8
  %19 = alloca ptr, 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 i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i32 %1, ptr %5, align 4, !tbaa !9
  store ptr %2, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #6
  store double 0.000000e+00, ptr %8, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #6
  store double 0.000000e+00, ptr %9, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #6
  store i32 1000, ptr %10, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #6
  store i32 0, ptr %11, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #6
  store i32 1000, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #6
  store i32 0, ptr %13, align 4, !tbaa !9
  %38 = load i32, ptr %5, align 4, !tbaa !9
  %39 = zext i32 %38 to i64
  %40 = call ptr @llvm.stacksave.p0()
  store ptr %40, ptr %14, align 8
  %41 = alloca i32, i64 %39, align 16
  store i64 %39, ptr %15, align 8
  store i32 0, ptr %7, align 4, !tbaa !9
  br label %42

42:                                               ; preds = %88, %3
  %43 = load i32, ptr %7, align 4, !tbaa !9
  %44 = load i32, ptr %5, align 4, !tbaa !9
  %45 = icmp slt i32 %43, %44
  br i1 %45, label %46, label %91

46:                                               ; preds = %42
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #6
  %47 = load ptr, ptr %4, align 8, !tbaa !5
  %48 = load i32, ptr %7, align 4, !tbaa !9
  %49 = sext i32 %48 to i64
  %50 = getelementptr inbounds %struct._IPointMatch, ptr %47, i64 %49
  %51 = getelementptr inbounds %struct._IPointMatch, ptr %50, i32 0, i32 0
  %52 = load ptr, ptr %51, align 8, !tbaa !13
  store ptr %52, ptr %16, align 8, !tbaa !5
  %53 = load ptr, ptr %16, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct._IPoint, ptr %53, i32 0, i32 4
  %55 = load i32, ptr %54, align 8, !tbaa !15
  %56 = sitofp i32 %55 to double
  %57 = load double, ptr %8, align 8, !tbaa !11
  %58 = fadd double %57, %56
  store double %58, ptr %8, align 8, !tbaa !11
  %59 = load ptr, ptr %16, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct._IPoint, ptr %59, i32 0, i32 5
  %61 = load i32, ptr %60, align 4, !tbaa !17
  %62 = sitofp i32 %61 to double
  %63 = load double, ptr %9, align 8, !tbaa !11
  %64 = fadd double %63, %62
  store double %64, ptr %9, align 8, !tbaa !11
  %65 = load i32, ptr %10, align 4, !tbaa !9
  %66 = load ptr, ptr %16, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct._IPoint, ptr %66, i32 0, i32 4
  %68 = load i32, ptr %67, align 8, !tbaa !15
  %69 = call i32 @IMIN(i32 noundef %65, i32 noundef %68)
  store i32 %69, ptr %10, align 4, !tbaa !9
  %70 = load i32, ptr %11, align 4, !tbaa !9
  %71 = load ptr, ptr %16, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct._IPoint, ptr %71, i32 0, i32 4
  %73 = load i32, ptr %72, align 8, !tbaa !15
  %74 = call i32 @IMAX(i32 noundef %70, i32 noundef %73)
  store i32 %74, ptr %11, align 4, !tbaa !9
  %75 = load i32, ptr %12, align 4, !tbaa !9
  %76 = load ptr, ptr %16, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct._IPoint, ptr %76, i32 0, i32 5
  %78 = load i32, ptr %77, align 4, !tbaa !17
  %79 = call i32 @IMIN(i32 noundef %75, i32 noundef %78)
  store i32 %79, ptr %12, align 4, !tbaa !9
  %80 = load i32, ptr %13, align 4, !tbaa !9
  %81 = load ptr, ptr %16, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct._IPoint, ptr %81, i32 0, i32 5
  %83 = load i32, ptr %82, align 4, !tbaa !17
  %84 = call i32 @IMAX(i32 noundef %80, i32 noundef %83)
  store i32 %84, ptr %13, align 4, !tbaa !9
  %85 = load i32, ptr %7, align 4, !tbaa !9
  %86 = sext i32 %85 to i64
  %87 = getelementptr inbounds i32, ptr %41, i64 %86
  store i32 0, ptr %87, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  br label %88

88:                                               ; preds = %46
  %89 = load i32, ptr %7, align 4, !tbaa !9
  %90 = add nsw i32 %89, 1
  store i32 %90, ptr %7, align 4, !tbaa !9
  br label %42, !llvm.loop !18

91:                                               ; preds = %42
  %92 = load i32, ptr %5, align 4, !tbaa !9
  %93 = sitofp i32 %92 to double
  %94 = load double, ptr %8, align 8, !tbaa !11
  %95 = fdiv double %94, %93
  store double %95, ptr %8, align 8, !tbaa !11
  %96 = load i32, ptr %5, align 4, !tbaa !9
  %97 = sitofp i32 %96 to double
  %98 = load double, ptr %9, align 8, !tbaa !11
  %99 = fdiv double %98, %97
  store double %99, ptr %9, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #6
  store double 0.000000e+00, ptr %17, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  store double 0.000000e+00, ptr %18, align 8, !tbaa !11
  store i32 0, ptr %7, align 4, !tbaa !9
  br label %100

100:                                              ; preds = %136, %91
  %101 = load i32, ptr %7, align 4, !tbaa !9
  %102 = load i32, ptr %5, align 4, !tbaa !9
  %103 = icmp slt i32 %101, %102
  br i1 %103, label %104, label %139

104:                                              ; preds = %100
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #6
  %105 = load ptr, ptr %4, align 8, !tbaa !5
  %106 = load i32, ptr %7, align 4, !tbaa !9
  %107 = sext i32 %106 to i64
  %108 = getelementptr inbounds %struct._IPointMatch, ptr %105, i64 %107
  %109 = getelementptr inbounds %struct._IPointMatch, ptr %108, i32 0, i32 0
  %110 = load ptr, ptr %109, align 8, !tbaa !13
  store ptr %110, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #6
  %111 = load ptr, ptr %19, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct._IPoint, ptr %111, i32 0, i32 4
  %113 = load i32, ptr %112, align 8, !tbaa !15
  %114 = sitofp i32 %113 to double
  %115 = load double, ptr %8, align 8, !tbaa !11
  %116 = fsub double %114, %115
  store double %116, ptr %20, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #6
  %117 = load ptr, ptr %19, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct._IPoint, ptr %117, i32 0, i32 5
  %119 = load i32, ptr %118, align 4, !tbaa !17
  %120 = sitofp i32 %119 to double
  %121 = load double, ptr %9, align 8, !tbaa !11
  %122 = fsub double %120, %121
  store double %122, ptr %21, align 8, !tbaa !11
  %123 = load double, ptr %20, align 8, !tbaa !11
  %124 = load double, ptr %21, align 8, !tbaa !11
  %125 = load double, ptr %17, align 8, !tbaa !11
  %126 = call double @llvm.fmuladd.f64(double %123, double %124, double %125)
  store double %126, ptr %17, align 8, !tbaa !11
  %127 = load double, ptr %20, align 8, !tbaa !11
  %128 = load double, ptr %20, align 8, !tbaa !11
  %129 = load double, ptr %21, align 8, !tbaa !11
  %130 = load double, ptr %21, align 8, !tbaa !11
  %131 = fmul double %129, %130
  %132 = fneg double %131
  %133 = call double @llvm.fmuladd.f64(double %127, double %128, double %132)
  %134 = load double, ptr %18, align 8, !tbaa !11
  %135 = fadd double %134, %133
  store double %135, ptr %18, align 8, !tbaa !11
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #6
  br label %136

136:                                              ; preds = %104
  %137 = load i32, ptr %7, align 4, !tbaa !9
  %138 = add nsw i32 %137, 1
  store i32 %138, ptr %7, align 4, !tbaa !9
  br label %100, !llvm.loop !20

139:                                              ; preds = %100
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #6
  %140 = load double, ptr %18, align 8, !tbaa !11
  %141 = load double, ptr %17, align 8, !tbaa !11
  %142 = fdiv double %140, %141
  store double %142, ptr %22, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #6
  store double 0x404CA5DC1A63C1F8, ptr %23, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  store double 0.000000e+00, ptr %24, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #6
  store double 0.000000e+00, ptr %25, align 8, !tbaa !11
  %143 = load double, ptr %22, align 8, !tbaa !11
  %144 = call i32 @solve_deg2(double noundef 1.000000e+00, double noundef %143, double noundef -1.000000e+00, ptr noundef %24, ptr noundef %25)
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #6
  %145 = load double, ptr %24, align 8, !tbaa !11
  %146 = call double @atan(double noundef %145) #6
  %147 = fmul double %146, 0x404CA5DC1A63C1F8
  store double %147, ptr %26, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #6
  %148 = load double, ptr %25, align 8, !tbaa !11
  %149 = call double @atan(double noundef %148) #6
  %150 = fmul double %149, 0x404CA5DC1A63C1F8
  store double %150, ptr %27, align 8, !tbaa !11
  %151 = load double, ptr %26, align 8, !tbaa !11
  %152 = fcmp olt double %151, 0.000000e+00
  br i1 %152, label %153, label %156

153:                                              ; preds = %139
  %154 = load double, ptr %26, align 8, !tbaa !11
  %155 = fadd double %154, 3.600000e+02
  store double %155, ptr %26, align 8, !tbaa !11
  br label %156

156:                                              ; preds = %153, %139
  %157 = load double, ptr %27, align 8, !tbaa !11
  %158 = fcmp olt double %157, 0.000000e+00
  br i1 %158, label %159, label %162

159:                                              ; preds = %156
  %160 = load double, ptr %27, align 8, !tbaa !11
  %161 = fadd double %160, 3.600000e+02
  store double %161, ptr %27, align 8, !tbaa !11
  br label %162

162:                                              ; preds = %159, %156
  %163 = load double, ptr %26, align 8, !tbaa !11
  %164 = fcmp ogt double %163, 3.600000e+02
  br i1 %164, label %165, label %168

165:                                              ; preds = %162
  %166 = load double, ptr %26, align 8, !tbaa !11
  %167 = fsub double %166, 3.600000e+02
  store double %167, ptr %26, align 8, !tbaa !11
  br label %168

168:                                              ; preds = %165, %162
  %169 = load double, ptr %27, align 8, !tbaa !11
  %170 = fcmp ogt double %169, 3.600000e+02
  br i1 %170, label %171, label %174

171:                                              ; preds = %168
  %172 = load double, ptr %27, align 8, !tbaa !11
  %173 = fsub double %172, 3.600000e+02
  store double %173, ptr %27, align 8, !tbaa !11
  br label %174

174:                                              ; preds = %171, %168
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #6
  %175 = load double, ptr %9, align 8, !tbaa !11
  %176 = load double, ptr %24, align 8, !tbaa !11
  %177 = load double, ptr %8, align 8, !tbaa !11
  %178 = fneg double %176
  %179 = call double @llvm.fmuladd.f64(double %178, double %177, double %175)
  store double %179, ptr %28, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #6
  %180 = load double, ptr %9, align 8, !tbaa !11
  %181 = load double, ptr %25, align 8, !tbaa !11
  %182 = load double, ptr %8, align 8, !tbaa !11
  %183 = fneg double %181
  %184 = call double @llvm.fmuladd.f64(double %183, double %182, double %180)
  store double %184, ptr %29, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #6
  %185 = load double, ptr %27, align 8, !tbaa !11
  %186 = fcmp oge double %185, 4.500000e+01
  br i1 %186, label %187, label %190

187:                                              ; preds = %174
  %188 = load double, ptr %27, align 8, !tbaa !11
  %189 = fcmp ole double %188, 1.350000e+02
  br i1 %189, label %196, label %190

190:                                              ; preds = %187, %174
  %191 = load double, ptr %27, align 8, !tbaa !11
  %192 = fcmp oge double %191, 2.250000e+02
  br i1 %192, label %193, label %213

193:                                              ; preds = %190
  %194 = load double, ptr %27, align 8, !tbaa !11
  %195 = fcmp ole double %194, 3.150000e+02
  br i1 %195, label %196, label %213

196:                                              ; preds = %193, %187
  %197 = load i32, ptr %12, align 4, !tbaa !9
  %198 = sitofp i32 %197 to double
  %199 = load double, ptr %29, align 8, !tbaa !11
  %200 = fsub double %198, %199
  %201 = load double, ptr %25, align 8, !tbaa !11
  %202 = fdiv double %200, %201
  %203 = fptosi double %202 to i32
  store i32 %203, ptr %30, align 4, !tbaa !9
  %204 = load i32, ptr %12, align 4, !tbaa !9
  store i32 %204, ptr %31, align 4, !tbaa !9
  %205 = load i32, ptr %13, align 4, !tbaa !9
  %206 = sitofp i32 %205 to double
  %207 = load double, ptr %29, align 8, !tbaa !11
  %208 = fsub double %206, %207
  %209 = load double, ptr %25, align 8, !tbaa !11
  %210 = fdiv double %208, %209
  %211 = fptosi double %210 to i32
  store i32 %211, ptr %32, align 4, !tbaa !9
  %212 = load i32, ptr %13, align 4, !tbaa !9
  store i32 %212, ptr %33, align 4, !tbaa !9
  br label %228

213:                                              ; preds = %193, %190
  %214 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %214, ptr %30, align 4, !tbaa !9
  %215 = load double, ptr %29, align 8, !tbaa !11
  %216 = load double, ptr %25, align 8, !tbaa !11
  %217 = load i32, ptr %10, align 4, !tbaa !9
  %218 = sitofp i32 %217 to double
  %219 = call double @llvm.fmuladd.f64(double %216, double %218, double %215)
  %220 = fptosi double %219 to i32
  store i32 %220, ptr %31, align 4, !tbaa !9
  %221 = load i32, ptr %11, align 4, !tbaa !9
  store i32 %221, ptr %32, align 4, !tbaa !9
  %222 = load double, ptr %29, align 8, !tbaa !11
  %223 = load double, ptr %25, align 8, !tbaa !11
  %224 = load i32, ptr %11, align 4, !tbaa !9
  %225 = sitofp i32 %224 to double
  %226 = call double @llvm.fmuladd.f64(double %223, double %225, double %222)
  %227 = fptosi double %226 to i32
  store i32 %227, ptr %33, align 4, !tbaa !9
  br label %228

228:                                              ; preds = %213, %196
  %229 = load double, ptr %26, align 8, !tbaa !11
  %230 = fcmp oge double %229, 4.500000e+01
  br i1 %230, label %231, label %234

231:                                              ; preds = %228
  %232 = load double, ptr %26, align 8, !tbaa !11
  %233 = fcmp ole double %232, 1.350000e+02
  br i1 %233, label %240, label %234

234:                                              ; preds = %231, %228
  %235 = load double, ptr %26, align 8, !tbaa !11
  %236 = fcmp oge double %235, 2.250000e+02
  br i1 %236, label %237, label %257

237:                                              ; preds = %234
  %238 = load double, ptr %26, align 8, !tbaa !11
  %239 = fcmp ole double %238, 3.150000e+02
  br i1 %239, label %240, label %257

240:                                              ; preds = %237, %231
  %241 = load i32, ptr %12, align 4, !tbaa !9
  %242 = sitofp i32 %241 to double
  %243 = load double, ptr %28, align 8, !tbaa !11
  %244 = fsub double %242, %243
  %245 = load double, ptr %24, align 8, !tbaa !11
  %246 = fdiv double %244, %245
  %247 = fptosi double %246 to i32
  store i32 %247, ptr %34, align 4, !tbaa !9
  %248 = load i32, ptr %12, align 4, !tbaa !9
  store i32 %248, ptr %35, align 4, !tbaa !9
  %249 = load i32, ptr %13, align 4, !tbaa !9
  %250 = sitofp i32 %249 to double
  %251 = load double, ptr %28, align 8, !tbaa !11
  %252 = fsub double %250, %251
  %253 = load double, ptr %24, align 8, !tbaa !11
  %254 = fdiv double %252, %253
  %255 = fptosi double %254 to i32
  store i32 %255, ptr %36, align 4, !tbaa !9
  %256 = load i32, ptr %13, align 4, !tbaa !9
  store i32 %256, ptr %37, align 4, !tbaa !9
  br label %272

257:                                              ; preds = %237, %234
  %258 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %258, ptr %34, align 4, !tbaa !9
  %259 = load double, ptr %28, align 8, !tbaa !11
  %260 = load double, ptr %24, align 8, !tbaa !11
  %261 = load i32, ptr %10, align 4, !tbaa !9
  %262 = sitofp i32 %261 to double
  %263 = call double @llvm.fmuladd.f64(double %260, double %262, double %259)
  %264 = fptosi double %263 to i32
  store i32 %264, ptr %35, align 4, !tbaa !9
  %265 = load i32, ptr %11, align 4, !tbaa !9
  store i32 %265, ptr %36, align 4, !tbaa !9
  %266 = load double, ptr %28, align 8, !tbaa !11
  %267 = load double, ptr %24, align 8, !tbaa !11
  %268 = load i32, ptr %11, align 4, !tbaa !9
  %269 = sitofp i32 %268 to double
  %270 = call double @llvm.fmuladd.f64(double %267, double %269, double %266)
  %271 = fptosi double %270 to i32
  store i32 %271, ptr %37, align 4, !tbaa !9
  br label %272

272:                                              ; preds = %257, %240
  %273 = load i32, ptr %30, align 4, !tbaa !9
  %274 = load i32, ptr %31, align 4, !tbaa !9
  %275 = load ptr, ptr %4, align 8, !tbaa !5
  %276 = load i32, ptr %5, align 4, !tbaa !9
  %277 = load ptr, ptr %6, align 8, !tbaa !5
  call void @get2ClosestPoints(i32 noundef %273, i32 noundef %274, ptr noundef %275, i32 noundef %276, ptr noundef %277, ptr noundef %41)
  %278 = load i32, ptr %32, align 4, !tbaa !9
  %279 = load i32, ptr %33, align 4, !tbaa !9
  %280 = load ptr, ptr %4, align 8, !tbaa !5
  %281 = load i32, ptr %5, align 4, !tbaa !9
  %282 = load ptr, ptr %6, align 8, !tbaa !5
  %283 = getelementptr inbounds %struct._IPointMatch, ptr %282, i64 2
  call void @get2ClosestPoints(i32 noundef %278, i32 noundef %279, ptr noundef %280, i32 noundef %281, ptr noundef %283, ptr noundef %41)
  %284 = load i32, ptr %34, align 4, !tbaa !9
  %285 = load i32, ptr %35, align 4, !tbaa !9
  %286 = load ptr, ptr %4, align 8, !tbaa !5
  %287 = load i32, ptr %5, align 4, !tbaa !9
  %288 = load ptr, ptr %6, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct._IPointMatch, ptr %288, i64 4
  call void @get2ClosestPoints(i32 noundef %284, i32 noundef %285, ptr noundef %286, i32 noundef %287, ptr noundef %289, ptr noundef %41)
  %290 = load i32, ptr %36, align 4, !tbaa !9
  %291 = load i32, ptr %37, align 4, !tbaa !9
  %292 = load ptr, ptr %4, align 8, !tbaa !5
  %293 = load i32, ptr %5, align 4, !tbaa !9
  %294 = load ptr, ptr %6, align 8, !tbaa !5
  %295 = getelementptr inbounds %struct._IPointMatch, ptr %294, i64 6
  call void @get2ClosestPoints(i32 noundef %290, i32 noundef %291, ptr noundef %292, i32 noundef %293, ptr noundef %295, ptr noundef %41)
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #6
  %296 = load ptr, ptr %14, align 8
  call void @llvm.stackrestore.p0(ptr %296)
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #6
  ret void
}

; Function Attrs: nounwind
declare double @atan(double noundef) #5

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { nocallback nofree nosync nounwind willreturn }
attributes #4 = { 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 #5 = { 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 #6 = { 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, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!14, !6, i64 0}
!14 = !{!"_IPointMatch", !6, i64 0, !6, i64 8, !6, i64 16, !12, i64 24, !12, i64 32, !10, i64 40, !10, i64 44, !10, i64 48}
!15 = !{!16, !10, i64 16}
!16 = !{!"_IPoint", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !12, i64 40, !12, i64 48, !10, i64 56, !10, i64 60, !10, i64 64, !12, i64 72, !6, i64 80, !10, i64 88, !7, i64 92}
!17 = !{!16, !10, i64 20}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = distinct !{!20, !19}


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

; 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 willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nounwind uwtable
declare dso_local i32 @solve_deg2(double noundef, double noundef, double noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

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

; Function Attrs: inlinehint nounwind uwtable
declare i32 @IMIN(i32 noundef, i32 noundef) local_unnamed_addr #3

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

; Function Attrs: inlinehint nounwind uwtable
declare i32 @IMAX(i32 noundef, i32 noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
define dso_local void @perpendicularRegression(ptr noundef %0, i32 noundef %1, ptr noundef %2) local_unnamed_addr #1 {
  %4 = alloca double, align 8
  %5 = alloca double, align 8
  %6 = zext i32 %1 to i64
  %7 = alloca i32, i64 %6, align 16
  %8 = icmp sgt i32 %1, 0
  br i1 %8, label %.lr.ph, label %._crit_edge.thread

._crit_edge.thread:                               ; preds = %3
  %9 = sitofp i32 %1 to double
  %10 = insertelement <2 x double> poison, double %9, i64 0
  %11 = fdiv <2 x double> <double 0.000000e+00, double poison>, %10
  %12 = shufflevector <2 x double> %11, <2 x double> poison, <2 x i32> zeroinitializer
  br label %._crit_edge156

.lr.ph:                                           ; preds = %3, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %3 ]
  %.0128142 = phi i32 [ %22, %.lr.ph ], [ 1000, %3 ]
  %.0129141 = phi i32 [ %24, %.lr.ph ], [ 0, %3 ]
  %.0130140 = phi i32 [ %26, %.lr.ph ], [ 1000, %3 ]
  %.0131139 = phi i32 [ %28, %.lr.ph ], [ 0, %3 ]
  %13 = phi <2 x double> [ %20, %.lr.ph ], [ zeroinitializer, %3 ]
  %14 = getelementptr inbounds %struct._IPointMatch, ptr %0, i64 %indvars.iv
  %15 = load ptr, ptr %14, align 8, !tbaa !5
  %16 = getelementptr inbounds i8, ptr %15, i64 16
  %17 = getelementptr inbounds i8, ptr %15, i64 20
  %18 = load <2 x i32>, ptr %16, align 8, !tbaa !12
  %19 = sitofp <2 x i32> %18 to <2 x double>
  %20 = fadd <2 x double> %13, %19
  %21 = extractelement <2 x i32> %18, i64 0
  %22 = tail call i32 @IMIN(i32 noundef %.0128142, i32 noundef %21)
  %23 = load i32, ptr %16, align 8, !tbaa !13
  %24 = tail call i32 @IMAX(i32 noundef %.0129141, i32 noundef %23)
  %25 = load i32, ptr %17, align 4, !tbaa !15
  %26 = tail call i32 @IMIN(i32 noundef %.0130140, i32 noundef %25)
  %27 = load i32, ptr %17, align 4, !tbaa !15
  %28 = tail call i32 @IMAX(i32 noundef %.0131139, i32 noundef %27)
  %29 = getelementptr inbounds i32, ptr %7, i64 %indvars.iv
  store i32 0, ptr %29, align 4, !tbaa !12
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %6
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !16

._crit_edge:                                      ; preds = %.lr.ph
  %30 = sitofp i32 %1 to double
  %31 = insertelement <2 x double> poison, double %30, i64 0
  %32 = shufflevector <2 x double> %31, <2 x double> poison, <2 x i32> zeroinitializer
  %33 = fdiv <2 x double> %20, %32
  br i1 %8, label %.lr.ph155.preheader, label %._crit_edge156

.lr.ph155.preheader:                              ; preds = %._crit_edge
  %34 = extractelement <2 x double> %33, i64 0
  %35 = extractelement <2 x double> %33, i64 1
  br label %.lr.ph155

.lr.ph155:                                        ; preds = %.lr.ph155.preheader, %.lr.ph155
  %indvars.iv167 = phi i64 [ %indvars.iv.next168, %.lr.ph155 ], [ 0, %.lr.ph155.preheader ]
  %.0132152 = phi double [ %50, %.lr.ph155 ], [ 0.000000e+00, %.lr.ph155.preheader ]
  %.0133151 = phi double [ %46, %.lr.ph155 ], [ 0.000000e+00, %.lr.ph155.preheader ]
  %36 = getelementptr inbounds %struct._IPointMatch, ptr %0, i64 %indvars.iv167
  %37 = load ptr, ptr %36, align 8, !tbaa !5
  %38 = getelementptr inbounds i8, ptr %37, i64 16
  %39 = load i32, ptr %38, align 8, !tbaa !13
  %40 = sitofp i32 %39 to double
  %41 = fsub double %40, %34
  %42 = getelementptr inbounds i8, ptr %37, i64 20
  %43 = load i32, ptr %42, align 4, !tbaa !15
  %44 = sitofp i32 %43 to double
  %45 = fsub double %44, %35
  %46 = tail call double @llvm.fmuladd.f64(double %41, double %45, double %.0133151)
  %47 = fneg double %45
  %48 = fmul double %45, %47
  %49 = tail call double @llvm.fmuladd.f64(double %41, double %41, double %48)
  %50 = fadd double %.0132152, %49
  %indvars.iv.next168 = add nuw nsw i64 %indvars.iv167, 1
  %exitcond171.not = icmp eq i64 %indvars.iv.next168, %6
  br i1 %exitcond171.not, label %._crit_edge156.loopexit, label %.lr.ph155, !llvm.loop !18

._crit_edge156.loopexit:                          ; preds = %.lr.ph155
  %51 = fdiv double %50, %46
  br label %._crit_edge156

._crit_edge156:                                   ; preds = %._crit_edge.thread, %._crit_edge156.loopexit, %._crit_edge
  %.0128.lcssa182 = phi i32 [ %22, %._crit_edge ], [ %22, %._crit_edge156.loopexit ], [ 1000, %._crit_edge.thread ]
  %.0129.lcssa180 = phi i32 [ %24, %._crit_edge ], [ %24, %._crit_edge156.loopexit ], [ 0, %._crit_edge.thread ]
  %.0130.lcssa179 = phi i32 [ %26, %._crit_edge ], [ %26, %._crit_edge156.loopexit ], [ 1000, %._crit_edge.thread ]
  %.0131.lcssa178 = phi i32 [ %28, %._crit_edge ], [ %28, %._crit_edge156.loopexit ], [ 0, %._crit_edge.thread ]
  %52 = phi double [ 0x7FF8000000000000, %._crit_edge ], [ %51, %._crit_edge156.loopexit ], [ 0x7FF8000000000000, %._crit_edge.thread ]
  %53 = phi <2 x double> [ %33, %._crit_edge ], [ %33, %._crit_edge156.loopexit ], [ %12, %._crit_edge.thread ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #5
  store double 0.000000e+00, ptr %4, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #5
  store double 0.000000e+00, ptr %5, align 8, !tbaa !19
  %54 = call i32 @solve_deg2(double noundef 1.000000e+00, double noundef %52, double noundef -1.000000e+00, ptr noundef nonnull %4, ptr noundef nonnull %5)
  %55 = load double, ptr %4, align 8, !tbaa !19
  %56 = call double @atan(double noundef %55) #5
  %57 = load double, ptr %5, align 8, !tbaa !19
  %58 = call double @atan(double noundef %57) #5
  %59 = insertelement <2 x double> poison, double %58, i64 0
  %60 = insertelement <2 x double> %59, double %56, i64 1
  %61 = fmul <2 x double> %60, <double 0x404CA5DC1A63C1F8, double 0x404CA5DC1A63C1F8>
  %62 = fcmp olt <2 x double> %61, zeroinitializer
  %63 = fadd <2 x double> %61, <double 3.600000e+02, double 3.600000e+02>
  %64 = select <2 x i1> %62, <2 x double> %63, <2 x double> %61
  %65 = extractelement <2 x double> %64, i64 1
  %66 = fadd double %65, -3.600000e+02
  %67 = fcmp ogt <2 x double> %64, <double 3.600000e+02, double 3.600000e+02>
  %68 = extractelement <2 x i1> %67, i64 1
  %.1126 = select i1 %68, double %66, double %65
  %69 = extractelement <2 x double> %64, i64 0
  %70 = fadd double %69, -3.600000e+02
  %71 = extractelement <2 x i1> %67, i64 0
  %.1124 = select i1 %71, double %70, double %69
  %72 = load double, ptr %4, align 8, !tbaa !19
  %73 = fneg double %72
  %74 = extractelement <2 x double> %53, i64 0
  %75 = extractelement <2 x double> %53, i64 1
  %76 = call double @llvm.fmuladd.f64(double %73, double %74, double %75)
  %77 = load double, ptr %5, align 8, !tbaa !19
  %78 = fneg double %77
  %79 = call double @llvm.fmuladd.f64(double %78, double %74, double %75)
  %80 = fcmp oge double %.1124, 4.500000e+01
  %81 = fcmp ole double %.1124, 1.350000e+02
  %or.cond = and i1 %80, %81
  br i1 %or.cond, label %85, label %82

82:                                               ; preds = %._crit_edge156
  %83 = fcmp oge double %.1124, 2.250000e+02
  %84 = fcmp ole double %.1124, 3.150000e+02
  %or.cond3 = and i1 %83, %84
  br i1 %or.cond3, label %85, label %94

85:                                               ; preds = %82, %._crit_edge156
  %86 = sitofp i32 %.0130.lcssa179 to double
  %87 = fsub double %86, %79
  %88 = fdiv double %87, %77
  %89 = fptosi double %88 to i32
  %90 = sitofp i32 %.0131.lcssa178 to double
  %91 = fsub double %90, %79
  %92 = fdiv double %91, %77
  %93 = fptosi double %92 to i32
  br label %101

94:                                               ; preds = %82
  %95 = sitofp i32 %.0128.lcssa182 to double
  %96 = call double @llvm.fmuladd.f64(double %77, double %95, double %79)
  %97 = fptosi double %96 to i32
  %98 = sitofp i32 %.0129.lcssa180 to double
  %99 = call double @llvm.fmuladd.f64(double %77, double %98, double %79)
  %100 = fptosi double %99 to i32
  br label %101

101:                                              ; preds = %94, %85
  %.0120 = phi i32 [ %89, %85 ], [ %.0128.lcssa182, %94 ]
  %.0119 = phi i32 [ %.0130.lcssa179, %85 ], [ %97, %94 ]
  %.0118 = phi i32 [ %93, %85 ], [ %.0129.lcssa180, %94 ]
  %.0117 = phi i32 [ %.0131.lcssa178, %85 ], [ %100, %94 ]
  %102 = fcmp oge double %.1126, 4.500000e+01
  %103 = fcmp ole double %.1126, 1.350000e+02
  %or.cond5 = and i1 %102, %103
  br i1 %or.cond5, label %107, label %104

104:                                              ; preds = %101
  %105 = fcmp oge double %.1126, 2.250000e+02
  %106 = fcmp ole double %.1126, 3.150000e+02
  %or.cond7 = and i1 %105, %106
  br i1 %or.cond7, label %107, label %116

107:                                              ; preds = %104, %101
  %108 = sitofp i32 %.0130.lcssa179 to double
  %109 = fsub double %108, %76
  %110 = fdiv double %109, %72
  %111 = fptosi double %110 to i32
  %112 = sitofp i32 %.0131.lcssa178 to double
  %113 = fsub double %112, %76
  %114 = fdiv double %113, %72
  %115 = fptosi double %114 to i32
  br label %123

116:                                              ; preds = %104
  %117 = sitofp i32 %.0128.lcssa182 to double
  %118 = call double @llvm.fmuladd.f64(double %72, double %117, double %76)
  %119 = fptosi double %118 to i32
  %120 = sitofp i32 %.0129.lcssa180 to double
  %121 = call double @llvm.fmuladd.f64(double %72, double %120, double %76)
  %122 = fptosi double %121 to i32
  br label %123

123:                                              ; preds = %116, %107
  %.0116 = phi i32 [ %111, %107 ], [ %.0128.lcssa182, %116 ]
  %.0115 = phi i32 [ %.0130.lcssa179, %107 ], [ %119, %116 ]
  %.0114 = phi i32 [ %115, %107 ], [ %.0129.lcssa180, %116 ]
  %.0 = phi i32 [ %.0131.lcssa178, %107 ], [ %122, %116 ]
  call void @get2ClosestPoints(i32 noundef %.0120, i32 noundef %.0119, ptr noundef %0, i32 noundef %1, ptr noundef %2, ptr noundef nonnull %7)
  %124 = getelementptr inbounds i8, ptr %2, i64 112
  call void @get2ClosestPoints(i32 noundef %.0118, i32 noundef %.0117, ptr noundef %0, i32 noundef %1, ptr noundef nonnull %124, ptr noundef nonnull %7)
  %125 = getelementptr inbounds i8, ptr %2, i64 224
  call void @get2ClosestPoints(i32 noundef %.0116, i32 noundef %.0115, ptr noundef %0, i32 noundef %1, ptr noundef nonnull %125, ptr noundef nonnull %7)
  %126 = getelementptr inbounds i8, ptr %2, i64 336
  call void @get2ClosestPoints(i32 noundef %.0114, i32 noundef %.0, ptr noundef %0, i32 noundef %1, ptr noundef nonnull %126, ptr noundef nonnull %7)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #5
  ret void
}

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @atan(double noundef) local_unnamed_addr #4

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"_IPointMatch", !7, i64 0, !7, i64 8, !7, i64 16, !10, i64 24, !10, i64 32, !11, i64 40, !11, i64 44, !11, i64 48}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"double", !8, i64 0}
!11 = !{!"int", !8, i64 0}
!12 = !{!11, !11, i64 0}
!13 = !{!14, !11, i64 16}
!14 = !{!"_IPoint", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !10, i64 40, !10, i64 48, !11, i64 56, !11, i64 60, !11, i64 64, !10, i64 72, !7, i64 80, !11, i64 88, !8, i64 92}
!15 = !{!14, !11, i64 20}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}
!18 = distinct !{!18, !17}
!19 = !{!10, !10, i64 0}


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