; LLVM IR from pmla/polyhedral-template-matching :: unittest.ll (ZN3ptm9run_testsEv)

; 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.ptm::structdata_t" = type { i32, i32, i32, ptr }
%"struct.ptm::unittest_nbrdata_t" = type { i32, ptr, ptr }
%"struct.ptm::quattest_t" = type { i8, [9 x double], [9 x double] }
%"struct.ptm::alloytest_t" = type { i32, [17 x i32] }

@_ZN3ptm10structdataE = external dso_local global [8 x %"struct.ptm::structdata_t"], align 16
@__const._ZN3ptm9run_testsEv.num_alloy_tests = external hidden unnamed_addr constant [8 x i32], align 16
@__const._ZN3ptm9run_testsEv.alloy_test = external hidden unnamed_addr constant [8 x ptr], align 16
@__const._ZN3ptm9run_testsEv.num_quat_tests = external hidden unnamed_addr constant [8 x i32], align 16
@__const._ZN3ptm9run_testsEv.quat_test = external hidden unnamed_addr constant [8 x ptr], align 16
@.str = external hidden unnamed_addr constant [80 x i8], align 1
@__PRETTY_FUNCTION__._ZN3ptm9run_testsEv = external hidden unnamed_addr constant [26 x i8], align 1
@.str.89 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.90 = external hidden unnamed_addr constant [51 x i8], align 1
@__const._ZN3ptm9run_testsEv.offset = external hidden unnamed_addr constant [3 x double], align 16
@.str.91 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.92 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.93 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.94 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.95 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.96 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.97 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.98 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.99 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.100 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.101 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.102 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.103 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.104 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.105 = external hidden unnamed_addr constant [32 x i8], align 1
@__const._ZN3ptm9run_testsEv.lc_points_fcc = external hidden unnamed_addr constant [13 x [3 x double]], align 16
@__const._ZN3ptm9run_testsEv.lc_points_bcc = external hidden unnamed_addr constant [15 x [3 x double]], align 16
@__const._ZN3ptm9run_testsEv.lc_points_dcub = external hidden unnamed_addr constant [17 x [3 x double]], align 16
@__const._ZN3ptm9run_testsEv.lcdat = external hidden unnamed_addr constant [4 x i32], align 16
@.str.106 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.107 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.108 = external hidden unnamed_addr constant [34 x i8], align 1
@__const._ZN3ptm9run_testsEv.alt_templates = external hidden unnamed_addr constant [6 x ptr], align 16
@__const._ZN3ptm9run_testsEv.num_points = external hidden unnamed_addr constant [6 x i32], align 16
@__const._ZN3ptm9run_testsEv.checks = external hidden unnamed_addr constant [6 x i32], align 16
@__const._ZN3ptm9run_testsEv.types = external hidden unnamed_addr constant [6 x i32], align 16
@.str.109 = external hidden unnamed_addr constant [25 x i8], align 1

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #0

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

; Function Attrs: nounwind
declare double @sqrt(double noundef) #2

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

; Function Attrs: mustprogress uwtable
define dso_local noundef i64 @_ZN3ptm9run_testsEv() #4 {
  %1 = alloca i64, align 8
  %2 = alloca i32, align 4
  %3 = alloca double, align 8
  %4 = alloca [9 x double], align 16
  %5 = alloca i32, align 4
  %6 = alloca [8 x i32], align 16
  %7 = alloca [8 x ptr], align 16
  %8 = alloca [8 x i32], align 16
  %9 = alloca [8 x ptr], align 16
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca [9 x double], align 16
  %13 = alloca [4 x double], align 16
  %14 = alloca [4 x double], align 16
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca [4 x double], align 16
  %18 = alloca [9 x double], align 16
  %19 = alloca [9 x double], align 16
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca ptr, align 8
  %24 = alloca [4 x double], align 16
  %25 = alloca [4 x double], align 16
  %26 = alloca [9 x double], align 16
  %27 = alloca ptr, align 8
  %28 = alloca [17 x [3 x double]], align 16
  %29 = alloca [17 x [3 x double]], align 16
  %30 = alloca i32, align 4
  %31 = alloca [3 x double], align 16
  %32 = alloca double, align 8
  %33 = alloca double, align 8
  %34 = alloca double, align 8
  %35 = alloca double, align 8
  %36 = alloca double, align 8
  %37 = alloca [3 x double], align 16
  %38 = alloca i32, align 4
  %39 = alloca i32, align 4
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  %42 = alloca i32, align 4
  %43 = alloca i32, align 4
  %44 = alloca i32, align 4
  %45 = alloca ptr, align 8
  %46 = alloca %"struct.ptm::unittest_nbrdata_t", align 8
  %47 = alloca [17 x i8], align 16
  %48 = alloca i32, align 4
  %49 = alloca i32, align 4
  %50 = alloca double, align 8
  %51 = alloca double, align 8
  %52 = alloca double, align 8
  %53 = alloca double, align 8
  %54 = alloca [4 x double], align 16
  %55 = alloca [9 x double], align 16
  %56 = alloca [3 x double], align 16
  %57 = alloca [9 x double], align 16
  %58 = alloca [9 x double], align 16
  %59 = alloca [9 x double], align 16
  %60 = alloca [9 x double], align 16
  %61 = alloca [4 x double], align 16
  %62 = alloca double, align 8
  %63 = alloca double, align 8
  %64 = alloca double, align 8
  %65 = alloca double, align 8
  %66 = alloca double, align 8
  %67 = alloca double, align 8
  %68 = alloca [7 x [3 x double]], align 16
  %69 = alloca [13 x [3 x double]], align 16
  %70 = alloca [15 x [3 x double]], align 16
  %71 = alloca [17 x [3 x double]], align 16
  %72 = alloca [4 x ptr], align 16
  %73 = alloca [4 x i32], align 16
  %74 = alloca i32, align 4
  %75 = alloca ptr, align 8
  %76 = alloca i32, align 4
  %77 = alloca double, align 8
  %78 = alloca double, align 8
  %79 = alloca double, align 8
  %80 = alloca double, align 8
  %81 = alloca [4 x double], align 16
  %82 = alloca %"struct.ptm::unittest_nbrdata_t", align 8
  %83 = alloca double, align 8
  %84 = alloca double, align 8
  %85 = alloca double, align 8
  %86 = alloca double, align 8
  %87 = alloca i32, align 4
  %88 = alloca ptr, align 8
  %89 = alloca i32, align 4
  %90 = alloca double, align 8
  %91 = alloca double, align 8
  %92 = alloca double, align 8
  %93 = alloca double, align 8
  %94 = alloca [4 x double], align 16
  %95 = alloca [9 x double], align 16
  %96 = alloca [3 x double], align 16
  %97 = alloca [17 x [3 x double]], align 16
  %98 = alloca %"struct.ptm::unittest_nbrdata_t", align 8
  %99 = alloca double, align 8
  %100 = alloca [6 x ptr], align 16
  %101 = alloca [6 x i32], align 16
  %102 = alloca [6 x i32], align 16
  %103 = alloca [6 x i32], align 16
  %104 = alloca i32, align 4
  %105 = alloca i32, align 4
  %106 = alloca double, align 8
  %107 = alloca double, align 8
  %108 = alloca double, align 8
  %109 = alloca double, align 8
  %110 = alloca [4 x double], align 16
  %111 = alloca [9 x double], align 16
  %112 = alloca [3 x double], align 16
  %113 = alloca [17 x [3 x double]], align 16
  %114 = alloca %"struct.ptm::unittest_nbrdata_t", align 8
  %115 = alloca double, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %2) #8
  store i32 0, ptr %2, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %3) #8
  store double 1.000000e-05, ptr %3, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 72, ptr %4) #8
  call void @llvm.memset.p0.i64(ptr align 16 %4, i8 0, i64 72, i1 false)
  %116 = getelementptr inbounds [9 x double], ptr %4, i32 0, i32 0
  store double 1.000000e+00, ptr %116, align 16
  %117 = getelementptr inbounds [9 x double], ptr %4, i32 0, i32 4
  store double 1.000000e+00, ptr %117, align 16
  %118 = getelementptr inbounds [9 x double], ptr %4, i32 0, i32 8
  store double 1.000000e+00, ptr %118, align 16
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #8
  store i32 8, ptr %5, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 32, ptr %6) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %6, ptr align 16 @__const._ZN3ptm9run_testsEv.num_alloy_tests, i64 32, i1 false)
  call void @llvm.lifetime.start.p0(i64 64, ptr %7) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %7, ptr align 16 @__const._ZN3ptm9run_testsEv.alloy_test, i64 64, i1 false)
  call void @llvm.lifetime.start.p0(i64 32, ptr %8) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %8, ptr align 16 @__const._ZN3ptm9run_testsEv.num_quat_tests, i64 32, i1 false)
  call void @llvm.lifetime.start.p0(i64 64, ptr %9) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %9, ptr align 16 @__const._ZN3ptm9run_testsEv.quat_test, i64 64, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #8
  store i32 0, ptr %10, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #8
  %119 = call ptr @ptm_initialize_local()
  store ptr %119, ptr %11, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 72, ptr %12) #8
  call void @llvm.memset.p0.i64(ptr align 16 %12, i8 0, i64 72, i1 false)
  %120 = getelementptr inbounds [9 x double], ptr %12, i32 0, i32 2
  store double 1.000000e+00, ptr %120, align 16
  %121 = getelementptr inbounds [9 x double], ptr %12, i32 0, i32 4
  store double 1.000000e+00, ptr %121, align 16
  %122 = getelementptr inbounds [9 x double], ptr %12, i32 0, i32 6
  store double -1.000000e+00, ptr %122, align 16
  call void @llvm.lifetime.start.p0(i64 32, ptr %13) #8
  %123 = getelementptr inbounds [9 x double], ptr %12, i64 0, i64 0
  %124 = getelementptr inbounds [4 x double], ptr %13, i64 0, i64 0
  call void @_ZN3ptm29rotation_matrix_to_quaternionEPdS0_(ptr noundef %123, ptr noundef %124)
  call void @llvm.lifetime.start.p0(i64 32, ptr %14) #8
  %125 = call double @sqrt(double noundef 2.000000e+00) #8
  %126 = fdiv double 1.000000e+00, %125
  store double %126, ptr %14, align 8, !tbaa !9
  %127 = getelementptr inbounds double, ptr %14, i64 1
  store double 0.000000e+00, ptr %127, align 8, !tbaa !9
  %128 = getelementptr inbounds double, ptr %14, i64 2
  %129 = call double @sqrt(double noundef 2.000000e+00) #8
  %130 = fdiv double 1.000000e+00, %129
  store double %130, ptr %128, align 8, !tbaa !9
  %131 = getelementptr inbounds double, ptr %14, i64 3
  store double 0.000000e+00, ptr %131, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #8
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %132

132:                                              ; preds = %151, %0
  %133 = load i32, ptr %15, align 4, !tbaa !5
  %134 = icmp slt i32 %133, 4
  br i1 %134, label %136, label %135

135:                                              ; preds = %132
  store i32 2, ptr %16, align 4
  br label %154

136:                                              ; preds = %132
  %137 = load i32, ptr %15, align 4, !tbaa !5
  %138 = sext i32 %137 to i64
  %139 = getelementptr inbounds [4 x double], ptr %13, i64 0, i64 %138
  %140 = load double, ptr %139, align 8, !tbaa !9
  %141 = load i32, ptr %15, align 4, !tbaa !5
  %142 = sext i32 %141 to i64
  %143 = getelementptr inbounds [4 x double], ptr %14, i64 0, i64 %142
  %144 = load double, ptr %143, align 8, !tbaa !9
  %145 = fsub double %140, %144
  %146 = call double @llvm.fabs.f64(double %145)
  %147 = fcmp oge double %146, 1.000000e-05
  br i1 %147, label %148, label %150

148:                                              ; preds = %136
  store i32 -1, ptr %2, align 4, !tbaa !5
  %149 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 559, ptr noundef @.str.89, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %154

150:                                              ; preds = %136
  br label %151

151:                                              ; preds = %150
  %152 = load i32, ptr %15, align 4, !tbaa !5
  %153 = add nsw i32 %152, 1
  store i32 %153, ptr %15, align 4, !tbaa !5
  br label %132, !llvm.loop !13

154:                                              ; preds = %148, %135
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #8
  %155 = load i32, ptr %16, align 4
  switch i32 %155, label %157 [
    i32 2, label %156
  ]

156:                                              ; preds = %154
  store i32 0, ptr %16, align 4
  br label %157

157:                                              ; preds = %156, %154
  call void @llvm.lifetime.end.p0(i64 32, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %12) #8
  %158 = load i32, ptr %16, align 4
  switch i32 %158, label %1003 [
    i32 0, label %159
    i32 5, label %997
  ]

159:                                              ; preds = %157
  call void @llvm.lifetime.start.p0(i64 32, ptr %17) #8
  %160 = call double @sqrt(double noundef 2.000000e+00) #8
  %161 = fdiv double 1.000000e+00, %160
  store double %161, ptr %17, align 8, !tbaa !9
  %162 = getelementptr inbounds double, ptr %17, i64 1
  %163 = call double @sqrt(double noundef 2.000000e+00) #8
  %164 = fdiv double 1.000000e+00, %163
  store double %164, ptr %162, align 8, !tbaa !9
  %165 = getelementptr inbounds double, ptr %17, i64 2
  store double 0.000000e+00, ptr %165, align 8, !tbaa !9
  %166 = getelementptr inbounds double, ptr %17, i64 3
  store double 0.000000e+00, ptr %166, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 72, ptr %18) #8
  %167 = getelementptr inbounds [4 x double], ptr %17, i64 0, i64 0
  %168 = getelementptr inbounds [9 x double], ptr %18, i64 0, i64 0
  call void @_ZN3ptm29quaternion_to_rotation_matrixEPdS0_(ptr noundef %167, ptr noundef %168)
  call void @llvm.lifetime.start.p0(i64 72, ptr %19) #8
  call void @llvm.memset.p0.i64(ptr align 16 %19, i8 0, i64 72, i1 false)
  %169 = getelementptr inbounds [9 x double], ptr %19, i32 0, i32 0
  store double 1.000000e+00, ptr %169, align 16
  %170 = getelementptr inbounds [9 x double], ptr %19, i32 0, i32 5
  store double -1.000000e+00, ptr %170, align 8
  %171 = getelementptr inbounds [9 x double], ptr %19, i32 0, i32 7
  store double 1.000000e+00, ptr %171, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #8
  store i32 0, ptr %20, align 4, !tbaa !5
  br label %172

172:                                              ; preds = %191, %159
  %173 = load i32, ptr %20, align 4, !tbaa !5
  %174 = icmp slt i32 %173, 9
  br i1 %174, label %176, label %175

175:                                              ; preds = %172
  store i32 6, ptr %16, align 4
  br label %194

176:                                              ; preds = %172
  %177 = load i32, ptr %20, align 4, !tbaa !5
  %178 = sext i32 %177 to i64
  %179 = getelementptr inbounds [9 x double], ptr %18, i64 0, i64 %178
  %180 = load double, ptr %179, align 8, !tbaa !9
  %181 = load i32, ptr %20, align 4, !tbaa !5
  %182 = sext i32 %181 to i64
  %183 = getelementptr inbounds [9 x double], ptr %19, i64 0, i64 %182
  %184 = load double, ptr %183, align 8, !tbaa !9
  %185 = fsub double %180, %184
  %186 = call double @llvm.fabs.f64(double %185)
  %187 = fcmp oge double %186, 1.000000e-05
  br i1 %187, label %188, label %190

188:                                              ; preds = %176
  store i32 -1, ptr %2, align 4, !tbaa !5
  %189 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 574, ptr noundef @.str.90, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %194

190:                                              ; preds = %176
  br label %191

191:                                              ; preds = %190
  %192 = load i32, ptr %20, align 4, !tbaa !5
  %193 = add nsw i32 %192, 1
  store i32 %193, ptr %20, align 4, !tbaa !5
  br label %172, !llvm.loop !15

194:                                              ; preds = %188, %175
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #8
  %195 = load i32, ptr %16, align 4
  switch i32 %195, label %197 [
    i32 6, label %196
  ]

196:                                              ; preds = %194
  store i32 0, ptr %16, align 4
  br label %197

197:                                              ; preds = %196, %194
  call void @llvm.lifetime.end.p0(i64 72, ptr %19) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %17) #8
  %198 = load i32, ptr %16, align 4
  switch i32 %198, label %1003 [
    i32 0, label %199
    i32 5, label %997
  ]

199:                                              ; preds = %197
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #8
  store i32 0, ptr %21, align 4, !tbaa !5
  br label %200

200:                                              ; preds = %686, %199
  %201 = load i32, ptr %21, align 4, !tbaa !5
  %202 = load i32, ptr %5, align 4, !tbaa !5
  %203 = icmp slt i32 %201, %202
  br i1 %203, label %205, label %204

204:                                              ; preds = %200
  store i32 9, ptr %16, align 4
  br label %689

205:                                              ; preds = %200
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #8
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %206

206:                                              ; preds = %680, %205
  %207 = load i32, ptr %22, align 4, !tbaa !5
  %208 = load i32, ptr %21, align 4, !tbaa !5
  %209 = sext i32 %208 to i64
  %210 = getelementptr inbounds [8 x i32], ptr %8, i64 0, i64 %209
  %211 = load i32, ptr %210, align 4, !tbaa !5
  %212 = icmp slt i32 %207, %211
  br i1 %212, label %214, label %213

213:                                              ; preds = %206
  store i32 12, ptr %16, align 4
  br label %683

214:                                              ; preds = %206
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #8
  %215 = load i32, ptr %21, align 4, !tbaa !5
  %216 = sext i32 %215 to i64
  %217 = getelementptr inbounds [8 x ptr], ptr %9, i64 0, i64 %216
  %218 = load ptr, ptr %217, align 8, !tbaa !11
  store ptr %218, ptr %23, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 32, ptr %24) #8
  call void @llvm.lifetime.start.p0(i64 32, ptr %25) #8
  call void @llvm.lifetime.start.p0(i64 72, ptr %26) #8
  %219 = getelementptr inbounds [4 x double], ptr %24, i64 0, i64 0
  %220 = load ptr, ptr %23, align 8, !tbaa !11
  %221 = load i32, ptr %22, align 4, !tbaa !5
  %222 = sext i32 %221 to i64
  %223 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %220, i64 %222
  %224 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %223, i32 0, i32 1
  %225 = getelementptr inbounds [9 x double], ptr %224, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %219, ptr align 8 %225, i64 32, i1 false)
  %226 = getelementptr inbounds [4 x double], ptr %25, i64 0, i64 0
  %227 = load ptr, ptr %23, align 8, !tbaa !11
  %228 = load i32, ptr %22, align 4, !tbaa !5
  %229 = sext i32 %228 to i64
  %230 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %227, i64 %229
  %231 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %230, i32 0, i32 2
  %232 = getelementptr inbounds [9 x double], ptr %231, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %226, ptr align 8 %232, i64 32, i1 false)
  %233 = load ptr, ptr %23, align 8, !tbaa !11
  %234 = load i32, ptr %22, align 4, !tbaa !5
  %235 = sext i32 %234 to i64
  %236 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %233, i64 %235
  %237 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %236, i32 0, i32 0
  %238 = load i8, ptr %237, align 8, !tbaa !16, !range !19, !noundef !20
  %239 = trunc i8 %238 to i1
  br i1 %239, label %240, label %248

240:                                              ; preds = %214
  %241 = getelementptr inbounds [9 x double], ptr %26, i64 0, i64 0
  %242 = load ptr, ptr %23, align 8, !tbaa !11
  %243 = load i32, ptr %22, align 4, !tbaa !5
  %244 = sext i32 %243 to i64
  %245 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %242, i64 %244
  %246 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %245, i32 0, i32 1
  %247 = getelementptr inbounds [9 x double], ptr %246, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %241, ptr align 8 %247, i64 72, i1 false)
  br label %253

248:                                              ; preds = %214
  %249 = getelementptr inbounds [4 x double], ptr %24, i64 0, i64 0
  call void @_ZN3ptm20normalize_quaternionEPd(ptr noundef %249)
  %250 = getelementptr inbounds [4 x double], ptr %25, i64 0, i64 0
  call void @_ZN3ptm20normalize_quaternionEPd(ptr noundef %250)
  %251 = getelementptr inbounds [4 x double], ptr %24, i64 0, i64 0
  %252 = getelementptr inbounds [9 x double], ptr %26, i64 0, i64 0
  call void @_ZN3ptm29quaternion_to_rotation_matrixEPdS0_(ptr noundef %251, ptr noundef %252)
  br label %253

253:                                              ; preds = %248, %240
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #8
  %254 = load i32, ptr %21, align 4, !tbaa !5
  %255 = sext i32 %254 to i64
  %256 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %255
  store ptr %256, ptr %27, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 408, ptr %28) #8
  call void @llvm.memset.p0.i64(ptr align 16 %28, i8 0, i64 408, i1 false)
  call void @llvm.lifetime.start.p0(i64 408, ptr %29) #8
  %257 = getelementptr inbounds [17 x [3 x double]], ptr %29, i64 0, i64 0
  %258 = load ptr, ptr %27, align 8, !tbaa !11
  %259 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %258, i32 0, i32 3
  %260 = load ptr, ptr %259, align 8, !tbaa !21
  %261 = load ptr, ptr %27, align 8, !tbaa !11
  %262 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %261, i32 0, i32 2
  %263 = load i32, ptr %262, align 8, !tbaa !23
  %264 = sext i32 %263 to i64
  %265 = mul i64 24, %264
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %257, ptr align 8 %260, i64 %265, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #8
  store i32 0, ptr %30, align 4, !tbaa !5
  br label %266

266:                                              ; preds = %285, %253
  %267 = load i32, ptr %30, align 4, !tbaa !5
  %268 = load ptr, ptr %27, align 8, !tbaa !11
  %269 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %268, i32 0, i32 2
  %270 = load i32, ptr %269, align 8, !tbaa !23
  %271 = icmp slt i32 %267, %270
  br i1 %271, label %273, label %272

272:                                              ; preds = %266
  store i32 15, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #8
  br label %288

273:                                              ; preds = %266
  call void @llvm.lifetime.start.p0(i64 24, ptr %31) #8
  call void @llvm.memset.p0.i64(ptr align 16 %31, i8 0, i64 24, i1 false)
  %274 = getelementptr inbounds [9 x double], ptr %26, i64 0, i64 0
  %275 = load i32, ptr %30, align 4, !tbaa !5
  %276 = sext i32 %275 to i64
  %277 = getelementptr inbounds [17 x [3 x double]], ptr %29, i64 0, i64 %276
  %278 = getelementptr inbounds [3 x double], ptr %277, i64 0, i64 0
  %279 = getelementptr inbounds [3 x double], ptr %31, i64 0, i64 0
  call void @_ZN3ptmL6matvecEPdS0_S0_(ptr noundef %274, ptr noundef %278, ptr noundef %279)
  %280 = load i32, ptr %30, align 4, !tbaa !5
  %281 = sext i32 %280 to i64
  %282 = getelementptr inbounds [17 x [3 x double]], ptr %29, i64 0, i64 %281
  %283 = getelementptr inbounds [3 x double], ptr %282, i64 0, i64 0
  %284 = getelementptr inbounds [3 x double], ptr %31, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %283, ptr align 16 %284, i64 24, i1 false)
  call void @llvm.lifetime.end.p0(i64 24, ptr %31) #8
  br label %285

285:                                              ; preds = %273
  %286 = load i32, ptr %30, align 4, !tbaa !5
  %287 = add nsw i32 %286, 1
  store i32 %287, ptr %30, align 4, !tbaa !5
  br label %266, !llvm.loop !24

288:                                              ; preds = %272
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #8
  %289 = load ptr, ptr %27, align 8, !tbaa !11
  %290 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %289, i32 0, i32 3
  %291 = load ptr, ptr %290, align 8, !tbaa !21
  %292 = getelementptr inbounds [3 x double], ptr %291, i64 1
  %293 = getelementptr inbounds [3 x double], ptr %292, i64 0, i64 0
  %294 = load double, ptr %293, align 8, !tbaa !9
  store double %294, ptr %32, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #8
  %295 = load ptr, ptr %27, align 8, !tbaa !11
  %296 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %295, i32 0, i32 3
  %297 = load ptr, ptr %296, align 8, !tbaa !21
  %298 = getelementptr inbounds [3 x double], ptr %297, i64 1
  %299 = getelementptr inbounds [3 x double], ptr %298, i64 0, i64 1
  %300 = load double, ptr %299, align 8, !tbaa !9
  store double %300, ptr %33, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #8
  %301 = load ptr, ptr %27, align 8, !tbaa !11
  %302 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %301, i32 0, i32 3
  %303 = load ptr, ptr %302, align 8, !tbaa !21
  %304 = getelementptr inbounds [3 x double], ptr %303, i64 1
  %305 = getelementptr inbounds [3 x double], ptr %304, i64 0, i64 2
  %306 = load double, ptr %305, align 8, !tbaa !9
  store double %306, ptr %34, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #8
  %307 = load double, ptr %32, align 8, !tbaa !9
  %308 = load double, ptr %32, align 8, !tbaa !9
  %309 = load double, ptr %33, align 8, !tbaa !9
  %310 = load double, ptr %33, align 8, !tbaa !9
  %311 = fmul double %309, %310
  %312 = call double @llvm.fmuladd.f64(double %307, double %308, double %311)
  %313 = load double, ptr %34, align 8, !tbaa !9
  %314 = load double, ptr %34, align 8, !tbaa !9
  %315 = call double @llvm.fmuladd.f64(double %313, double %314, double %312)
  %316 = call double @sqrt(double noundef %315) #8
  %317 = fdiv double %316, 2.000000e+00
  store double %317, ptr %35, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #8
  %318 = load double, ptr %35, align 8, !tbaa !9
  %319 = fdiv double 1.000000e+00, %318
  store double %319, ptr %36, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 24, ptr %37) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %37, ptr align 16 @__const._ZN3ptm9run_testsEv.offset, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #8
  store i32 0, ptr %38, align 4, !tbaa !5
  br label %320

320:                                              ; preds = %352, %288
  %321 = load i32, ptr %38, align 4, !tbaa !5
  %322 = load ptr, ptr %27, align 8, !tbaa !11
  %323 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %322, i32 0, i32 2
  %324 = load i32, ptr %323, align 8, !tbaa !23
  %325 = icmp slt i32 %321, %324
  br i1 %325, label %327, label %326

326:                                              ; preds = %320
  store i32 18, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #8
  br label %355

327:                                              ; preds = %320
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #8
  store i32 0, ptr %39, align 4, !tbaa !5
  br label %328

328:                                              ; preds = %348, %327
  %329 = load i32, ptr %39, align 4, !tbaa !5
  %330 = icmp slt i32 %329, 3
  br i1 %330, label %332, label %331

331:                                              ; preds = %328
  store i32 21, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #8
  br label %351

332:                                              ; preds = %328
  %333 = load i32, ptr %38, align 4, !tbaa !5
  %334 = sext i32 %333 to i64
  %335 = getelementptr inbounds [17 x [3 x double]], ptr %29, i64 0, i64 %334
  %336 = load i32, ptr %39, align 4, !tbaa !5
  %337 = sext i32 %336 to i64
  %338 = getelementptr inbounds [3 x double], ptr %335, i64 0, i64 %337
  %339 = load double, ptr %338, align 8, !tbaa !9
  %340 = load double, ptr %36, align 8, !tbaa !9
  %341 = fmul double %339, %340
  %342 = load i32, ptr %38, align 4, !tbaa !5
  %343 = sext i32 %342 to i64
  %344 = getelementptr inbounds [17 x [3 x double]], ptr %28, i64 0, i64 %343
  %345 = load i32, ptr %39, align 4, !tbaa !5
  %346 = sext i32 %345 to i64
  %347 = getelementptr inbounds [3 x double], ptr %344, i64 0, i64 %346
  store double %341, ptr %347, align 8, !tbaa !9
  br label %348

348:                                              ; preds = %332
  %349 = load i32, ptr %39, align 4, !tbaa !5
  %350 = add nsw i32 %349, 1
  store i32 %350, ptr %39, align 4, !tbaa !5
  br label %328, !llvm.loop !25

351:                                              ; preds = %331
  br label %352

352:                                              ; preds = %351
  %353 = load i32, ptr %38, align 4, !tbaa !5
  %354 = add nsw i32 %353, 1
  store i32 %354, ptr %38, align 4, !tbaa !5
  br label %320, !llvm.loop !26

355:                                              ; preds = %326
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #8
  store i32 0, ptr %40, align 4, !tbaa !5
  br label %356

356:                                              ; preds = %392, %355
  %357 = load i32, ptr %40, align 4, !tbaa !5
  %358 = load ptr, ptr %27, align 8, !tbaa !11
  %359 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %358, i32 0, i32 2
  %360 = load i32, ptr %359, align 8, !tbaa !23
  %361 = icmp slt i32 %357, %360
  br i1 %361, label %363, label %362

362:                                              ; preds = %356
  store i32 24, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #8
  br label %395

363:                                              ; preds = %356
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #8
  store i32 0, ptr %41, align 4, !tbaa !5
  br label %364

364:                                              ; preds = %388, %363
  %365 = load i32, ptr %41, align 4, !tbaa !5
  %366 = icmp slt i32 %365, 3
  br i1 %366, label %368, label %367

367:                                              ; preds = %364
  store i32 27, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #8
  br label %391

368:                                              ; preds = %364
  %369 = load i32, ptr %40, align 4, !tbaa !5
  %370 = sext i32 %369 to i64
  %371 = getelementptr inbounds [17 x [3 x double]], ptr %29, i64 0, i64 %370
  %372 = load i32, ptr %41, align 4, !tbaa !5
  %373 = sext i32 %372 to i64
  %374 = getelementptr inbounds [3 x double], ptr %371, i64 0, i64 %373
  %375 = load double, ptr %374, align 8, !tbaa !9
  %376 = load double, ptr %36, align 8, !tbaa !9
  %377 = load i32, ptr %41, align 4, !tbaa !5
  %378 = sext i32 %377 to i64
  %379 = getelementptr inbounds [3 x double], ptr %37, i64 0, i64 %378
  %380 = load double, ptr %379, align 8, !tbaa !9
  %381 = call double @llvm.fmuladd.f64(double %375, double %376, double %380)
  %382 = load i32, ptr %40, align 4, !tbaa !5
  %383 = sext i32 %382 to i64
  %384 = getelementptr inbounds [17 x [3 x double]], ptr %29, i64 0, i64 %383
  %385 = load i32, ptr %41, align 4, !tbaa !5
  %386 = sext i32 %385 to i64
  %387 = getelementptr inbounds [3 x double], ptr %384, i64 0, i64 %386
  store double %381, ptr %387, align 8, !tbaa !9
  br label %388

388:                                              ; preds = %368
  %389 = load i32, ptr %41, align 4, !tbaa !5
  %390 = add nsw i32 %389, 1
  store i32 %390, ptr %41, align 4, !tbaa !5
  br label %364, !llvm.loop !27

391:                                              ; preds = %367
  br label %392

392:                                              ; preds = %391
  %393 = load i32, ptr %40, align 4, !tbaa !5
  %394 = add nsw i32 %393, 1
  store i32 %394, ptr %40, align 4, !tbaa !5
  br label %356, !llvm.loop !28

395:                                              ; preds = %362
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #8
  store i32 0, ptr %42, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #8
  store i32 0, ptr %43, align 4, !tbaa !5
  br label %396

396:                                              ; preds = %423, %395
  %397 = load i32, ptr %43, align 4, !tbaa !5
  %398 = load i32, ptr %21, align 4, !tbaa !5
  %399 = add nsw i32 %398, 1
  %400 = icmp slt i32 %397, %399
  br i1 %400, label %402, label %401

401:                                              ; preds = %396
  store i32 30, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #8
  br label %426

402:                                              ; preds = %396
  %403 = load i32, ptr %43, align 4, !tbaa !5
  %404 = sext i32 %403 to i64
  %405 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %404
  %406 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %405, i32 0, i32 2
  %407 = load i32, ptr %406, align 8, !tbaa !23
  %408 = load i32, ptr %21, align 4, !tbaa !5
  %409 = sext i32 %408 to i64
  %410 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %409
  %411 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %410, i32 0, i32 2
  %412 = load i32, ptr %411, align 8, !tbaa !23
  %413 = icmp sle i32 %407, %412
  br i1 %413, label %414, label %422

414:                                              ; preds = %402
  %415 = load i32, ptr %43, align 4, !tbaa !5
  %416 = sext i32 %415 to i64
  %417 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %416
  %418 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %417, i32 0, i32 1
  %419 = load i32, ptr %418, align 4, !tbaa !29
  %420 = load i32, ptr %42, align 4, !tbaa !5
  %421 = or i32 %420, %419
  store i32 %421, ptr %42, align 4, !tbaa !5
  br label %422

422:                                              ; preds = %414, %402
  br label %423

423:                                              ; preds = %422
  %424 = load i32, ptr %43, align 4, !tbaa !5
  %425 = add nsw i32 %424, 1
  store i32 %425, ptr %43, align 4, !tbaa !5
  br label %396, !llvm.loop !30

426:                                              ; preds = %401
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #8
  store i32 0, ptr %44, align 4, !tbaa !5
  br label %427

427:                                              ; preds = %671, %426
  %428 = load i32, ptr %44, align 4, !tbaa !5
  %429 = load i32, ptr %21, align 4, !tbaa !5
  %430 = sext i32 %429 to i64
  %431 = getelementptr inbounds [8 x i32], ptr %6, i64 0, i64 %430
  %432 = load i32, ptr %431, align 4, !tbaa !5
  %433 = icmp slt i32 %428, %432
  br i1 %433, label %435, label %434

434:                                              ; preds = %427
  store i32 33, ptr %16, align 4
  br label %674

435:                                              ; preds = %427
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #8
  %436 = load i32, ptr %21, align 4, !tbaa !5
  %437 = sext i32 %436 to i64
  %438 = getelementptr inbounds [8 x ptr], ptr %7, i64 0, i64 %437
  %439 = load ptr, ptr %438, align 8, !tbaa !11
  %440 = load i32, ptr %44, align 4, !tbaa !5
  %441 = sext i32 %440 to i64
  %442 = getelementptr inbounds %"struct.ptm::alloytest_t", ptr %439, i64 %441
  %443 = getelementptr inbounds %"struct.ptm::alloytest_t", ptr %442, i32 0, i32 1
  %444 = getelementptr inbounds [17 x i32], ptr %443, i64 0, i64 0
  store ptr %444, ptr %45, align 8, !tbaa !11
  %445 = load ptr, ptr %45, align 8, !tbaa !11
  %446 = getelementptr inbounds i32, ptr %445, i64 0
  %447 = load i32, ptr %446, align 4, !tbaa !5
  %448 = icmp eq i32 %447, -1
  br i1 %448, label %449, label %450

449:                                              ; preds = %435
  store ptr null, ptr %45, align 8, !tbaa !11
  br label %450

450:                                              ; preds = %449, %435
  call void @llvm.lifetime.start.p0(i64 24, ptr %46) #8
  %451 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %46, i32 0, i32 0
  %452 = load ptr, ptr %27, align 8, !tbaa !11
  %453 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %452, i32 0, i32 2
  %454 = load i32, ptr %453, align 8, !tbaa !23
  store i32 %454, ptr %451, align 8, !tbaa !31
  %455 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %46, i32 0, i32 1
  %456 = getelementptr inbounds [17 x [3 x double]], ptr %29, i64 0, i64 0
  store ptr %456, ptr %455, align 8, !tbaa !33
  %457 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %46, i32 0, i32 2
  %458 = load ptr, ptr %45, align 8, !tbaa !11
  store ptr %458, ptr %457, align 8, !tbaa !34
  call void @llvm.lifetime.start.p0(i64 17, ptr %47) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #8
  call void @llvm.lifetime.start.p0(i64 32, ptr %54) #8
  call void @llvm.lifetime.start.p0(i64 72, ptr %55) #8
  call void @llvm.lifetime.start.p0(i64 24, ptr %56) #8
  call void @llvm.lifetime.start.p0(i64 72, ptr %57) #8
  call void @llvm.lifetime.start.p0(i64 72, ptr %58) #8
  %459 = load ptr, ptr %11, align 8, !tbaa !11
  %460 = load i32, ptr %42, align 4, !tbaa !5
  %461 = getelementptr inbounds [4 x double], ptr %54, i64 0, i64 0
  %462 = getelementptr inbounds [9 x double], ptr %55, i64 0, i64 0
  %463 = getelementptr inbounds [3 x double], ptr %56, i64 0, i64 0
  %464 = getelementptr inbounds [9 x double], ptr %57, i64 0, i64 0
  %465 = getelementptr inbounds [9 x double], ptr %58, i64 0, i64 0
  %466 = getelementptr inbounds [17 x i8], ptr %47, i64 0, i64 0
  %467 = call i32 @ptm_index(ptr noundef %459, i64 noundef 0, ptr noundef @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef %46, i32 noundef %460, i1 noundef zeroext false, ptr noundef %48, ptr noundef %49, ptr noundef %50, ptr noundef %51, ptr noundef %461, ptr noundef %462, ptr noundef %463, ptr noundef %464, ptr noundef %465, ptr noundef %52, ptr noundef %53, ptr noundef null, ptr noundef null, ptr noundef %466)
  store i32 %467, ptr %2, align 4, !tbaa !5
  %468 = load i32, ptr %2, align 4, !tbaa !5
  %469 = icmp ne i32 %468, 0
  br i1 %469, label %470, label %474

470:                                              ; preds = %450
  %471 = load i32, ptr %2, align 4, !tbaa !5
  store i32 %471, ptr %2, align 4, !tbaa !5
  %472 = load i32, ptr %2, align 4, !tbaa !5
  %473 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 711, ptr noundef @.str.91, i32 noundef %472)
  store i32 5, ptr %16, align 4
  br label %668

474:                                              ; preds = %450
  %475 = load i32, ptr %10, align 4, !tbaa !5
  %476 = add nsw i32 %475, 1
  store i32 %476, ptr %10, align 4, !tbaa !5
  %477 = load i32, ptr %48, align 4, !tbaa !5
  %478 = load ptr, ptr %27, align 8, !tbaa !11
  %479 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %478, i32 0, i32 0
  %480 = load i32, ptr %479, align 8, !tbaa !35
  %481 = icmp ne i32 %477, %480
  br i1 %481, label %482, label %484

482:                                              ; preds = %474
  store i32 -1, ptr %2, align 4, !tbaa !5
  %483 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 733, ptr noundef @.str.92, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %668

484:                                              ; preds = %474
  %485 = load i32, ptr %49, align 4, !tbaa !5
  %486 = load i32, ptr %21, align 4, !tbaa !5
  %487 = sext i32 %486 to i64
  %488 = getelementptr inbounds [8 x ptr], ptr %7, i64 0, i64 %487
  %489 = load ptr, ptr %488, align 8, !tbaa !11
  %490 = load i32, ptr %44, align 4, !tbaa !5
  %491 = sext i32 %490 to i64
  %492 = getelementptr inbounds %"struct.ptm::alloytest_t", ptr %489, i64 %491
  %493 = getelementptr inbounds %"struct.ptm::alloytest_t", ptr %492, i32 0, i32 0
  %494 = load i32, ptr %493, align 4, !tbaa !36
  %495 = icmp ne i32 %485, %494
  br i1 %495, label %496, label %498

496:                                              ; preds = %484
  store i32 -1, ptr %2, align 4, !tbaa !5
  %497 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 737, ptr noundef @.str.93, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %668

498:                                              ; preds = %484
  %499 = getelementptr inbounds [9 x double], ptr %57, i64 0, i64 0
  %500 = call noundef double @_ZN3ptmL18matrix_determinantEPd(ptr noundef %499)
  %501 = fcmp ole double %500, 0.000000e+00
  br i1 %501, label %502, label %504

502:                                              ; preds = %498
  store i32 -1, ptr %2, align 4, !tbaa !5
  %503 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 741, ptr noundef @.str.94, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %668

504:                                              ; preds = %498
  %505 = getelementptr inbounds [9 x double], ptr %58, i64 0, i64 1
  %506 = load double, ptr %505, align 8, !tbaa !9
  %507 = getelementptr inbounds [9 x double], ptr %58, i64 0, i64 3
  %508 = load double, ptr %507, align 8, !tbaa !9
  %509 = fsub double %506, %508
  %510 = call double @llvm.fabs.f64(double %509)
  %511 = fcmp ogt double %510, 1.000000e-05
  br i1 %511, label %512, label %514

512:                                              ; preds = %504
  store i32 -1, ptr %2, align 4, !tbaa !5
  %513 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 744, ptr noundef @.str.95, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %668

514:                                              ; preds = %504
  %515 = getelementptr inbounds [9 x double], ptr %58, i64 0, i64 2
  %516 = load double, ptr %515, align 16, !tbaa !9
  %517 = getelementptr inbounds [9 x double], ptr %58, i64 0, i64 6
  %518 = load double, ptr %517, align 16, !tbaa !9
  %519 = fsub double %516, %518
  %520 = call double @llvm.fabs.f64(double %519)
  %521 = fcmp ogt double %520, 1.000000e-05
  br i1 %521, label %522, label %524

522:                                              ; preds = %514
  store i32 -1, ptr %2, align 4, !tbaa !5
  %523 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 745, ptr noundef @.str.95, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %668

524:                                              ; preds = %514
  %525 = getelementptr inbounds [9 x double], ptr %58, i64 0, i64 5
  %526 = load double, ptr %525, align 8, !tbaa !9
  %527 = getelementptr inbounds [9 x double], ptr %58, i64 0, i64 7
  %528 = load double, ptr %527, align 8, !tbaa !9
  %529 = fsub double %526, %528
  %530 = call double @llvm.fabs.f64(double %529)
  %531 = fcmp ogt double %530, 1.000000e-05
  br i1 %531, label %532, label %534

532:                                              ; preds = %524
  store i32 -1, ptr %2, align 4, !tbaa !5
  %533 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 746, ptr noundef @.str.95, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %668

534:                                              ; preds = %524
  call void @llvm.lifetime.start.p0(i64 72, ptr %59) #8
  %535 = getelementptr inbounds [9 x double], ptr %58, i64 0, i64 0
  %536 = getelementptr inbounds [9 x double], ptr %57, i64 0, i64 0
  %537 = getelementptr inbounds [9 x double], ptr %59, i64 0, i64 0
  call void @_ZN3ptmL6matmulEPdS0_S0_(ptr noundef %535, ptr noundef %536, ptr noundef %537)
  %538 = getelementptr inbounds [9 x double], ptr %59, i64 0, i64 0
  %539 = getelementptr inbounds [9 x double], ptr %55, i64 0, i64 0
  %540 = call noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef %538, ptr noundef %539, double noundef 1.000000e-05)
  br i1 %540, label %543, label %541

541:                                              ; preds = %534
  store i32 -1, ptr %2, align 4, !tbaa !5
  %542 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 752, ptr noundef @.str.96, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %667

543:                                              ; preds = %534
  call void @llvm.lifetime.start.p0(i64 72, ptr %60) #8
  %544 = load ptr, ptr %23, align 8, !tbaa !11
  %545 = load i32, ptr %22, align 4, !tbaa !5
  %546 = sext i32 %545 to i64
  %547 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %544, i64 %546
  %548 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %547, i32 0, i32 0
  %549 = load i8, ptr %548, align 8, !tbaa !16, !range !19, !noundef !20
  %550 = trunc i8 %549 to i1
  br i1 %550, label %627, label %551

551:                                              ; preds = %543
  %552 = load double, ptr %51, align 8, !tbaa !9
  %553 = fcmp ogt double %552, 1.000000e-05
  br i1 %553, label %554, label %556

554:                                              ; preds = %551
  store i32 -1, ptr %2, align 4, !tbaa !5
  %555 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 759, ptr noundef @.str.97, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %666

556:                                              ; preds = %551
  %557 = load double, ptr %50, align 8, !tbaa !9
  %558 = load double, ptr %36, align 8, !tbaa !9
  %559 = fdiv double 1.000000e+00, %558
  %560 = fsub double %557, %559
  %561 = call double @llvm.fabs.f64(double %560)
  %562 = fcmp ogt double %561, 1.000000e-05
  br i1 %562, label %563, label %565

563:                                              ; preds = %556
  store i32 -1, ptr %2, align 4, !tbaa !5
  %564 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 763, ptr noundef @.str.98, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %666

565:                                              ; preds = %556
  %566 = getelementptr inbounds [9 x double], ptr %55, i64 0, i64 0
  %567 = getelementptr inbounds [9 x double], ptr %57, i64 0, i64 0
  %568 = call noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef %566, ptr noundef %567, double noundef 1.000000e-05)
  br i1 %568, label %571, label %569

569:                                              ; preds = %565
  store i32 -1, ptr %2, align 4, !tbaa !5
  %570 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 767, ptr noundef @.str.99, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %666

571:                                              ; preds = %565
  %572 = getelementptr inbounds [9 x double], ptr %58, i64 0, i64 0
  %573 = getelementptr inbounds [9 x double], ptr %4, i64 0, i64 0
  %574 = call noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef %572, ptr noundef %573, double noundef 1.000000e-05)
  br i1 %574, label %577, label %575

575:                                              ; preds = %571
  store i32 -1, ptr %2, align 4, !tbaa !5
  %576 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 771, ptr noundef @.str.100, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %666

577:                                              ; preds = %571
  %578 = getelementptr inbounds [4 x double], ptr %54, i64 0, i64 0
  %579 = getelementptr inbounds [4 x double], ptr %25, i64 0, i64 0
  %580 = call noundef double @_ZN3ptm19quat_misorientationEPdS0_(ptr noundef %578, ptr noundef %579)
  %581 = fcmp ogt double %580, 1.000000e-05
  br i1 %581, label %582, label %584

582:                                              ; preds = %577
  store i32 -1, ptr %2, align 4, !tbaa !5
  %583 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 775, ptr noundef @.str.101, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %666

584:                                              ; preds = %577
  call void @llvm.lifetime.start.p0(i64 32, ptr %61) #8
  %585 = getelementptr inbounds [9 x double], ptr %57, i64 0, i64 0
  %586 = getelementptr inbounds [4 x double], ptr %61, i64 0, i64 0
  call void @_ZN3ptm29rotation_matrix_to_quaternionEPdS0_(ptr noundef %585, ptr noundef %586)
  %587 = getelementptr inbounds [4 x double], ptr %61, i64 0, i64 0
  %588 = getelementptr inbounds [4 x double], ptr %25, i64 0, i64 0
  %589 = call noundef double @_ZN3ptm19quat_misorientationEPdS0_(ptr noundef %587, ptr noundef %588)
  %590 = fcmp ogt double %589, 1.000000e-05
  br i1 %590, label %591, label %593

591:                                              ; preds = %584
  store i32 -1, ptr %2, align 4, !tbaa !5
  %592 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 781, ptr noundef @.str.102, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %624

593:                                              ; preds = %584
  %594 = getelementptr inbounds [4 x double], ptr %54, i64 0, i64 0
  %595 = getelementptr inbounds [9 x double], ptr %60, i64 0, i64 0
  call void @_ZN3ptm29quaternion_to_rotation_matrixEPdS0_(ptr noundef %594, ptr noundef %595)
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #8
  %596 = getelementptr inbounds [17 x [3 x double]], ptr %28, i64 0, i64 1
  %597 = getelementptr inbounds [3 x double], ptr %596, i64 0, i64 0
  %598 = load double, ptr %597, align 8, !tbaa !9
  store double %598, ptr %62, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #8
  %599 = getelementptr inbounds [17 x [3 x double]], ptr %28, i64 0, i64 1
  %600 = getelementptr inbounds [3 x double], ptr %599, i64 0, i64 1
  %601 = load double, ptr %600, align 8, !tbaa !9
  store double %601, ptr %63, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #8
  %602 = getelementptr inbounds [17 x [3 x double]], ptr %28, i64 0, i64 1
  %603 = getelementptr inbounds [3 x double], ptr %602, i64 0, i64 2
  %604 = load double, ptr %603, align 8, !tbaa !9
  store double %604, ptr %64, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #8
  %605 = load double, ptr %62, align 8, !tbaa !9
  %606 = load double, ptr %62, align 8, !tbaa !9
  %607 = load double, ptr %63, align 8, !tbaa !9
  %608 = load double, ptr %63, align 8, !tbaa !9
  %609 = fmul double %607, %608
  %610 = call double @llvm.fmuladd.f64(double %605, double %606, double %609)
  %611 = load double, ptr %64, align 8, !tbaa !9
  %612 = load double, ptr %64, align 8, !tbaa !9
  %613 = call double @llvm.fmuladd.f64(double %611, double %612, double %610)
  %614 = call double @sqrt(double noundef %613) #8
  store double %614, ptr %65, align 8, !tbaa !9
  %615 = load double, ptr %65, align 8, !tbaa !9
  %616 = load double, ptr %52, align 8, !tbaa !9
  %617 = fsub double %615, %616
  %618 = call double @llvm.fabs.f64(double %617)
  %619 = fcmp ogt double %618, 1.000000e-05
  br i1 %619, label %620, label %622

620:                                              ; preds = %593
  store i32 -1, ptr %2, align 4, !tbaa !5
  %621 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 790, ptr noundef @.str.103, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %623

622:                                              ; preds = %593
  store i32 0, ptr %16, align 4
  br label %623

623:                                              ; preds = %622, %620
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #8
  br label %624

624:                                              ; preds = %623, %591
  call void @llvm.lifetime.end.p0(i64 32, ptr %61) #8
  %625 = load i32, ptr %16, align 4
  switch i32 %625, label %666 [
    i32 0, label %626
  ]

626:                                              ; preds = %624
  br label %630

627:                                              ; preds = %543
  %628 = getelementptr inbounds [9 x double], ptr %60, i64 0, i64 0
  %629 = getelementptr inbounds [9 x double], ptr %55, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %628, ptr align 16 %629, i64 72, i1 false)
  br label %630

630:                                              ; preds = %627, %626
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #8
  %631 = load ptr, ptr %27, align 8, !tbaa !11
  %632 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %631, i32 0, i32 2
  %633 = load i32, ptr %632, align 8, !tbaa !23
  %634 = load double, ptr %50, align 8, !tbaa !9
  %635 = getelementptr inbounds [9 x double], ptr %60, i64 0, i64 0
  %636 = getelementptr inbounds [17 x [3 x double]], ptr %29, i64 0, i64 0
  %637 = load ptr, ptr %27, align 8, !tbaa !11
  %638 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %637, i32 0, i32 3
  %639 = load ptr, ptr %638, align 8, !tbaa !21
  %640 = call noundef double @_ZN3ptmL22nearest_neighbour_rmsdEidPdPA3_dPA3_Kd(i32 noundef %633, double noundef %634, ptr noundef %635, ptr noundef %636, ptr noundef %639)
  store double %640, ptr %66, align 8, !tbaa !9
  %641 = load double, ptr %66, align 8, !tbaa !9
  %642 = call double @llvm.fabs.f64(double %641)
  %643 = fcmp ogt double %642, 1.000000e-05
  br i1 %643, label %644, label %646

644:                                              ; preds = %630
  store i32 -1, ptr %2, align 4, !tbaa !5
  %645 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 800, ptr noundef @.str.104, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %665

646:                                              ; preds = %630
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #8
  %647 = load ptr, ptr %27, align 8, !tbaa !11
  %648 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %647, i32 0, i32 2
  %649 = load i32, ptr %648, align 8, !tbaa !23
  %650 = load double, ptr %50, align 8, !tbaa !9
  %651 = getelementptr inbounds [9 x double], ptr %60, i64 0, i64 0
  %652 = getelementptr inbounds [17 x [3 x double]], ptr %29, i64 0, i64 0
  %653 = load ptr, ptr %27, align 8, !tbaa !11
  %654 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %653, i32 0, i32 3
  %655 = load ptr, ptr %654, align 8, !tbaa !21
  %656 = getelementptr inbounds [17 x i8], ptr %47, i64 0, i64 0
  %657 = call noundef double @_ZN3ptmL21mapped_neighbour_rmsdEidPdPA3_dPA3_KdPa(i32 noundef %649, double noundef %650, ptr noundef %651, ptr noundef %652, ptr noundef %655, ptr noundef %656)
  store double %657, ptr %67, align 8, !tbaa !9
  %658 = load double, ptr %67, align 8, !tbaa !9
  %659 = call double @llvm.fabs.f64(double %658)
  %660 = fcmp ogt double %659, 1.000000e-05
  br i1 %660, label %661, label %663

661:                                              ; preds = %646
  store i32 -1, ptr %2, align 4, !tbaa !5
  %662 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 805, ptr noundef @.str.105, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %664

663:                                              ; preds = %646
  store i32 0, ptr %16, align 4
  br label %664

664:                                              ; preds = %663, %661
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #8
  br label %665

665:                                              ; preds = %664, %644
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #8
  br label %666

666:                                              ; preds = %665, %624, %582, %575, %569, %563, %554
  call void @llvm.lifetime.end.p0(i64 72, ptr %60) #8
  br label %667

667:                                              ; preds = %666, %541
  call void @llvm.lifetime.end.p0(i64 72, ptr %59) #8
  br label %668

668:                                              ; preds = %667, %532, %522, %512, %502, %496, %482, %470
  call void @llvm.lifetime.end.p0(i64 72, ptr %58) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %57) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %56) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %55) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %54) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #8
  call void @llvm.lifetime.end.p0(i64 17, ptr %47) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %46) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #8
  %669 = load i32, ptr %16, align 4
  switch i32 %669, label %674 [
    i32 0, label %670
  ]

670:                                              ; preds = %668
  br label %671

671:                                              ; preds = %670
  %672 = load i32, ptr %44, align 4, !tbaa !5
  %673 = add nsw i32 %672, 1
  store i32 %673, ptr %44, align 4, !tbaa !5
  br label %427, !llvm.loop !38

674:                                              ; preds = %668, %434
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #8
  %675 = load i32, ptr %16, align 4
  switch i32 %675, label %677 [
    i32 33, label %676
  ]

676:                                              ; preds = %674
  store i32 0, ptr %16, align 4
  br label %677

677:                                              ; preds = %676, %674
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %37) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #8
  call void @llvm.lifetime.end.p0(i64 408, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 408, ptr %28) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %26) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %25) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %24) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #8
  %678 = load i32, ptr %16, align 4
  switch i32 %678, label %683 [
    i32 0, label %679
  ]

679:                                              ; preds = %677
  br label %680

680:                                              ; preds = %679
  %681 = load i32, ptr %22, align 4, !tbaa !5
  %682 = add nsw i32 %681, 1
  store i32 %682, ptr %22, align 4, !tbaa !5
  br label %206, !llvm.loop !39

683:                                              ; preds = %677, %213
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #8
  %684 = load i32, ptr %16, align 4
  switch i32 %684, label %689 [
    i32 12, label %685
  ]

685:                                              ; preds = %683
  br label %686

686:                                              ; preds = %685
  %687 = load i32, ptr %21, align 4, !tbaa !5
  %688 = add nsw i32 %687, 1
  store i32 %688, ptr %21, align 4, !tbaa !5
  br label %200, !llvm.loop !40

689:                                              ; preds = %683, %204
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #8
  %690 = load i32, ptr %16, align 4
  switch i32 %690, label %1003 [
    i32 9, label %691
    i32 5, label %997
  ]

691:                                              ; preds = %689
  call void @llvm.lifetime.start.p0(i64 168, ptr %68) #8
  call void @llvm.memset.p0.i64(ptr align 16 %68, i8 0, i64 168, i1 false)
  %692 = getelementptr inbounds [7 x [3 x double]], ptr %68, i32 0, i32 1
  %693 = getelementptr inbounds [3 x double], ptr %692, i32 0, i32 0
  store double 2.000000e+00, ptr %693, align 8
  %694 = getelementptr inbounds [7 x [3 x double]], ptr %68, i32 0, i32 2
  %695 = getelementptr inbounds [3 x double], ptr %694, i32 0, i32 0
  store double -2.000000e+00, ptr %695, align 16
  %696 = getelementptr inbounds [7 x [3 x double]], ptr %68, i32 0, i32 3
  %697 = getelementptr inbounds [3 x double], ptr %696, i32 0, i32 1
  store double 2.000000e+00, ptr %697, align 8
  %698 = getelementptr inbounds [7 x [3 x double]], ptr %68, i32 0, i32 4
  %699 = getelementptr inbounds [3 x double], ptr %698, i32 0, i32 1
  store double -2.000000e+00, ptr %699, align 8
  %700 = getelementptr inbounds [7 x [3 x double]], ptr %68, i32 0, i32 5
  %701 = getelementptr inbounds [3 x double], ptr %700, i32 0, i32 2
  store double 2.000000e+00, ptr %701, align 8
  %702 = getelementptr inbounds [7 x [3 x double]], ptr %68, i32 0, i32 6
  %703 = getelementptr inbounds [3 x double], ptr %702, i32 0, i32 2
  store double -2.000000e+00, ptr %703, align 16
  call void @llvm.lifetime.start.p0(i64 312, ptr %69) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %69, ptr align 16 @__const._ZN3ptm9run_testsEv.lc_points_fcc, i64 312, i1 false)
  call void @llvm.lifetime.start.p0(i64 360, ptr %70) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %70, ptr align 16 @__const._ZN3ptm9run_testsEv.lc_points_bcc, i64 360, i1 false)
  call void @llvm.lifetime.start.p0(i64 408, ptr %71) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %71, ptr align 16 @__const._ZN3ptm9run_testsEv.lc_points_dcub, i64 408, i1 false)
  call void @llvm.lifetime.start.p0(i64 32, ptr %72) #8
  %704 = getelementptr inbounds [13 x [3 x double]], ptr %69, i64 0, i64 0
  store ptr %704, ptr %72, align 8, !tbaa !11
  %705 = getelementptr inbounds ptr, ptr %72, i64 1
  %706 = getelementptr inbounds [15 x [3 x double]], ptr %70, i64 0, i64 0
  store ptr %706, ptr %705, align 8, !tbaa !11
  %707 = getelementptr inbounds ptr, ptr %72, i64 2
  %708 = getelementptr inbounds [7 x [3 x double]], ptr %68, i64 0, i64 0
  store ptr %708, ptr %707, align 8, !tbaa !11
  %709 = getelementptr inbounds ptr, ptr %72, i64 3
  %710 = getelementptr inbounds [17 x [3 x double]], ptr %71, i64 0, i64 0
  store ptr %710, ptr %709, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 16, ptr %73) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %73, ptr align 16 @__const._ZN3ptm9run_testsEv.lcdat, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %74) #8
  store i32 0, ptr %74, align 4, !tbaa !5
  br label %711

711:                                              ; preds = %805, %691
  %712 = load i32, ptr %74, align 4, !tbaa !5
  %713 = icmp slt i32 %712, 4
  br i1 %713, label %715, label %714

714:                                              ; preds = %711
  store i32 36, ptr %16, align 4
  br label %808

715:                                              ; preds = %711
  call void @llvm.lifetime.start.p0(i64 8, ptr %75) #8
  %716 = load i32, ptr %74, align 4, !tbaa !5
  %717 = sext i32 %716 to i64
  %718 = getelementptr inbounds [4 x i32], ptr %73, i64 0, i64 %717
  %719 = load i32, ptr %718, align 4, !tbaa !5
  %720 = sext i32 %719 to i64
  %721 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %720
  store ptr %721, ptr %75, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %76) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %77) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %78) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %79) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %80) #8
  call void @llvm.lifetime.start.p0(i64 32, ptr %81) #8
  call void @llvm.lifetime.start.p0(i64 24, ptr %82) #8
  %722 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %82, i32 0, i32 0
  %723 = load ptr, ptr %75, align 8, !tbaa !11
  %724 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %723, i32 0, i32 2
  %725 = load i32, ptr %724, align 8, !tbaa !23
  store i32 %725, ptr %722, align 8, !tbaa !31
  %726 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %82, i32 0, i32 1
  %727 = load i32, ptr %74, align 4, !tbaa !5
  %728 = sext i32 %727 to i64
  %729 = getelementptr inbounds [4 x ptr], ptr %72, i64 0, i64 %728
  %730 = load ptr, ptr %729, align 8, !tbaa !11
  store ptr %730, ptr %726, align 8, !tbaa !33
  %731 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %82, i32 0, i32 2
  store ptr null, ptr %731, align 8, !tbaa !34
  %732 = load ptr, ptr %11, align 8, !tbaa !11
  %733 = load ptr, ptr %75, align 8, !tbaa !11
  %734 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %733, i32 0, i32 1
  %735 = load i32, ptr %734, align 4, !tbaa !29
  %736 = getelementptr inbounds [4 x double], ptr %81, i64 0, i64 0
  %737 = call i32 @ptm_index(ptr noundef %732, i64 noundef 0, ptr noundef @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef %82, i32 noundef %735, i1 noundef zeroext false, ptr noundef %76, ptr noundef null, ptr noundef %77, ptr noundef %78, ptr noundef %736, ptr noundef null, ptr noundef null, ptr noundef null, ptr noundef null, ptr noundef %79, ptr noundef %80, ptr noundef null, ptr noundef null, ptr noundef null)
  store i32 %737, ptr %2, align 4, !tbaa !5
  %738 = load i32, ptr %2, align 4, !tbaa !5
  %739 = icmp ne i32 %738, 0
  br i1 %739, label %740, label %744

740:                                              ; preds = %715
  %741 = load i32, ptr %2, align 4, !tbaa !5
  store i32 %741, ptr %2, align 4, !tbaa !5
  %742 = load i32, ptr %2, align 4, !tbaa !5
  %743 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 832, ptr noundef @.str.91, i32 noundef %742)
  store i32 5, ptr %16, align 4
  br label %802

744:                                              ; preds = %715
  %745 = load i32, ptr %76, align 4, !tbaa !5
  %746 = load ptr, ptr %75, align 8, !tbaa !11
  %747 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %746, i32 0, i32 0
  %748 = load i32, ptr %747, align 8, !tbaa !35
  %749 = icmp ne i32 %745, %748
  br i1 %749, label %750, label %752

750:                                              ; preds = %744
  store i32 -1, ptr %2, align 4, !tbaa !5
  %751 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 835, ptr noundef @.str.92, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %802

752:                                              ; preds = %744
  %753 = load double, ptr %80, align 8, !tbaa !9
  %754 = fsub double %753, 2.000000e+00
  %755 = call double @llvm.fabs.f64(double %754)
  %756 = fcmp ogt double %755, 1.000000e-05
  br i1 %756, label %757, label %759

757:                                              ; preds = %752
  store i32 -1, ptr %2, align 4, !tbaa !5
  %758 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 838, ptr noundef @.str.106, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %802

759:                                              ; preds = %752
  call void @llvm.lifetime.start.p0(i64 8, ptr %83) #8
  %760 = load i32, ptr %74, align 4, !tbaa !5
  %761 = sext i32 %760 to i64
  %762 = getelementptr inbounds [4 x ptr], ptr %72, i64 0, i64 %761
  %763 = load ptr, ptr %762, align 8, !tbaa !11
  %764 = getelementptr inbounds [3 x double], ptr %763, i64 1
  %765 = getelementptr inbounds [3 x double], ptr %764, i64 0, i64 0
  %766 = load double, ptr %765, align 8, !tbaa !9
  store double %766, ptr %83, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %84) #8
  %767 = load i32, ptr %74, align 4, !tbaa !5
  %768 = sext i32 %767 to i64
  %769 = getelementptr inbounds [4 x ptr], ptr %72, i64 0, i64 %768
  %770 = load ptr, ptr %769, align 8, !tbaa !11
  %771 = getelementptr inbounds [3 x double], ptr %770, i64 1
  %772 = getelementptr inbounds [3 x double], ptr %771, i64 0, i64 1
  %773 = load double, ptr %772, align 8, !tbaa !9
  store double %773, ptr %84, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %85) #8
  %774 = load i32, ptr %74, align 4, !tbaa !5
  %775 = sext i32 %774 to i64
  %776 = getelementptr inbounds [4 x ptr], ptr %72, i64 0, i64 %775
  %777 = load ptr, ptr %776, align 8, !tbaa !11
  %778 = getelementptr inbounds [3 x double], ptr %777, i64 1
  %779 = getelementptr inbounds [3 x double], ptr %778, i64 0, i64 2
  %780 = load double, ptr %779, align 8, !tbaa !9
  store double %780, ptr %85, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %86) #8
  %781 = load double, ptr %83, align 8, !tbaa !9
  %782 = load double, ptr %83, align 8, !tbaa !9
  %783 = load double, ptr %84, align 8, !tbaa !9
  %784 = load double, ptr %84, align 8, !tbaa !9
  %785 = fmul double %783, %784
  %786 = call double @llvm.fmuladd.f64(double %781, double %782, double %785)
  %787 = load double, ptr %85, align 8, !tbaa !9
  %788 = load double, ptr %85, align 8, !tbaa !9
  %789 = call double @llvm.fmuladd.f64(double %787, double %788, double %786)
  %790 = call double @sqrt(double noundef %789) #8
  store double %790, ptr %86, align 8, !tbaa !9
  %791 = load double, ptr %86, align 8, !tbaa !9
  %792 = load double, ptr %79, align 8, !tbaa !9
  %793 = fsub double %791, %792
  %794 = call double @llvm.fabs.f64(double %793)
  %795 = fcmp ogt double %794, 1.000000e-05
  br i1 %795, label %796, label %798

796:                                              ; preds = %759
  store i32 -1, ptr %2, align 4, !tbaa !5
  %797 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 845, ptr noundef @.str.103, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %801

798:                                              ; preds = %759
  %799 = load i32, ptr %10, align 4, !tbaa !5
  %800 = add nsw i32 %799, 1
  store i32 %800, ptr %10, align 4, !tbaa !5
  store i32 0, ptr %16, align 4
  br label %801

801:                                              ; preds = %798, %796
  call void @llvm.lifetime.end.p0(i64 8, ptr %86) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %85) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %84) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %83) #8
  br label %802

802:                                              ; preds = %801, %757, %750, %740
  call void @llvm.lifetime.end.p0(i64 24, ptr %82) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %81) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %80) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %79) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %78) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %77) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %76) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %75) #8
  %803 = load i32, ptr %16, align 4
  switch i32 %803, label %808 [
    i32 0, label %804
  ]

804:                                              ; preds = %802
  br label %805

805:                                              ; preds = %804
  %806 = load i32, ptr %74, align 4, !tbaa !5
  %807 = add nsw i32 %806, 1
  store i32 %807, ptr %74, align 4, !tbaa !5
  br label %711, !llvm.loop !41

808:                                              ; preds = %802, %714
  call void @llvm.lifetime.end.p0(i64 4, ptr %74) #8
  %809 = load i32, ptr %16, align 4
  switch i32 %809, label %811 [
    i32 36, label %810
  ]

810:                                              ; preds = %808
  store i32 0, ptr %16, align 4
  br label %811

811:                                              ; preds = %810, %808
  call void @llvm.lifetime.end.p0(i64 16, ptr %73) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %72) #8
  call void @llvm.lifetime.end.p0(i64 408, ptr %71) #8
  call void @llvm.lifetime.end.p0(i64 360, ptr %70) #8
  call void @llvm.lifetime.end.p0(i64 312, ptr %69) #8
  call void @llvm.lifetime.end.p0(i64 168, ptr %68) #8
  %812 = load i32, ptr %16, align 4
  switch i32 %812, label %1003 [
    i32 0, label %813
    i32 5, label %997
  ]

813:                                              ; preds = %811
  call void @llvm.lifetime.start.p0(i64 4, ptr %87) #8
  store i32 0, ptr %87, align 4, !tbaa !5
  br label %814

814:                                              ; preds = %897, %813
  %815 = load i32, ptr %87, align 4, !tbaa !5
  %816 = icmp slt i32 %815, 8
  br i1 %816, label %818, label %817

817:                                              ; preds = %814
  store i32 39, ptr %16, align 4
  br label %900

818:                                              ; preds = %814
  call void @llvm.lifetime.start.p0(i64 8, ptr %88) #8
  %819 = load i32, ptr %87, align 4, !tbaa !5
  %820 = sext i32 %819 to i64
  %821 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %820
  store ptr %821, ptr %88, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %89) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %90) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %91) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %92) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %93) #8
  call void @llvm.lifetime.start.p0(i64 32, ptr %94) #8
  call void @llvm.lifetime.start.p0(i64 72, ptr %95) #8
  call void @llvm.lifetime.start.p0(i64 24, ptr %96) #8
  call void @llvm.lifetime.start.p0(i64 408, ptr %97) #8
  %822 = getelementptr inbounds [17 x [3 x double]], ptr %97, i64 0, i64 0
  %823 = load ptr, ptr %88, align 8, !tbaa !11
  %824 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %823, i32 0, i32 3
  %825 = load ptr, ptr %824, align 8, !tbaa !21
  %826 = load ptr, ptr %88, align 8, !tbaa !11
  %827 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %826, i32 0, i32 2
  %828 = load i32, ptr %827, align 8, !tbaa !23
  %829 = sext i32 %828 to i64
  %830 = mul i64 24, %829
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %822, ptr align 8 %825, i64 %830, i1 false)
  call void @llvm.lifetime.start.p0(i64 24, ptr %98) #8
  %831 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %98, i32 0, i32 0
  %832 = load ptr, ptr %88, align 8, !tbaa !11
  %833 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %832, i32 0, i32 2
  %834 = load i32, ptr %833, align 8, !tbaa !23
  store i32 %834, ptr %831, align 8, !tbaa !31
  %835 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %98, i32 0, i32 1
  %836 = getelementptr inbounds [17 x [3 x double]], ptr %97, i64 0, i64 0
  store ptr %836, ptr %835, align 8, !tbaa !33
  %837 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %98, i32 0, i32 2
  store ptr null, ptr %837, align 8, !tbaa !34
  %838 = load ptr, ptr %11, align 8, !tbaa !11
  %839 = load ptr, ptr %88, align 8, !tbaa !11
  %840 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %839, i32 0, i32 1
  %841 = load i32, ptr %840, align 4, !tbaa !29
  %842 = getelementptr inbounds [4 x double], ptr %94, i64 0, i64 0
  %843 = getelementptr inbounds [9 x double], ptr %95, i64 0, i64 0
  %844 = getelementptr inbounds [3 x double], ptr %96, i64 0, i64 0
  %845 = call i32 @ptm_index(ptr noundef %838, i64 noundef 0, ptr noundef @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef %98, i32 noundef %841, i1 noundef zeroext true, ptr noundef %89, ptr noundef null, ptr noundef %90, ptr noundef %91, ptr noundef %842, ptr noundef %843, ptr noundef %844, ptr noundef null, ptr noundef null, ptr noundef %92, ptr noundef %93, ptr noundef null, ptr noundef null, ptr noundef null)
  store i32 %845, ptr %2, align 4, !tbaa !5
  %846 = load i32, ptr %2, align 4, !tbaa !5
  %847 = icmp ne i32 %846, 0
  br i1 %847, label %848, label %852

848:                                              ; preds = %818
  %849 = load i32, ptr %2, align 4, !tbaa !5
  store i32 %849, ptr %2, align 4, !tbaa !5
  %850 = load i32, ptr %2, align 4, !tbaa !5
  %851 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 866, ptr noundef @.str.91, i32 noundef %850)
  store i32 5, ptr %16, align 4
  br label %894

852:                                              ; preds = %818
  %853 = load i32, ptr %89, align 4, !tbaa !5
  %854 = load ptr, ptr %88, align 8, !tbaa !11
  %855 = getelementptr inbounds %"struct.ptm::structdata_t", ptr %854, i32 0, i32 0
  %856 = load i32, ptr %855, align 8, !tbaa !35
  %857 = icmp ne i32 %853, %856
  br i1 %857, label %858, label %860

858:                                              ; preds = %852
  store i32 -1, ptr %2, align 4, !tbaa !5
  %859 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 870, ptr noundef @.str.92, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %894

860:                                              ; preds = %852
  %861 = load double, ptr %91, align 8, !tbaa !9
  %862 = fcmp ogt double %861, 1.000000e-05
  br i1 %862, label %863, label %865

863:                                              ; preds = %860
  store i32 -1, ptr %2, align 4, !tbaa !5
  %864 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 874, ptr noundef @.str.97, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %894

865:                                              ; preds = %860
  call void @llvm.lifetime.start.p0(i64 8, ptr %99) #8
  %866 = getelementptr inbounds [3 x double], ptr %96, i64 0, i64 0
  %867 = load double, ptr %866, align 16, !tbaa !9
  %868 = getelementptr inbounds [3 x double], ptr %96, i64 0, i64 0
  %869 = load double, ptr %868, align 16, !tbaa !9
  %870 = getelementptr inbounds [3 x double], ptr %96, i64 0, i64 1
  %871 = load double, ptr %870, align 8, !tbaa !9
  %872 = getelementptr inbounds [3 x double], ptr %96, i64 0, i64 1
  %873 = load double, ptr %872, align 8, !tbaa !9
  %874 = fmul double %871, %873
  %875 = call double @llvm.fmuladd.f64(double %867, double %869, double %874)
  %876 = getelementptr inbounds [3 x double], ptr %96, i64 0, i64 2
  %877 = load double, ptr %876, align 16, !tbaa !9
  %878 = getelementptr inbounds [3 x double], ptr %96, i64 0, i64 2
  %879 = load double, ptr %878, align 16, !tbaa !9
  %880 = call double @llvm.fmuladd.f64(double %877, double %879, double %875)
  %881 = call double @sqrt(double noundef %880) #8
  store double %881, ptr %99, align 8, !tbaa !9
  %882 = load double, ptr %99, align 8, !tbaa !9
  %883 = fcmp ogt double %882, 1.000000e-05
  br i1 %883, label %884, label %886

884:                                              ; preds = %865
  store i32 -1, ptr %2, align 4, !tbaa !5
  %885 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 879, ptr noundef @.str.107, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %893

886:                                              ; preds = %865
  %887 = getelementptr inbounds [9 x double], ptr %95, i64 0, i64 0
  %888 = getelementptr inbounds [9 x double], ptr %4, i64 0, i64 0
  %889 = call noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef %887, ptr noundef %888, double noundef 1.000000e-05)
  br i1 %889, label %892, label %890

890:                                              ; preds = %886
  store i32 -1, ptr %2, align 4, !tbaa !5
  %891 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 883, ptr noundef @.str.108, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %893

892:                                              ; preds = %886
  store i32 0, ptr %16, align 4
  br label %893

893:                                              ; preds = %892, %890, %884
  call void @llvm.lifetime.end.p0(i64 8, ptr %99) #8
  br label %894

894:                                              ; preds = %893, %863, %858, %848
  call void @llvm.lifetime.end.p0(i64 24, ptr %98) #8
  call void @llvm.lifetime.end.p0(i64 408, ptr %97) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %96) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %95) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %94) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %93) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %92) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %91) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %90) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %89) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %88) #8
  %895 = load i32, ptr %16, align 4
  switch i32 %895, label %900 [
    i32 0, label %896
  ]

896:                                              ; preds = %894
  br label %897

897:                                              ; preds = %896
  %898 = load i32, ptr %87, align 4, !tbaa !5
  %899 = add nsw i32 %898, 1
  store i32 %899, ptr %87, align 4, !tbaa !5
  br label %814, !llvm.loop !42

900:                                              ; preds = %894, %817
  call void @llvm.lifetime.end.p0(i64 4, ptr %87) #8
  %901 = load i32, ptr %16, align 4
  switch i32 %901, label %1003 [
    i32 39, label %902
    i32 5, label %997
  ]

902:                                              ; preds = %900
  call void @llvm.lifetime.start.p0(i64 48, ptr %100) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %100, ptr align 16 @__const._ZN3ptm9run_testsEv.alt_templates, i64 48, i1 false)
  call void @llvm.lifetime.start.p0(i64 24, ptr %101) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %101, ptr align 16 @__const._ZN3ptm9run_testsEv.num_points, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 24, ptr %102) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %102, ptr align 16 @__const._ZN3ptm9run_testsEv.checks, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 24, ptr %103) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %103, ptr align 16 @__const._ZN3ptm9run_testsEv.types, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %104) #8
  store i32 0, ptr %104, align 4, !tbaa !5
  br label %903

903:                                              ; preds = %988, %902
  %904 = load i32, ptr %104, align 4, !tbaa !5
  %905 = icmp slt i32 %904, 6
  br i1 %905, label %907, label %906

906:                                              ; preds = %903
  store i32 42, ptr %16, align 4
  br label %991

907:                                              ; preds = %903
  call void @llvm.lifetime.start.p0(i64 4, ptr %105) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %106) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %107) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %108) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %109) #8
  call void @llvm.lifetime.start.p0(i64 32, ptr %110) #8
  call void @llvm.lifetime.start.p0(i64 72, ptr %111) #8
  call void @llvm.lifetime.start.p0(i64 24, ptr %112) #8
  call void @llvm.lifetime.start.p0(i64 408, ptr %113) #8
  %908 = getelementptr inbounds [17 x [3 x double]], ptr %113, i64 0, i64 0
  %909 = load i32, ptr %104, align 4, !tbaa !5
  %910 = sext i32 %909 to i64
  %911 = getelementptr inbounds [6 x ptr], ptr %100, i64 0, i64 %910
  %912 = load ptr, ptr %911, align 8, !tbaa !11
  %913 = load i32, ptr %104, align 4, !tbaa !5
  %914 = sext i32 %913 to i64
  %915 = getelementptr inbounds [6 x i32], ptr %101, i64 0, i64 %914
  %916 = load i32, ptr %915, align 4, !tbaa !5
  %917 = sext i32 %916 to i64
  %918 = mul i64 24, %917
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %908, ptr align 1 %912, i64 %918, i1 false)
  call void @llvm.lifetime.start.p0(i64 24, ptr %114) #8
  %919 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %114, i32 0, i32 0
  %920 = load i32, ptr %104, align 4, !tbaa !5
  %921 = sext i32 %920 to i64
  %922 = getelementptr inbounds [6 x i32], ptr %101, i64 0, i64 %921
  %923 = load i32, ptr %922, align 4, !tbaa !5
  store i32 %923, ptr %919, align 8, !tbaa !31
  %924 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %114, i32 0, i32 1
  %925 = getelementptr inbounds [17 x [3 x double]], ptr %113, i64 0, i64 0
  store ptr %925, ptr %924, align 8, !tbaa !33
  %926 = getelementptr inbounds %"struct.ptm::unittest_nbrdata_t", ptr %114, i32 0, i32 2
  store ptr null, ptr %926, align 8, !tbaa !34
  %927 = load ptr, ptr %11, align 8, !tbaa !11
  %928 = load i32, ptr %104, align 4, !tbaa !5
  %929 = sext i32 %928 to i64
  %930 = getelementptr inbounds [6 x i32], ptr %102, i64 0, i64 %929
  %931 = load i32, ptr %930, align 4, !tbaa !5
  %932 = getelementptr inbounds [4 x double], ptr %110, i64 0, i64 0
  %933 = getelementptr inbounds [9 x double], ptr %111, i64 0, i64 0
  %934 = getelementptr inbounds [3 x double], ptr %112, i64 0, i64 0
  %935 = call i32 @ptm_index(ptr noundef %927, i64 noundef 0, ptr noundef @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef %114, i32 noundef %931, i1 noundef zeroext true, ptr noundef %105, ptr noundef null, ptr noundef %106, ptr noundef %107, ptr noundef %932, ptr noundef %933, ptr noundef %934, ptr noundef null, ptr noundef null, ptr noundef %108, ptr noundef %109, ptr noundef null, ptr noundef null, ptr noundef null)
  store i32 %935, ptr %2, align 4, !tbaa !5
  %936 = load i32, ptr %2, align 4, !tbaa !5
  %937 = icmp ne i32 %936, 0
  br i1 %937, label %938, label %942

938:                                              ; preds = %907
  %939 = load i32, ptr %2, align 4, !tbaa !5
  store i32 %939, ptr %2, align 4, !tbaa !5
  %940 = load i32, ptr %2, align 4, !tbaa !5
  %941 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 904, ptr noundef @.str.91, i32 noundef %940)
  store i32 5, ptr %16, align 4
  br label %985

942:                                              ; preds = %907
  %943 = load i32, ptr %105, align 4, !tbaa !5
  %944 = load i32, ptr %104, align 4, !tbaa !5
  %945 = sext i32 %944 to i64
  %946 = getelementptr inbounds [6 x i32], ptr %103, i64 0, i64 %945
  %947 = load i32, ptr %946, align 4, !tbaa !5
  %948 = icmp ne i32 %943, %947
  br i1 %948, label %949, label %951

949:                                              ; preds = %942
  store i32 -1, ptr %2, align 4, !tbaa !5
  %950 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 908, ptr noundef @.str.92, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %985

951:                                              ; preds = %942
  %952 = load double, ptr %107, align 8, !tbaa !9
  %953 = fcmp ogt double %952, 1.000000e-05
  br i1 %953, label %954, label %956

954:                                              ; preds = %951
  store i32 -1, ptr %2, align 4, !tbaa !5
  %955 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 912, ptr noundef @.str.97, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %985

956:                                              ; preds = %951
  call void @llvm.lifetime.start.p0(i64 8, ptr %115) #8
  %957 = getelementptr inbounds [3 x double], ptr %112, i64 0, i64 0
  %958 = load double, ptr %957, align 16, !tbaa !9
  %959 = getelementptr inbounds [3 x double], ptr %112, i64 0, i64 0
  %960 = load double, ptr %959, align 16, !tbaa !9
  %961 = getelementptr inbounds [3 x double], ptr %112, i64 0, i64 1
  %962 = load double, ptr %961, align 8, !tbaa !9
  %963 = getelementptr inbounds [3 x double], ptr %112, i64 0, i64 1
  %964 = load double, ptr %963, align 8, !tbaa !9
  %965 = fmul double %962, %964
  %966 = call double @llvm.fmuladd.f64(double %958, double %960, double %965)
  %967 = getelementptr inbounds [3 x double], ptr %112, i64 0, i64 2
  %968 = load double, ptr %967, align 16, !tbaa !9
  %969 = getelementptr inbounds [3 x double], ptr %112, i64 0, i64 2
  %970 = load double, ptr %969, align 16, !tbaa !9
  %971 = call double @llvm.fmuladd.f64(double %968, double %970, double %966)
  %972 = call double @sqrt(double noundef %971) #8
  store double %972, ptr %115, align 8, !tbaa !9
  %973 = load double, ptr %115, align 8, !tbaa !9
  %974 = fcmp ogt double %973, 1.000000e-05
  br i1 %974, label %975, label %977

975:                                              ; preds = %956
  store i32 -1, ptr %2, align 4, !tbaa !5
  %976 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 917, ptr noundef @.str.107, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %984

977:                                              ; preds = %956
  %978 = getelementptr inbounds [9 x double], ptr %111, i64 0, i64 0
  %979 = getelementptr inbounds [9 x double], ptr %4, i64 0, i64 0
  %980 = call noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef %978, ptr noundef %979, double noundef 1.000000e-05)
  br i1 %980, label %983, label %981

981:                                              ; preds = %977
  store i32 -1, ptr %2, align 4, !tbaa !5
  %982 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef @.str, ptr noundef @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 921, ptr noundef @.str.108, i32 noundef -1)
  store i32 5, ptr %16, align 4
  br label %984

983:                                              ; preds = %977
  store i32 0, ptr %16, align 4
  br label %984

984:                                              ; preds = %983, %981, %975
  call void @llvm.lifetime.end.p0(i64 8, ptr %115) #8
  br label %985

985:                                              ; preds = %984, %954, %949, %938
  call void @llvm.lifetime.end.p0(i64 24, ptr %114) #8
  call void @llvm.lifetime.end.p0(i64 408, ptr %113) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %112) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %111) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %110) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %109) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %108) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %107) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %106) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %105) #8
  %986 = load i32, ptr %16, align 4
  switch i32 %986, label %991 [
    i32 0, label %987
  ]

987:                                              ; preds = %985
  br label %988

988:                                              ; preds = %987
  %989 = load i32, ptr %104, align 4, !tbaa !5
  %990 = add nsw i32 %989, 1
  store i32 %990, ptr %104, align 4, !tbaa !5
  br label %903, !llvm.loop !43

991:                                              ; preds = %985, %906
  call void @llvm.lifetime.end.p0(i64 4, ptr %104) #8
  %992 = load i32, ptr %16, align 4
  switch i32 %992, label %994 [
    i32 42, label %993
  ]

993:                                              ; preds = %991
  store i32 0, ptr %16, align 4
  br label %994

994:                                              ; preds = %993, %991
  call void @llvm.lifetime.end.p0(i64 24, ptr %103) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %102) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %101) #8
  call void @llvm.lifetime.end.p0(i64 48, ptr %100) #8
  %995 = load i32, ptr %16, align 4
  switch i32 %995, label %1003 [
    i32 0, label %996
    i32 5, label %997
  ]

996:                                              ; preds = %994
  br label %997

997:                                              ; preds = %996, %994, %900, %811, %689, %197, %157
  %998 = load i32, ptr %10, align 4, !tbaa !5
  %999 = call i32 (ptr, ...) @printf(ptr noundef @.str.109, i32 noundef %998)
  %1000 = load ptr, ptr %11, align 8, !tbaa !11
  call void @ptm_uninitialize_local(ptr noundef %1000)
  %1001 = load i32, ptr %2, align 4, !tbaa !5
  %1002 = sext i32 %1001 to i64
  store i64 %1002, ptr %1, align 8
  store i32 1, ptr %16, align 4
  br label %1003

1003:                                             ; preds = %997, %994, %900, %811, %689, %197, %157
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #8
  call void @llvm.lifetime.end.p0(i64 64, ptr %9) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %8) #8
  call void @llvm.lifetime.end.p0(i64 64, ptr %7) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr %6) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %4) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %2) #8
  %1004 = load i64, ptr %1, align 8
  ret i64 %1004
}

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

declare ptr @ptm_initialize_local() #6

declare void @_ZN3ptm29rotation_matrix_to_quaternionEPdS0_(ptr noundef, ptr noundef) #6

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

; Function Attrs: mustprogress uwtable
declare hidden noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef, ptr noundef, i32 noundef, ptr noundef, i32 noundef) #4

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

declare void @_ZN3ptm29quaternion_to_rotation_matrixEPdS0_(ptr noundef, ptr noundef) #6

declare void @_ZN3ptm20normalize_quaternionEPd(ptr noundef) #6

; Function Attrs: mustprogress nounwind uwtable
declare hidden void @_ZN3ptmL6matvecEPdS0_S0_(ptr noundef, ptr noundef, ptr noundef) #7

declare i32 @ptm_index(ptr noundef, i64 noundef, ptr noundef, ptr noundef, i32 noundef, i1 noundef zeroext, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #6

; Function Attrs: mustprogress uwtable
declare hidden noundef i32 @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d(ptr noundef, i64 noundef, i64 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

; Function Attrs: mustprogress nounwind uwtable
declare hidden noundef double @_ZN3ptmL18matrix_determinantEPd(ptr noundef) #7

; Function Attrs: mustprogress nounwind uwtable
declare hidden void @_ZN3ptmL6matmulEPdS0_S0_(ptr noundef, ptr noundef, ptr noundef) #7

; Function Attrs: mustprogress nounwind uwtable
declare hidden noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef, ptr noundef, double noundef) #7

declare noundef double @_ZN3ptm19quat_misorientationEPdS0_(ptr noundef, ptr noundef) #6

; Function Attrs: mustprogress uwtable
declare hidden noundef double @_ZN3ptmL22nearest_neighbour_rmsdEidPdPA3_dPA3_Kd(i32 noundef, double noundef, ptr noundef, ptr noundef, ptr noundef) #4

; Function Attrs: mustprogress uwtable
declare hidden noundef double @_ZN3ptmL21mapped_neighbour_rmsdEidPdPA3_dPA3_KdPa(i32 noundef, double noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

declare i32 @printf(ptr noundef, ...) #6

declare void @ptm_uninitialize_local(ptr noundef) #6

attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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 #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { mustprogress 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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #6 = { "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 #7 = { mustprogress 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 #8 = { 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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"double", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"any pointer", !7, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = distinct !{!15, !14}
!16 = !{!17, !18, i64 0}
!17 = !{!"_ZTSN3ptm10quattest_tE", !18, i64 0, !7, i64 8, !7, i64 80}
!18 = !{!"bool", !7, i64 0}
!19 = !{i8 0, i8 2}
!20 = !{}
!21 = !{!22, !12, i64 16}
!22 = !{!"_ZTSN3ptm12structdata_tE", !6, i64 0, !6, i64 4, !6, i64 8, !12, i64 16}
!23 = !{!22, !6, i64 8}
!24 = distinct !{!24, !14}
!25 = distinct !{!25, !14}
!26 = distinct !{!26, !14}
!27 = distinct !{!27, !14}
!28 = distinct !{!28, !14}
!29 = !{!22, !6, i64 4}
!30 = distinct !{!30, !14}
!31 = !{!32, !6, i64 0}
!32 = !{!"_ZTSN3ptm18unittest_nbrdata_tE", !6, i64 0, !12, i64 8, !12, i64 16}
!33 = !{!32, !12, i64 8}
!34 = !{!32, !12, i64 16}
!35 = !{!22, !6, i64 0}
!36 = !{!37, !6, i64 0}
!37 = !{!"_ZTSN3ptm11alloytest_tE", !6, i64 0, !7, i64 4}
!38 = distinct !{!38, !14}
!39 = distinct !{!39, !14}
!40 = distinct !{!40, !14}
!41 = distinct !{!41, !14}
!42 = distinct !{!42, !14}
!43 = distinct !{!43, !14}


; 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.ptm::structdata_t" = type { i32, i32, i32, ptr }
%"struct.ptm::unittest_nbrdata_t" = type { i32, ptr, ptr }
%"struct.ptm::quattest_t" = type { i8, [9 x double], [9 x double] }
%"struct.ptm::alloytest_t" = type { i32, [17 x i32] }

@_ZN3ptm10structdataE = external dso_local local_unnamed_addr global [8 x %"struct.ptm::structdata_t"], align 16
@__const._ZN3ptm9run_testsEv.num_alloy_tests = external hidden unnamed_addr constant [8 x i32], align 16
@__const._ZN3ptm9run_testsEv.alloy_test = external hidden unnamed_addr constant [8 x ptr], align 16
@__const._ZN3ptm9run_testsEv.num_quat_tests = external hidden unnamed_addr constant [8 x i32], align 16
@__const._ZN3ptm9run_testsEv.quat_test = external hidden unnamed_addr constant [8 x ptr], align 16
@.str = external hidden unnamed_addr constant [80 x i8], align 1
@__PRETTY_FUNCTION__._ZN3ptm9run_testsEv = external hidden unnamed_addr constant [26 x i8], align 1
@.str.89 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.90 = external hidden unnamed_addr constant [51 x i8], align 1
@__const._ZN3ptm9run_testsEv.offset = external hidden unnamed_addr constant [3 x double], align 16
@.str.91 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.92 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.93 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.94 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.95 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.96 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.97 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.98 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.99 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.100 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.101 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.102 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.103 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.104 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.105 = external hidden unnamed_addr constant [32 x i8], align 1
@__const._ZN3ptm9run_testsEv.lc_points_fcc = external hidden unnamed_addr constant [13 x [3 x double]], align 16
@__const._ZN3ptm9run_testsEv.lc_points_bcc = external hidden unnamed_addr constant [15 x [3 x double]], align 16
@__const._ZN3ptm9run_testsEv.lc_points_dcub = external hidden unnamed_addr constant [17 x [3 x double]], align 16
@__const._ZN3ptm9run_testsEv.lcdat = external hidden unnamed_addr constant [4 x i32], align 16
@.str.106 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.107 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.108 = external hidden unnamed_addr constant [34 x i8], align 1
@__const._ZN3ptm9run_testsEv.alt_templates = external hidden unnamed_addr constant [6 x ptr], align 16
@__const._ZN3ptm9run_testsEv.num_points = external hidden unnamed_addr constant [6 x i32], align 16
@__const._ZN3ptm9run_testsEv.checks = external hidden unnamed_addr constant [6 x i32], align 16
@__const._ZN3ptm9run_testsEv.types = external hidden unnamed_addr constant [6 x i32], align 16
@.str.109 = external hidden unnamed_addr constant [25 x i8], align 1

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #0

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

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

; Function Attrs: mustprogress uwtable
define dso_local noundef i64 @_ZN3ptm9run_testsEv() local_unnamed_addr #3 {
  %1 = alloca [9 x double], align 16
  %2 = alloca [9 x double], align 16
  %3 = alloca [4 x double], align 16
  %4 = alloca [4 x double], align 16
  %5 = alloca [9 x double], align 16
  %6 = alloca [4 x double], align 16
  %7 = alloca [4 x double], align 16
  %8 = alloca [9 x double], align 16
  %9 = alloca [17 x [3 x double]], align 16
  %10 = alloca [17 x [3 x double]], align 16
  %11 = alloca [3 x double], align 16
  %12 = alloca %"struct.ptm::unittest_nbrdata_t", align 8
  %13 = alloca [17 x i8], align 16
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca double, align 8
  %17 = alloca double, align 8
  %18 = alloca double, align 8
  %19 = alloca double, align 8
  %20 = alloca [4 x double], align 16
  %21 = alloca [9 x double], align 16
  %22 = alloca [3 x double], align 16
  %23 = alloca [9 x double], align 16
  %24 = alloca [9 x double], align 16
  %25 = alloca [9 x double], align 16
  %26 = alloca [9 x double], align 16
  %27 = alloca [4 x double], align 16
  %28 = alloca [7 x [3 x double]], align 16
  %29 = alloca [13 x [3 x double]], align 16
  %30 = alloca [15 x [3 x double]], align 16
  %31 = alloca [17 x [3 x double]], align 16
  %32 = alloca i32, align 4
  %33 = alloca double, align 8
  %34 = alloca double, align 8
  %35 = alloca double, align 8
  %36 = alloca double, align 8
  %37 = alloca [4 x double], align 16
  %38 = alloca %"struct.ptm::unittest_nbrdata_t", align 8
  %39 = alloca i32, align 4
  %40 = alloca double, align 8
  %41 = alloca double, align 8
  %42 = alloca double, align 8
  %43 = alloca double, align 8
  %44 = alloca [4 x double], align 16
  %45 = alloca [9 x double], align 16
  %46 = alloca [3 x double], align 16
  %47 = alloca [17 x [3 x double]], align 16
  %48 = alloca %"struct.ptm::unittest_nbrdata_t", align 8
  %49 = alloca i32, align 4
  %50 = alloca double, align 8
  %51 = alloca double, align 8
  %52 = alloca double, align 8
  %53 = alloca double, align 8
  %54 = alloca [4 x double], align 16
  %55 = alloca [9 x double], align 16
  %56 = alloca [3 x double], align 16
  %57 = alloca [17 x [3 x double]], align 16
  %58 = alloca %"struct.ptm::unittest_nbrdata_t", align 8
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %1) #9
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(72) %1, i8 0, i64 64, i1 false)
  store double 1.000000e+00, ptr %1, align 16
  %59 = getelementptr inbounds i8, ptr %1, i64 32
  store double 1.000000e+00, ptr %59, align 16
  %60 = getelementptr inbounds i8, ptr %1, i64 64
  store double 1.000000e+00, ptr %60, align 16
  %61 = tail call ptr @ptm_initialize_local()
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %2) #9
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(72) %2, i8 0, i64 72, i1 false)
  %62 = getelementptr inbounds i8, ptr %2, i64 16
  store double 1.000000e+00, ptr %62, align 16
  %63 = getelementptr inbounds i8, ptr %2, i64 32
  store double 1.000000e+00, ptr %63, align 16
  %64 = getelementptr inbounds i8, ptr %2, i64 48
  store double -1.000000e+00, ptr %64, align 16
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %3) #9
  call void @_ZN3ptm29rotation_matrix_to_quaternionEPdS0_(ptr noundef nonnull %2, ptr noundef nonnull %3)
  %65 = load double, ptr %3, align 16, !tbaa !5
  %66 = fadd double %65, 0xBFE6A09E667F3BCC
  %67 = call double @llvm.fabs.f64(double %66)
  %68 = fcmp ult double %67, 1.000000e-05
  br i1 %68, label %69, label %91

69:                                               ; preds = %0
  %70 = getelementptr inbounds i8, ptr %3, i64 8
  %71 = load double, ptr %70, align 8, !tbaa !5
  %72 = call double @llvm.fabs.f64(double %71)
  %73 = fcmp ult double %72, 1.000000e-05
  br i1 %73, label %74, label %91

74:                                               ; preds = %69
  %75 = getelementptr inbounds i8, ptr %3, i64 16
  %76 = load double, ptr %75, align 16, !tbaa !5
  %77 = fadd double %76, 0xBFE6A09E667F3BCC
  %78 = call double @llvm.fabs.f64(double %77)
  %79 = fcmp ult double %78, 1.000000e-05
  br i1 %79, label %80, label %91

80:                                               ; preds = %74
  %81 = getelementptr inbounds i8, ptr %3, i64 24
  %82 = load double, ptr %81, align 8, !tbaa !5
  %83 = call double @llvm.fabs.f64(double %82)
  %84 = fcmp ult double %83, 1.000000e-05
  br i1 %84, label %85, label %91

85:                                               ; preds = %80
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %3) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %2) #9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %4) #9
  store <2 x double> <double 0x3FE6A09E667F3BCC, double 0x3FE6A09E667F3BCC>, ptr %4, align 16, !tbaa !5
  %86 = getelementptr inbounds i8, ptr %4, i64 16
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %86, i8 0, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %5) #9
  call void @_ZN3ptm29quaternion_to_rotation_matrixEPdS0_(ptr noundef nonnull %4, ptr noundef nonnull %5)
  %87 = load double, ptr %5, align 16, !tbaa !5
  %88 = fadd double %87, -1.000000e+00
  %89 = call double @llvm.fabs.f64(double %88)
  %90 = fcmp ult double %89, 1.000000e-05
  br i1 %90, label %93, label %.thread271

91:                                               ; preds = %80, %74, %69, %0
  %92 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 559, ptr noundef nonnull @.str.89, i32 noundef -1)
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %3) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %2) #9
  br label %.loopexit

93:                                               ; preds = %85
  %94 = getelementptr inbounds i8, ptr %5, i64 8
  %95 = load double, ptr %94, align 8, !tbaa !5
  %96 = call double @llvm.fabs.f64(double %95)
  %97 = fcmp ult double %96, 1.000000e-05
  br i1 %97, label %98, label %.thread271

98:                                               ; preds = %93
  %99 = getelementptr inbounds i8, ptr %5, i64 16
  %100 = load double, ptr %99, align 16, !tbaa !5
  %101 = call double @llvm.fabs.f64(double %100)
  %102 = fcmp ult double %101, 1.000000e-05
  br i1 %102, label %103, label %.thread271

103:                                              ; preds = %98
  %104 = getelementptr inbounds i8, ptr %5, i64 24
  %105 = load double, ptr %104, align 8, !tbaa !5
  %106 = call double @llvm.fabs.f64(double %105)
  %107 = fcmp ult double %106, 1.000000e-05
  br i1 %107, label %108, label %.thread271

108:                                              ; preds = %103
  %109 = getelementptr inbounds i8, ptr %5, i64 32
  %110 = load double, ptr %109, align 16, !tbaa !5
  %111 = call double @llvm.fabs.f64(double %110)
  %112 = fcmp ult double %111, 1.000000e-05
  br i1 %112, label %113, label %.thread271

113:                                              ; preds = %108
  %114 = getelementptr inbounds i8, ptr %5, i64 40
  %115 = load double, ptr %114, align 8, !tbaa !5
  %116 = fadd double %115, 1.000000e+00
  %117 = call double @llvm.fabs.f64(double %116)
  %118 = fcmp ult double %117, 1.000000e-05
  br i1 %118, label %119, label %.thread271

119:                                              ; preds = %113
  %120 = getelementptr inbounds i8, ptr %5, i64 48
  %121 = load double, ptr %120, align 16, !tbaa !5
  %122 = call double @llvm.fabs.f64(double %121)
  %123 = fcmp ult double %122, 1.000000e-05
  br i1 %123, label %124, label %.thread271

124:                                              ; preds = %119
  %125 = getelementptr inbounds i8, ptr %5, i64 56
  %126 = load double, ptr %125, align 8, !tbaa !5
  %127 = fadd double %126, -1.000000e+00
  %128 = call double @llvm.fabs.f64(double %127)
  %129 = fcmp ult double %128, 1.000000e-05
  br i1 %129, label %130, label %.thread271

130:                                              ; preds = %124
  %131 = getelementptr inbounds i8, ptr %5, i64 64
  %132 = load double, ptr %131, align 16, !tbaa !5
  %133 = call double @llvm.fabs.f64(double %132)
  %134 = fcmp ult double %133, 1.000000e-05
  br i1 %134, label %135, label %.thread271

135:                                              ; preds = %130
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %5) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %4) #9
  %136 = getelementptr inbounds i8, ptr %12, i64 8
  %137 = getelementptr inbounds i8, ptr %12, i64 16
  %138 = getelementptr inbounds i8, ptr %24, i64 8
  %139 = getelementptr inbounds i8, ptr %24, i64 24
  %140 = getelementptr inbounds i8, ptr %24, i64 16
  %141 = getelementptr inbounds i8, ptr %24, i64 48
  %142 = getelementptr inbounds i8, ptr %24, i64 40
  %143 = getelementptr inbounds i8, ptr %24, i64 56
  %144 = getelementptr inbounds i8, ptr %9, i64 24
  %145 = getelementptr inbounds i8, ptr %9, i64 32
  %146 = getelementptr inbounds i8, ptr %9, i64 40
  %147 = load <2 x double>, ptr @__const._ZN3ptm9run_testsEv.offset, align 16
  %.pre621 = load double, ptr getelementptr inbounds (i8, ptr @__const._ZN3ptm9run_testsEv.offset, i64 16), align 16
  %broadcast.splat751 = shufflevector <2 x double> %147, <2 x double> poison, <2 x i32> zeroinitializer
  %broadcast.splat753 = shufflevector <2 x double> %147, <2 x double> poison, <2 x i32> <i32 1, i32 1>
  %broadcast.splatinsert754 = insertelement <2 x double> poison, double %.pre621, i64 0
  %broadcast.splat755 = shufflevector <2 x double> %broadcast.splatinsert754, <2 x double> poison, <2 x i32> zeroinitializer
  br label %.preheader355

.thread271:                                       ; preds = %130, %124, %119, %113, %108, %103, %98, %93, %85
  %148 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 574, ptr noundef nonnull @.str.90, i32 noundef -1)
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %5) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %4) #9
  br label %.loopexit

.preheader355:                                    ; preds = %135, %._crit_edge476
  %indvars.iv594 = phi i64 [ 0, %135 ], [ %indvars.iv.next595, %._crit_edge476 ]
  %indvars.iv592 = phi i64 [ 1, %135 ], [ %indvars.iv.next593, %._crit_edge476 ]
  %.0188478 = phi i32 [ 0, %135 ], [ %.1189.lcssa, %._crit_edge476 ]
  %149 = getelementptr inbounds [8 x i32], ptr @__const._ZN3ptm9run_testsEv.num_quat_tests, i64 0, i64 %indvars.iv594
  %150 = load i32, ptr %149, align 4, !tbaa !9
  %151 = icmp sgt i32 %150, 0
  br i1 %151, label %.lr.ph475, label %._crit_edge476

.lr.ph475:                                        ; preds = %.preheader355
  %152 = getelementptr inbounds [8 x ptr], ptr @__const._ZN3ptm9run_testsEv.quat_test, i64 0, i64 %indvars.iv594
  %153 = load ptr, ptr %152, align 8, !tbaa !11
  %154 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %indvars.iv594
  %155 = getelementptr inbounds i8, ptr %154, i64 16
  %156 = getelementptr inbounds i8, ptr %154, i64 8
  %157 = getelementptr inbounds [8 x i32], ptr @__const._ZN3ptm9run_testsEv.num_alloy_tests, i64 0, i64 %indvars.iv594
  %158 = getelementptr inbounds [8 x ptr], ptr @__const._ZN3ptm9run_testsEv.alloy_test, i64 0, i64 %indvars.iv594
  %wide.trip.count590 = zext nneg i32 %150 to i64
  %exitcond581.not = icmp eq i64 %indvars.iv592, 1
  %exitcond581.not.1 = icmp eq i64 %indvars.iv592, 2
  %exitcond581.not.2 = icmp eq i64 %indvars.iv592, 3
  %exitcond581.not.3 = icmp eq i64 %indvars.iv592, 4
  %exitcond581.not.4 = icmp eq i64 %indvars.iv592, 5
  %exitcond581.not.5 = icmp eq i64 %indvars.iv592, 6
  %exitcond581.not.6 = icmp eq i64 %indvars.iv592, 7
  br label %159

159:                                              ; preds = %.lr.ph475, %._crit_edge471
  %indvars.iv587 = phi i64 [ 0, %.lr.ph475 ], [ %indvars.iv.next588, %._crit_edge471 ]
  %.1189474 = phi i32 [ %.0188478, %.lr.ph475 ], [ %.2190.lcssa, %._crit_edge471 ]
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %6) #9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %7) #9
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %8) #9
  %160 = getelementptr inbounds %"struct.ptm::quattest_t", ptr %153, i64 %indvars.iv587
  %161 = getelementptr inbounds i8, ptr %160, i64 8
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(32) %6, ptr noundef nonnull align 8 dereferenceable(32) %161, i64 32, i1 false)
  %162 = getelementptr inbounds i8, ptr %160, i64 80
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(32) %7, ptr noundef nonnull align 8 dereferenceable(32) %162, i64 32, i1 false)
  %163 = load i8, ptr %160, align 8, !tbaa !13, !range !16, !noundef !17
  %164 = trunc nuw i8 %163 to i1
  br i1 %164, label %165, label %166

165:                                              ; preds = %159
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(72) %8, ptr noundef nonnull align 8 dereferenceable(72) %161, i64 72, i1 false)
  br label %167

166:                                              ; preds = %159
  call void @_ZN3ptm20normalize_quaternionEPd(ptr noundef nonnull %6)
  call void @_ZN3ptm20normalize_quaternionEPd(ptr noundef nonnull %7)
  call void @_ZN3ptm29quaternion_to_rotation_matrixEPdS0_(ptr noundef nonnull %6, ptr noundef nonnull %8)
  br label %167

167:                                              ; preds = %166, %165
  call void @llvm.lifetime.start.p0(i64 408, ptr nonnull %9) #9
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(408) %9, i8 0, i64 408, i1 false)
  call void @llvm.lifetime.start.p0(i64 408, ptr nonnull %10) #9
  %168 = load ptr, ptr %155, align 8, !tbaa !18
  %169 = load i32, ptr %156, align 8, !tbaa !20
  %170 = sext i32 %169 to i64
  %171 = mul nsw i64 %170, 24
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %10, ptr align 8 %168, i64 %171, i1 false)
  %172 = icmp sgt i32 %169, 0
  br i1 %172, label %.lr.ph, label %._crit_edge

._crit_edge.loopexit:                             ; preds = %.lr.ph
  %.pre = load ptr, ptr %155, align 8, !tbaa !18
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %167
  %173 = phi i32 [ %216, %._crit_edge.loopexit ], [ %169, %167 ]
  %174 = phi ptr [ %.pre, %._crit_edge.loopexit ], [ %168, %167 ]
  %175 = getelementptr inbounds i8, ptr %174, i64 24
  %176 = load double, ptr %175, align 8, !tbaa !5
  %177 = getelementptr inbounds i8, ptr %174, i64 32
  %178 = load double, ptr %177, align 8, !tbaa !5
  %179 = getelementptr inbounds i8, ptr %174, i64 40
  %180 = load double, ptr %179, align 8, !tbaa !5
  %181 = fmul double %178, %178
  %182 = call double @llvm.fmuladd.f64(double %176, double %176, double %181)
  %183 = call double @llvm.fmuladd.f64(double %180, double %180, double %182)
  %sqrt = call double @llvm.sqrt.f64(double %183)
  %184 = fmul double %sqrt, 5.000000e-01
  %185 = fdiv double 1.000000e+00, %184
  %186 = icmp sgt i32 %173, 0
  br i1 %186, label %.preheader351.preheader, label %.preheader353

.preheader351.preheader:                          ; preds = %._crit_edge
  %wide.trip.count = zext nneg i32 %173 to i64
  %min.iters.check758 = icmp eq i32 %173, 1
  br i1 %min.iters.check758, label %.preheader351.preheader782, label %vector.ph759

.preheader351.preheader782:                       ; preds = %middle.block756, %.preheader351.preheader
  %indvars.iv563.ph = phi i64 [ 0, %.preheader351.preheader ], [ %n.vec761, %middle.block756 ]
  %187 = insertelement <2 x double> poison, double %185, i64 0
  %188 = shufflevector <2 x double> %187, <2 x double> poison, <2 x i32> zeroinitializer
  br label %.preheader351

vector.ph759:                                     ; preds = %.preheader351.preheader
  %n.vec761 = and i64 %wide.trip.count, 2147483646
  %broadcast.splatinsert765 = insertelement <2 x double> poison, double %185, i64 0
  %broadcast.splat766 = shufflevector <2 x double> %broadcast.splatinsert765, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body763

vector.body763:                                   ; preds = %vector.body763, %vector.ph759
  %index764 = phi i64 [ 0, %vector.ph759 ], [ %index.next768, %vector.body763 ]
  %189 = or disjoint i64 %index764, 1
  %190 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %index764, i64 0
  %191 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %189, i64 0
  %192 = load double, ptr %190, align 16, !tbaa !5
  %193 = load double, ptr %191, align 8, !tbaa !5
  %194 = insertelement <2 x double> poison, double %192, i64 0
  %195 = insertelement <2 x double> %194, double %193, i64 1
  %196 = fmul <2 x double> %broadcast.splat766, %195
  %197 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %index764, i64 1
  %198 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %189, i64 1
  %199 = load double, ptr %197, align 8, !tbaa !5
  %200 = load double, ptr %198, align 16, !tbaa !5
  %201 = insertelement <2 x double> poison, double %199, i64 0
  %202 = insertelement <2 x double> %201, double %200, i64 1
  %203 = fmul <2 x double> %broadcast.splat766, %202
  %204 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %index764, i64 2
  %205 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %189, i64 2
  %206 = load double, ptr %204, align 16, !tbaa !5
  %207 = load double, ptr %205, align 8, !tbaa !5
  %208 = insertelement <2 x double> poison, double %206, i64 0
  %209 = insertelement <2 x double> %208, double %207, i64 1
  %210 = fmul <2 x double> %broadcast.splat766, %209
  %211 = getelementptr inbounds [17 x [3 x double]], ptr %9, i64 0, i64 %index764
  %212 = shufflevector <2 x double> %196, <2 x double> %203, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %213 = shufflevector <2 x double> %210, <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
  %interleaved.vec767 = shufflevector <4 x double> %212, <4 x double> %213, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>
  store <6 x double> %interleaved.vec767, ptr %211, align 16, !tbaa !5
  %index.next768 = add nuw i64 %index764, 2
  %214 = icmp eq i64 %index.next768, %n.vec761
  br i1 %214, label %middle.block756, label %vector.body763, !llvm.loop !21

middle.block756:                                  ; preds = %vector.body763
  %cmp.n769 = icmp eq i64 %n.vec761, %wide.trip.count
  br i1 %cmp.n769, label %.preheader354, label %.preheader351.preheader782

.lr.ph:                                           ; preds = %167, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %167 ]
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %11) #9
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(24) %11, i8 0, i64 24, i1 false)
  %215 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %indvars.iv
  call void @_ZN3ptmL6matvecEPdS0_S0_(ptr noundef nonnull %8, ptr noundef nonnull %215, ptr noundef nonnull %11)
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %215, ptr noundef nonnull align 16 dereferenceable(24) %11, i64 24, i1 false)
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %11) #9
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %216 = load i32, ptr %156, align 8, !tbaa !20
  %217 = sext i32 %216 to i64
  %218 = icmp slt i64 %indvars.iv.next, %217
  br i1 %218, label %.lr.ph, label %._crit_edge.loopexit, !llvm.loop !25

.preheader354:                                    ; preds = %.preheader351, %middle.block756
  br i1 %186, label %.preheader350.preheader, label %.preheader353

.preheader350.preheader:                          ; preds = %.preheader354
  %wide.trip.count573 = zext nneg i32 %173 to i64
  %min.iters.check = icmp eq i32 %173, 1
  br i1 %min.iters.check, label %.preheader350.preheader781, label %vector.ph

.preheader350.preheader781:                       ; preds = %middle.block, %.preheader350.preheader
  %indvars.iv570.ph = phi i64 [ 0, %.preheader350.preheader ], [ %n.vec, %middle.block ]
  %219 = insertelement <2 x double> poison, double %185, i64 0
  %220 = shufflevector <2 x double> %219, <2 x double> poison, <2 x i32> zeroinitializer
  br label %.preheader350

vector.ph:                                        ; preds = %.preheader350.preheader
  %n.vec = and i64 %wide.trip.count, 2147483646
  %broadcast.splatinsert = insertelement <2 x double> poison, double %185, i64 0
  %broadcast.splat = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %221 = or disjoint i64 %index, 1
  %222 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %index, i64 0
  %223 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %221, i64 0
  %224 = load double, ptr %222, align 16, !tbaa !5
  %225 = load double, ptr %223, align 8, !tbaa !5
  %226 = insertelement <2 x double> poison, double %224, i64 0
  %227 = insertelement <2 x double> %226, double %225, i64 1
  %228 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %227, <2 x double> %broadcast.splat, <2 x double> %broadcast.splat751)
  %229 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %index, i64 1
  %230 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %221, i64 1
  %231 = load double, ptr %229, align 8, !tbaa !5
  %232 = load double, ptr %230, align 16, !tbaa !5
  %233 = insertelement <2 x double> poison, double %231, i64 0
  %234 = insertelement <2 x double> %233, double %232, i64 1
  %235 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %234, <2 x double> %broadcast.splat, <2 x double> %broadcast.splat753)
  %236 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %index, i64 2
  %237 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %221, i64 2
  %238 = load double, ptr %236, align 16, !tbaa !5
  %239 = load double, ptr %237, align 8, !tbaa !5
  %240 = insertelement <2 x double> poison, double %238, i64 0
  %241 = insertelement <2 x double> %240, double %239, i64 1
  %242 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %241, <2 x double> %broadcast.splat, <2 x double> %broadcast.splat755)
  %243 = getelementptr inbounds i8, ptr %236, i64 -16
  %244 = shufflevector <2 x double> %228, <2 x double> %235, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %245 = shufflevector <2 x double> %242, <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
  %interleaved.vec = shufflevector <4 x double> %244, <4 x double> %245, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>
  store <6 x double> %interleaved.vec, ptr %243, align 16, !tbaa !5
  %index.next = add nuw i64 %index, 2
  %246 = icmp eq i64 %index.next, %n.vec
  br i1 %246, label %middle.block, label %vector.body, !llvm.loop !26

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  br i1 %cmp.n, label %.preheader353, label %.preheader350.preheader781

.preheader351:                                    ; preds = %.preheader351.preheader782, %.preheader351
  %indvars.iv563 = phi i64 [ %indvars.iv.next564, %.preheader351 ], [ %indvars.iv563.ph, %.preheader351.preheader782 ]
  %247 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %indvars.iv563, i64 0
  %248 = getelementptr inbounds [17 x [3 x double]], ptr %9, i64 0, i64 %indvars.iv563, i64 0
  %249 = load <2 x double>, ptr %247, align 8, !tbaa !5
  %250 = fmul <2 x double> %188, %249
  store <2 x double> %250, ptr %248, align 8, !tbaa !5
  %251 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %indvars.iv563, i64 2
  %252 = load double, ptr %251, align 8, !tbaa !5
  %253 = fmul double %185, %252
  %254 = getelementptr inbounds [17 x [3 x double]], ptr %9, i64 0, i64 %indvars.iv563, i64 2
  store double %253, ptr %254, align 8, !tbaa !5
  %indvars.iv.next564 = add nuw nsw i64 %indvars.iv563, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next564, %wide.trip.count
  br i1 %exitcond.not, label %.preheader354, label %.preheader351, !llvm.loop !27

.preheader350:                                    ; preds = %.preheader350.preheader781, %.preheader350
  %indvars.iv570 = phi i64 [ %indvars.iv.next571, %.preheader350 ], [ %indvars.iv570.ph, %.preheader350.preheader781 ]
  %255 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %indvars.iv570, i64 0
  %256 = load <2 x double>, ptr %255, align 8, !tbaa !5
  %257 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %256, <2 x double> %220, <2 x double> %147)
  store <2 x double> %257, ptr %255, align 8, !tbaa !5
  %258 = getelementptr inbounds [17 x [3 x double]], ptr %10, i64 0, i64 %indvars.iv570, i64 2
  %259 = load double, ptr %258, align 8, !tbaa !5
  %260 = call double @llvm.fmuladd.f64(double %259, double %185, double %.pre621)
  store double %260, ptr %258, align 8, !tbaa !5
  %indvars.iv.next571 = add nuw nsw i64 %indvars.iv570, 1
  %exitcond574.not = icmp eq i64 %indvars.iv.next571, %wide.trip.count573
  br i1 %exitcond574.not, label %.preheader353, label %.preheader350, !llvm.loop !28

.preheader352:                                    ; preds = %.preheader353.7, %.preheader353.6, %.preheader353.5, %.preheader353.4, %.preheader353.3, %.preheader353.2, %.preheader353.1, %.preheader353
  %.1233.lcssa = phi i32 [ %spec.select, %.preheader353 ], [ %.1233.1, %.preheader353.1 ], [ %.1233.2, %.preheader353.2 ], [ %.1233.3, %.preheader353.3 ], [ %.1233.4, %.preheader353.4 ], [ %.1233.5, %.preheader353.5 ], [ %.1233.6, %.preheader353.6 ], [ %.1233.7, %.preheader353.7 ]
  %261 = load i32, ptr %157, align 4, !tbaa !9
  %262 = icmp sgt i32 %261, 0
  br i1 %262, label %.lr.ph470, label %._crit_edge471

.lr.ph470:                                        ; preds = %.preheader352
  %263 = load ptr, ptr %158, align 8, !tbaa !11
  %264 = fdiv double 1.000000e+00, %185
  %265 = load double, ptr %144, align 8
  %266 = load double, ptr %145, align 16
  %267 = load double, ptr %146, align 8
  %268 = fmul double %266, %266
  %269 = call double @llvm.fmuladd.f64(double %265, double %265, double %268)
  %270 = call double @llvm.fmuladd.f64(double %267, double %267, double %269)
  %sqrt346 = call double @llvm.sqrt.f64(double %270)
  %271 = add i32 %.1189474, %261
  %wide.trip.count585 = zext nneg i32 %261 to i64
  br label %295

.preheader353:                                    ; preds = %.preheader354, %._crit_edge, %middle.block, %.preheader350
  %272 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 8), align 8, !tbaa !20
  %.not253 = icmp sgt i32 %272, %173
  %273 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 4), align 4
  %spec.select = select i1 %.not253, i32 0, i32 %273
  br i1 %exitcond581.not, label %.preheader352, label %.preheader353.1, !llvm.loop !29

.preheader353.1:                                  ; preds = %.preheader353
  %274 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 32), align 16, !tbaa !20
  %.not253.1 = icmp sgt i32 %274, %173
  %275 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 28), align 4
  %276 = or i32 %275, %spec.select
  %.1233.1 = select i1 %.not253.1, i32 %spec.select, i32 %276
  br i1 %exitcond581.not.1, label %.preheader352, label %.preheader353.2, !llvm.loop !29

.preheader353.2:                                  ; preds = %.preheader353.1
  %277 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 56), align 8, !tbaa !20
  %.not253.2 = icmp sgt i32 %277, %173
  %278 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 52), align 4
  %279 = or i32 %278, %.1233.1
  %.1233.2 = select i1 %.not253.2, i32 %.1233.1, i32 %279
  br i1 %exitcond581.not.2, label %.preheader352, label %.preheader353.3, !llvm.loop !29

.preheader353.3:                                  ; preds = %.preheader353.2
  %280 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 80), align 16, !tbaa !20
  %.not253.3 = icmp sgt i32 %280, %173
  %281 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 76), align 4
  %282 = or i32 %281, %.1233.2
  %.1233.3 = select i1 %.not253.3, i32 %.1233.2, i32 %282
  br i1 %exitcond581.not.3, label %.preheader352, label %.preheader353.4, !llvm.loop !29

.preheader353.4:                                  ; preds = %.preheader353.3
  %283 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 104), align 8, !tbaa !20
  %.not253.4 = icmp sgt i32 %283, %173
  %284 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 100), align 4
  %285 = or i32 %284, %.1233.3
  %.1233.4 = select i1 %.not253.4, i32 %.1233.3, i32 %285
  br i1 %exitcond581.not.4, label %.preheader352, label %.preheader353.5, !llvm.loop !29

.preheader353.5:                                  ; preds = %.preheader353.4
  %286 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 128), align 16, !tbaa !20
  %.not253.5 = icmp sgt i32 %286, %173
  %287 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 124), align 4
  %288 = or i32 %287, %.1233.4
  %.1233.5 = select i1 %.not253.5, i32 %.1233.4, i32 %288
  br i1 %exitcond581.not.5, label %.preheader352, label %.preheader353.6, !llvm.loop !29

.preheader353.6:                                  ; preds = %.preheader353.5
  %289 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 152), align 8, !tbaa !20
  %.not253.6 = icmp sgt i32 %289, %173
  %290 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 148), align 4
  %291 = or i32 %290, %.1233.5
  %.1233.6 = select i1 %.not253.6, i32 %.1233.5, i32 %291
  br i1 %exitcond581.not.6, label %.preheader352, label %.preheader353.7, !llvm.loop !29

.preheader353.7:                                  ; preds = %.preheader353.6
  %292 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 176), align 16, !tbaa !20
  %.not253.7 = icmp sgt i32 %292, %173
  %293 = load i32, ptr getelementptr inbounds (i8, ptr @_ZN3ptm10structdataE, i64 172), align 4
  %294 = or i32 %293, %.1233.6
  %.1233.7 = select i1 %.not253.7, i32 %.1233.6, i32 %294
  br label %.preheader352

295:                                              ; preds = %.lr.ph470, %407
  %indvars.iv582 = phi i64 [ 0, %.lr.ph470 ], [ %indvars.iv.next583, %407 ]
  %.2190469 = phi i32 [ %.1189474, %.lr.ph470 ], [ %304, %407 ]
  %296 = getelementptr inbounds %"struct.ptm::alloytest_t", ptr %263, i64 %indvars.iv582, i32 1
  %297 = load i32, ptr %296, align 4, !tbaa !9
  %298 = icmp eq i32 %297, -1
  %spec.store.select13 = select i1 %298, ptr null, ptr %296
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %12) #9
  %299 = load i32, ptr %156, align 8, !tbaa !20
  store i32 %299, ptr %12, align 8, !tbaa !30
  store ptr %10, ptr %136, align 8, !tbaa !32
  store ptr %spec.store.select13, ptr %137, align 8, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 17, ptr nonnull %13) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %14) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %15) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %16) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %17) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %18) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %19) #9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %20) #9
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %21) #9
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %22) #9
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %23) #9
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %24) #9
  %300 = call i32 @ptm_index(ptr noundef %61, i64 noundef 0, ptr noundef nonnull @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef nonnull %12, i32 noundef %.1233.lcssa, i1 noundef zeroext false, ptr noundef nonnull %14, ptr noundef nonnull %15, ptr noundef nonnull %16, ptr noundef nonnull %17, ptr noundef nonnull %20, ptr noundef nonnull %21, ptr noundef nonnull %22, ptr noundef nonnull %23, ptr noundef nonnull %24, ptr noundef nonnull %18, ptr noundef nonnull %19, ptr noundef null, ptr noundef null, ptr noundef nonnull %13)
  %.not244 = icmp eq i32 %300, 0
  br i1 %.not244, label %303, label %301

301:                                              ; preds = %295
  %302 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 711, ptr noundef nonnull @.str.91, i32 noundef %300)
  br label %.thread280

303:                                              ; preds = %295
  %304 = add nsw i32 %.2190469, 1
  %305 = load i32, ptr %14, align 4, !tbaa !9
  %306 = load i32, ptr %154, align 8, !tbaa !34
  %.not245 = icmp eq i32 %305, %306
  br i1 %.not245, label %309, label %307

307:                                              ; preds = %303
  %308 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 733, ptr noundef nonnull @.str.92, i32 noundef -1)
  br label %.thread280

309:                                              ; preds = %303
  %310 = load i32, ptr %15, align 4, !tbaa !9
  %311 = getelementptr inbounds %"struct.ptm::alloytest_t", ptr %263, i64 %indvars.iv582
  %312 = load i32, ptr %311, align 4, !tbaa !35
  %.not246 = icmp eq i32 %310, %312
  br i1 %.not246, label %315, label %313

313:                                              ; preds = %309
  %314 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 737, ptr noundef nonnull @.str.93, i32 noundef -1)
  br label %.thread280

315:                                              ; preds = %309
  %316 = call noundef double @_ZN3ptmL18matrix_determinantEPd(ptr noundef nonnull %23)
  %317 = fcmp ugt double %316, 0.000000e+00
  br i1 %317, label %320, label %318

318:                                              ; preds = %315
  %319 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 741, ptr noundef nonnull @.str.94, i32 noundef -1)
  br label %.thread280

320:                                              ; preds = %315
  %321 = load double, ptr %138, align 8, !tbaa !5
  %322 = load double, ptr %139, align 8, !tbaa !5
  %323 = fsub double %321, %322
  %324 = call double @llvm.fabs.f64(double %323)
  %325 = fcmp ogt double %324, 1.000000e-05
  br i1 %325, label %326, label %328

326:                                              ; preds = %320
  %327 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 744, ptr noundef nonnull @.str.95, i32 noundef -1)
  br label %.thread280

328:                                              ; preds = %320
  %329 = load double, ptr %140, align 16, !tbaa !5
  %330 = load double, ptr %141, align 16, !tbaa !5
  %331 = fsub double %329, %330
  %332 = call double @llvm.fabs.f64(double %331)
  %333 = fcmp ogt double %332, 1.000000e-05
  br i1 %333, label %334, label %336

334:                                              ; preds = %328
  %335 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 745, ptr noundef nonnull @.str.95, i32 noundef -1)
  br label %.thread280

336:                                              ; preds = %328
  %337 = load double, ptr %142, align 8, !tbaa !5
  %338 = load double, ptr %143, align 8, !tbaa !5
  %339 = fsub double %337, %338
  %340 = call double @llvm.fabs.f64(double %339)
  %341 = fcmp ogt double %340, 1.000000e-05
  br i1 %341, label %342, label %344

342:                                              ; preds = %336
  %343 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 746, ptr noundef nonnull @.str.95, i32 noundef -1)
  br label %.thread280

344:                                              ; preds = %336
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %25) #9
  call void @_ZN3ptmL6matmulEPdS0_S0_(ptr noundef nonnull %24, ptr noundef nonnull %23, ptr noundef nonnull %25)
  %345 = call noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef nonnull %25, ptr noundef nonnull %21, double noundef 1.000000e-05)
  br i1 %345, label %347, label %.thread285

.thread285:                                       ; preds = %344
  %346 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 752, ptr noundef nonnull @.str.96, i32 noundef -1)
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %25) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %24) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %23) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %22) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %21) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %20) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %19) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %18) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %17) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %15) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #9
  call void @llvm.lifetime.end.p0(i64 17, ptr nonnull %13) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %12) #9
  br label %408

347:                                              ; preds = %344
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %26) #9
  %348 = load i8, ptr %160, align 8, !tbaa !13, !range !16, !noundef !17
  %349 = trunc nuw i8 %348 to i1
  br i1 %349, label %388, label %350

350:                                              ; preds = %347
  %351 = load double, ptr %17, align 8, !tbaa !5
  %352 = fcmp ogt double %351, 1.000000e-05
  br i1 %352, label %353, label %355

353:                                              ; preds = %350
  %354 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 759, ptr noundef nonnull @.str.97, i32 noundef -1)
  br label %.thread290

355:                                              ; preds = %350
  %356 = load double, ptr %16, align 8, !tbaa !5
  %357 = fsub double %356, %264
  %358 = call double @llvm.fabs.f64(double %357)
  %359 = fcmp ogt double %358, 1.000000e-05
  br i1 %359, label %360, label %362

360:                                              ; preds = %355
  %361 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 763, ptr noundef nonnull @.str.98, i32 noundef -1)
  br label %.thread290

362:                                              ; preds = %355
  %363 = call noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef nonnull %21, ptr noundef nonnull %23, double noundef 1.000000e-05)
  br i1 %363, label %366, label %364

364:                                              ; preds = %362
  %365 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 767, ptr noundef nonnull @.str.99, i32 noundef -1)
  br label %.thread290

366:                                              ; preds = %362
  %367 = call noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef nonnull %24, ptr noundef nonnull %1, double noundef 1.000000e-05)
  br i1 %367, label %370, label %368

368:                                              ; preds = %366
  %369 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 771, ptr noundef nonnull @.str.100, i32 noundef -1)
  br label %.thread290

370:                                              ; preds = %366
  %371 = call noundef double @_ZN3ptm19quat_misorientationEPdS0_(ptr noundef nonnull %20, ptr noundef nonnull %7)
  %372 = fcmp ogt double %371, 1.000000e-05
  br i1 %372, label %373, label %375

373:                                              ; preds = %370
  %374 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 775, ptr noundef nonnull @.str.101, i32 noundef -1)
  br label %.thread290

375:                                              ; preds = %370
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %27) #9
  call void @_ZN3ptm29rotation_matrix_to_quaternionEPdS0_(ptr noundef nonnull %23, ptr noundef nonnull %27)
  %376 = call noundef double @_ZN3ptm19quat_misorientationEPdS0_(ptr noundef nonnull %27, ptr noundef nonnull %7)
  %377 = fcmp ogt double %376, 1.000000e-05
  br i1 %377, label %378, label %380

378:                                              ; preds = %375
  %379 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 781, ptr noundef nonnull @.str.102, i32 noundef -1)
  br label %.thread275

380:                                              ; preds = %375
  call void @_ZN3ptm29quaternion_to_rotation_matrixEPdS0_(ptr noundef nonnull %20, ptr noundef nonnull %26)
  %381 = load double, ptr %18, align 8, !tbaa !5
  %382 = fsub double %sqrt346, %381
  %383 = call double @llvm.fabs.f64(double %382)
  %384 = fcmp ogt double %383, 1.000000e-05
  br i1 %384, label %385, label %387

385:                                              ; preds = %380
  %386 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 790, ptr noundef nonnull @.str.103, i32 noundef -1)
  br label %.thread275

.thread275:                                       ; preds = %378, %385
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %27) #9
  br label %.thread290

387:                                              ; preds = %380
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %27) #9
  br label %389

388:                                              ; preds = %347
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(72) %26, ptr noundef nonnull align 16 dereferenceable(72) %21, i64 72, i1 false)
  br label %389

389:                                              ; preds = %387, %388
  %390 = load i32, ptr %156, align 8, !tbaa !20
  %391 = load double, ptr %16, align 8, !tbaa !5
  %392 = load ptr, ptr %155, align 8, !tbaa !18
  %393 = call noundef double @_ZN3ptmL22nearest_neighbour_rmsdEidPdPA3_dPA3_Kd(i32 noundef %390, double noundef %391, ptr noundef nonnull %26, ptr noundef nonnull %10, ptr noundef %392)
  %394 = call double @llvm.fabs.f64(double %393)
  %395 = fcmp ogt double %394, 1.000000e-05
  br i1 %395, label %396, label %398

396:                                              ; preds = %389
  %397 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 800, ptr noundef nonnull @.str.104, i32 noundef -1)
  br label %.thread290

398:                                              ; preds = %389
  %399 = load i32, ptr %156, align 8, !tbaa !20
  %400 = load double, ptr %16, align 8, !tbaa !5
  %401 = load ptr, ptr %155, align 8, !tbaa !18
  %402 = call noundef double @_ZN3ptmL21mapped_neighbour_rmsdEidPdPA3_dPA3_KdPa(i32 noundef %399, double noundef %400, ptr noundef nonnull %26, ptr noundef nonnull %10, ptr noundef %401, ptr noundef nonnull %13)
  %403 = call double @llvm.fabs.f64(double %402)
  %404 = fcmp ogt double %403, 1.000000e-05
  br i1 %404, label %405, label %407

405:                                              ; preds = %398
  %406 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 805, ptr noundef nonnull @.str.105, i32 noundef -1)
  br label %.thread290

.thread280:                                       ; preds = %301, %307, %313, %318, %326, %334, %342
  %.3191.ph = phi i32 [ %304, %342 ], [ %304, %334 ], [ %304, %326 ], [ %304, %318 ], [ %304, %313 ], [ %304, %307 ], [ %.2190469, %301 ]
  %.12.ph = phi i32 [ -1, %342 ], [ -1, %334 ], [ -1, %326 ], [ -1, %318 ], [ -1, %313 ], [ -1, %307 ], [ %300, %301 ]
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %24) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %23) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %22) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %21) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %20) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %19) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %18) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %17) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %15) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #9
  call void @llvm.lifetime.end.p0(i64 17, ptr nonnull %13) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %12) #9
  br label %408

.thread290:                                       ; preds = %353, %360, %373, %368, %364, %396, %405, %.thread275
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %26) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %25) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %24) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %23) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %22) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %21) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %20) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %19) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %18) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %17) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %15) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #9
  call void @llvm.lifetime.end.p0(i64 17, ptr nonnull %13) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %12) #9
  br label %408

407:                                              ; preds = %398
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %26) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %25) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %24) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %23) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %22) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %21) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %20) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %19) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %18) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %17) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %15) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #9
  call void @llvm.lifetime.end.p0(i64 17, ptr nonnull %13) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %12) #9
  %indvars.iv.next583 = add nuw nsw i64 %indvars.iv582, 1
  %exitcond586.not = icmp eq i64 %indvars.iv.next583, %wide.trip.count585
  br i1 %exitcond586.not, label %._crit_edge471, label %295, !llvm.loop !37

._crit_edge471:                                   ; preds = %407, %.preheader352
  %.2190.lcssa = phi i32 [ %.1189474, %.preheader352 ], [ %271, %407 ]
  call void @llvm.lifetime.end.p0(i64 408, ptr nonnull %10) #9
  call void @llvm.lifetime.end.p0(i64 408, ptr nonnull %9) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %8) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %7) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %6) #9
  %indvars.iv.next588 = add nuw nsw i64 %indvars.iv587, 1
  %exitcond591.not = icmp eq i64 %indvars.iv.next588, %wide.trip.count590
  br i1 %exitcond591.not, label %._crit_edge476, label %159, !llvm.loop !38

._crit_edge476:                                   ; preds = %._crit_edge471, %.preheader355
  %.1189.lcssa = phi i32 [ %.0188478, %.preheader355 ], [ %.2190.lcssa, %._crit_edge471 ]
  %indvars.iv.next595 = add nuw nsw i64 %indvars.iv594, 1
  %indvars.iv.next593 = add nuw nsw i64 %indvars.iv592, 1
  %exitcond599.not = icmp eq i64 %indvars.iv.next595, 8
  br i1 %exitcond599.not, label %409, label %.preheader355, !llvm.loop !39

408:                                              ; preds = %.thread290, %.thread285, %.thread280
  %.4192.ph = phi i32 [ %304, %.thread290 ], [ %304, %.thread285 ], [ %.3191.ph, %.thread280 ]
  %.13.ph = phi i32 [ -1, %.thread290 ], [ -1, %.thread285 ], [ %.12.ph, %.thread280 ]
  call void @llvm.lifetime.end.p0(i64 408, ptr nonnull %10) #9
  call void @llvm.lifetime.end.p0(i64 408, ptr nonnull %9) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %8) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %7) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %6) #9
  br label %.loopexit

409:                                              ; preds = %._crit_edge476
  call void @llvm.lifetime.start.p0(i64 168, ptr nonnull %28) #9
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(168) %28, i8 0, i64 160, i1 false)
  %410 = getelementptr inbounds i8, ptr %28, i64 24
  store double 2.000000e+00, ptr %410, align 8
  %411 = getelementptr inbounds i8, ptr %28, i64 48
  store double -2.000000e+00, ptr %411, align 16
  %412 = getelementptr inbounds i8, ptr %28, i64 80
  store double 2.000000e+00, ptr %412, align 16
  %413 = getelementptr inbounds i8, ptr %28, i64 104
  store double -2.000000e+00, ptr %413, align 8
  %414 = getelementptr inbounds i8, ptr %28, i64 136
  store double 2.000000e+00, ptr %414, align 8
  %415 = getelementptr inbounds i8, ptr %28, i64 160
  store double -2.000000e+00, ptr %415, align 16
  call void @llvm.lifetime.start.p0(i64 312, ptr nonnull %29) #9
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(312) %29, ptr noundef nonnull align 16 dereferenceable(312) @__const._ZN3ptm9run_testsEv.lc_points_fcc, i64 312, i1 false)
  call void @llvm.lifetime.start.p0(i64 360, ptr nonnull %30) #9
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(360) %30, ptr noundef nonnull align 16 dereferenceable(360) @__const._ZN3ptm9run_testsEv.lc_points_bcc, i64 360, i1 false)
  call void @llvm.lifetime.start.p0(i64 408, ptr nonnull %31) #9
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(408) %31, ptr noundef nonnull align 16 dereferenceable(408) @__const._ZN3ptm9run_testsEv.lc_points_dcub, i64 408, i1 false)
  %416 = getelementptr inbounds i8, ptr %38, i64 8
  %417 = getelementptr inbounds i8, ptr %38, i64 16
  %418 = add i32 %.1189.lcssa, 4
  %419 = load i32, ptr @__const._ZN3ptm9run_testsEv.lcdat, align 16, !tbaa !9
  %420 = sext i32 %419 to i64
  %421 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %420
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %32) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %33) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %34) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %35) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %36) #9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %37) #9
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %38) #9
  %422 = getelementptr inbounds i8, ptr %421, i64 8
  %423 = load i32, ptr %422, align 8, !tbaa !20
  store i32 %423, ptr %38, align 8, !tbaa !30
  store ptr %29, ptr %416, align 8, !tbaa !32
  store ptr null, ptr %417, align 8, !tbaa !33
  %424 = getelementptr inbounds i8, ptr %421, i64 4
  %425 = load i32, ptr %424, align 4, !tbaa !40
  %426 = call i32 @ptm_index(ptr noundef %61, i64 noundef 0, ptr noundef nonnull @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef nonnull %38, i32 noundef %425, i1 noundef zeroext false, ptr noundef nonnull %32, ptr noundef null, ptr noundef nonnull %33, ptr noundef nonnull %34, ptr noundef nonnull %37, ptr noundef null, ptr noundef null, ptr noundef null, ptr noundef null, ptr noundef nonnull %35, ptr noundef nonnull %36, ptr noundef null, ptr noundef null, ptr noundef null)
  %.not247 = icmp eq i32 %426, 0
  br i1 %.not247, label %429, label %427

427:                                              ; preds = %520, %489, %457, %409
  %.7195480.lcssa = phi i32 [ %.1189.lcssa, %409 ], [ %458, %457 ], [ %490, %489 ], [ %521, %520 ]
  %.lcssa494 = phi i32 [ %426, %409 ], [ %466, %457 ], [ %498, %489 ], [ %529, %520 ]
  %428 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 832, ptr noundef nonnull @.str.91, i32 noundef %.lcssa494)
  br label %.thread328

429:                                              ; preds = %409
  %430 = load i32, ptr %32, align 4, !tbaa !9
  %431 = load i32, ptr %421, align 8, !tbaa !34
  %.not248 = icmp eq i32 %430, %431
  br i1 %.not248, label %434, label %432

432:                                              ; preds = %530, %499, %467, %429
  %.7195480.lcssa499 = phi i32 [ %.1189.lcssa, %429 ], [ %458, %467 ], [ %490, %499 ], [ %521, %530 ]
  %433 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 835, ptr noundef nonnull @.str.92, i32 noundef -1)
  br label %.thread328

434:                                              ; preds = %429
  %435 = load double, ptr %36, align 8, !tbaa !5
  %436 = fadd double %435, -2.000000e+00
  %437 = call double @llvm.fabs.f64(double %436)
  %438 = fcmp ogt double %437, 1.000000e-05
  br i1 %438, label %439, label %441

439:                                              ; preds = %533, %502, %470, %434
  %.7195480.lcssa500 = phi i32 [ %.1189.lcssa, %434 ], [ %458, %470 ], [ %490, %502 ], [ %521, %533 ]
  %440 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 838, ptr noundef nonnull @.str.106, i32 noundef -1)
  br label %.thread328

441:                                              ; preds = %434
  %442 = getelementptr inbounds i8, ptr %29, i64 24
  %443 = load double, ptr %442, align 8, !tbaa !5
  %444 = getelementptr inbounds i8, ptr %29, i64 32
  %445 = load double, ptr %444, align 16, !tbaa !5
  %446 = getelementptr inbounds i8, ptr %29, i64 40
  %447 = load double, ptr %446, align 8, !tbaa !5
  %448 = fmul double %445, %445
  %449 = call double @llvm.fmuladd.f64(double %443, double %443, double %448)
  %450 = call double @llvm.fmuladd.f64(double %447, double %447, double %449)
  %sqrt347 = call double @llvm.sqrt.f64(double %450)
  %451 = load double, ptr %35, align 8, !tbaa !5
  %452 = fsub double %sqrt347, %451
  %453 = call double @llvm.fabs.f64(double %452)
  %454 = fcmp ogt double %453, 1.000000e-05
  br i1 %454, label %455, label %457

455:                                              ; preds = %538, %507, %475, %441
  %.7195480.lcssa501 = phi i32 [ %.1189.lcssa, %441 ], [ %458, %475 ], [ %490, %507 ], [ %521, %538 ]
  %456 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 845, ptr noundef nonnull @.str.103, i32 noundef -1)
  br label %.thread328

457:                                              ; preds = %441
  %458 = add nsw i32 %.1189.lcssa, 1
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %38) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %37) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %36) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %34) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %33) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %32) #9
  %459 = load i32, ptr getelementptr inbounds (i8, ptr @__const._ZN3ptm9run_testsEv.lcdat, i64 4), align 4, !tbaa !9
  %460 = sext i32 %459 to i64
  %461 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %460
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %32) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %33) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %34) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %35) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %36) #9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %37) #9
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %38) #9
  %462 = getelementptr inbounds i8, ptr %461, i64 8
  %463 = load i32, ptr %462, align 8, !tbaa !20
  store i32 %463, ptr %38, align 8, !tbaa !30
  store ptr %30, ptr %416, align 8, !tbaa !32
  store ptr null, ptr %417, align 8, !tbaa !33
  %464 = getelementptr inbounds i8, ptr %461, i64 4
  %465 = load i32, ptr %464, align 4, !tbaa !40
  %466 = call i32 @ptm_index(ptr noundef %61, i64 noundef 0, ptr noundef nonnull @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef nonnull %38, i32 noundef %465, i1 noundef zeroext false, ptr noundef nonnull %32, ptr noundef null, ptr noundef nonnull %33, ptr noundef nonnull %34, ptr noundef nonnull %37, ptr noundef null, ptr noundef null, ptr noundef null, ptr noundef null, ptr noundef nonnull %35, ptr noundef nonnull %36, ptr noundef null, ptr noundef null, ptr noundef null)
  %.not247.1 = icmp eq i32 %466, 0
  br i1 %.not247.1, label %467, label %427

467:                                              ; preds = %457
  %468 = load i32, ptr %32, align 4, !tbaa !9
  %469 = load i32, ptr %461, align 8, !tbaa !34
  %.not248.1 = icmp eq i32 %468, %469
  br i1 %.not248.1, label %470, label %432

470:                                              ; preds = %467
  %471 = load double, ptr %36, align 8, !tbaa !5
  %472 = fadd double %471, -2.000000e+00
  %473 = call double @llvm.fabs.f64(double %472)
  %474 = fcmp ogt double %473, 1.000000e-05
  br i1 %474, label %439, label %475

475:                                              ; preds = %470
  %476 = getelementptr inbounds i8, ptr %30, i64 24
  %477 = load double, ptr %476, align 8, !tbaa !5
  %478 = getelementptr inbounds i8, ptr %30, i64 32
  %479 = load double, ptr %478, align 16, !tbaa !5
  %480 = getelementptr inbounds i8, ptr %30, i64 40
  %481 = load double, ptr %480, align 8, !tbaa !5
  %482 = fmul double %479, %479
  %483 = call double @llvm.fmuladd.f64(double %477, double %477, double %482)
  %484 = call double @llvm.fmuladd.f64(double %481, double %481, double %483)
  %sqrt347.1 = call double @llvm.sqrt.f64(double %484)
  %485 = load double, ptr %35, align 8, !tbaa !5
  %486 = fsub double %sqrt347.1, %485
  %487 = call double @llvm.fabs.f64(double %486)
  %488 = fcmp ogt double %487, 1.000000e-05
  br i1 %488, label %455, label %489

489:                                              ; preds = %475
  %490 = add nsw i32 %.1189.lcssa, 2
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %38) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %37) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %36) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %34) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %33) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %32) #9
  %491 = load i32, ptr getelementptr inbounds (i8, ptr @__const._ZN3ptm9run_testsEv.lcdat, i64 8), align 8, !tbaa !9
  %492 = sext i32 %491 to i64
  %493 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %492
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %32) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %33) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %34) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %35) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %36) #9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %37) #9
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %38) #9
  %494 = getelementptr inbounds i8, ptr %493, i64 8
  %495 = load i32, ptr %494, align 8, !tbaa !20
  store i32 %495, ptr %38, align 8, !tbaa !30
  store ptr %28, ptr %416, align 8, !tbaa !32
  store ptr null, ptr %417, align 8, !tbaa !33
  %496 = getelementptr inbounds i8, ptr %493, i64 4
  %497 = load i32, ptr %496, align 4, !tbaa !40
  %498 = call i32 @ptm_index(ptr noundef %61, i64 noundef 0, ptr noundef nonnull @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef nonnull %38, i32 noundef %497, i1 noundef zeroext false, ptr noundef nonnull %32, ptr noundef null, ptr noundef nonnull %33, ptr noundef nonnull %34, ptr noundef nonnull %37, ptr noundef null, ptr noundef null, ptr noundef null, ptr noundef null, ptr noundef nonnull %35, ptr noundef nonnull %36, ptr noundef null, ptr noundef null, ptr noundef null)
  %.not247.2 = icmp eq i32 %498, 0
  br i1 %.not247.2, label %499, label %427

499:                                              ; preds = %489
  %500 = load i32, ptr %32, align 4, !tbaa !9
  %501 = load i32, ptr %493, align 8, !tbaa !34
  %.not248.2 = icmp eq i32 %500, %501
  br i1 %.not248.2, label %502, label %432

502:                                              ; preds = %499
  %503 = load double, ptr %36, align 8, !tbaa !5
  %504 = fadd double %503, -2.000000e+00
  %505 = call double @llvm.fabs.f64(double %504)
  %506 = fcmp ogt double %505, 1.000000e-05
  br i1 %506, label %439, label %507

507:                                              ; preds = %502
  %508 = load double, ptr %410, align 8, !tbaa !5
  %509 = getelementptr inbounds i8, ptr %28, i64 32
  %510 = load double, ptr %509, align 16, !tbaa !5
  %511 = getelementptr inbounds i8, ptr %28, i64 40
  %512 = load double, ptr %511, align 8, !tbaa !5
  %513 = fmul double %510, %510
  %514 = call double @llvm.fmuladd.f64(double %508, double %508, double %513)
  %515 = call double @llvm.fmuladd.f64(double %512, double %512, double %514)
  %sqrt347.2 = call double @llvm.sqrt.f64(double %515)
  %516 = load double, ptr %35, align 8, !tbaa !5
  %517 = fsub double %sqrt347.2, %516
  %518 = call double @llvm.fabs.f64(double %517)
  %519 = fcmp ogt double %518, 1.000000e-05
  br i1 %519, label %455, label %520

520:                                              ; preds = %507
  %521 = add nsw i32 %.1189.lcssa, 3
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %38) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %37) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %36) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %34) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %33) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %32) #9
  %522 = load i32, ptr getelementptr inbounds (i8, ptr @__const._ZN3ptm9run_testsEv.lcdat, i64 12), align 4, !tbaa !9
  %523 = sext i32 %522 to i64
  %524 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %523
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %32) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %33) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %34) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %35) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %36) #9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %37) #9
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %38) #9
  %525 = getelementptr inbounds i8, ptr %524, i64 8
  %526 = load i32, ptr %525, align 8, !tbaa !20
  store i32 %526, ptr %38, align 8, !tbaa !30
  store ptr %31, ptr %416, align 8, !tbaa !32
  store ptr null, ptr %417, align 8, !tbaa !33
  %527 = getelementptr inbounds i8, ptr %524, i64 4
  %528 = load i32, ptr %527, align 4, !tbaa !40
  %529 = call i32 @ptm_index(ptr noundef %61, i64 noundef 0, ptr noundef nonnull @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef nonnull %38, i32 noundef %528, i1 noundef zeroext false, ptr noundef nonnull %32, ptr noundef null, ptr noundef nonnull %33, ptr noundef nonnull %34, ptr noundef nonnull %37, ptr noundef null, ptr noundef null, ptr noundef null, ptr noundef null, ptr noundef nonnull %35, ptr noundef nonnull %36, ptr noundef null, ptr noundef null, ptr noundef null)
  %.not247.3 = icmp eq i32 %529, 0
  br i1 %.not247.3, label %530, label %427

530:                                              ; preds = %520
  %531 = load i32, ptr %32, align 4, !tbaa !9
  %532 = load i32, ptr %524, align 8, !tbaa !34
  %.not248.3 = icmp eq i32 %531, %532
  br i1 %.not248.3, label %533, label %432

533:                                              ; preds = %530
  %534 = load double, ptr %36, align 8, !tbaa !5
  %535 = fadd double %534, -2.000000e+00
  %536 = call double @llvm.fabs.f64(double %535)
  %537 = fcmp ogt double %536, 1.000000e-05
  br i1 %537, label %439, label %538

538:                                              ; preds = %533
  %539 = getelementptr inbounds i8, ptr %31, i64 24
  %540 = load double, ptr %539, align 8, !tbaa !5
  %541 = getelementptr inbounds i8, ptr %31, i64 32
  %542 = load double, ptr %541, align 16, !tbaa !5
  %543 = getelementptr inbounds i8, ptr %31, i64 40
  %544 = load double, ptr %543, align 8, !tbaa !5
  %545 = fmul double %542, %542
  %546 = call double @llvm.fmuladd.f64(double %540, double %540, double %545)
  %547 = call double @llvm.fmuladd.f64(double %544, double %544, double %546)
  %sqrt347.3 = call double @llvm.sqrt.f64(double %547)
  %548 = load double, ptr %35, align 8, !tbaa !5
  %549 = fsub double %sqrt347.3, %548
  %550 = call double @llvm.fabs.f64(double %549)
  %551 = fcmp ogt double %550, 1.000000e-05
  br i1 %551, label %455, label %552

552:                                              ; preds = %538
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %38) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %37) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %36) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %34) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %33) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %32) #9
  call void @llvm.lifetime.end.p0(i64 408, ptr nonnull %31) #9
  call void @llvm.lifetime.end.p0(i64 360, ptr nonnull %30) #9
  call void @llvm.lifetime.end.p0(i64 312, ptr nonnull %29) #9
  call void @llvm.lifetime.end.p0(i64 168, ptr nonnull %28) #9
  %553 = getelementptr inbounds i8, ptr %48, i64 8
  %554 = getelementptr inbounds i8, ptr %48, i64 16
  %555 = getelementptr inbounds i8, ptr %46, i64 8
  %556 = getelementptr inbounds i8, ptr %46, i64 16
  br label %561

.thread328:                                       ; preds = %455, %439, %432, %427
  %.7195480503 = phi i32 [ %.7195480.lcssa501, %455 ], [ %.7195480.lcssa500, %439 ], [ %.7195480.lcssa499, %432 ], [ %.7195480.lcssa, %427 ]
  %.18.ph = phi i32 [ -1, %455 ], [ -1, %439 ], [ -1, %432 ], [ %.lcssa494, %427 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %38) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %37) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %36) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %34) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %33) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %32) #9
  call void @llvm.lifetime.end.p0(i64 408, ptr nonnull %31) #9
  call void @llvm.lifetime.end.p0(i64 360, ptr nonnull %30) #9
  call void @llvm.lifetime.end.p0(i64 312, ptr nonnull %29) #9
  call void @llvm.lifetime.end.p0(i64 168, ptr nonnull %28) #9
  br label %.loopexit

.preheader:                                       ; preds = %598
  %557 = getelementptr inbounds i8, ptr %58, i64 8
  %558 = getelementptr inbounds i8, ptr %58, i64 16
  %559 = getelementptr inbounds i8, ptr %56, i64 8
  %560 = getelementptr inbounds i8, ptr %56, i64 16
  br label %599

561:                                              ; preds = %552, %598
  %indvars.iv604 = phi i64 [ 0, %552 ], [ %indvars.iv.next605, %598 ]
  %562 = getelementptr inbounds [8 x %"struct.ptm::structdata_t"], ptr @_ZN3ptm10structdataE, i64 0, i64 %indvars.iv604
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %39) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %40) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %41) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %42) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %43) #9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %44) #9
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %45) #9
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %46) #9
  call void @llvm.lifetime.start.p0(i64 408, ptr nonnull %47) #9
  %563 = getelementptr inbounds i8, ptr %562, i64 16
  %564 = load ptr, ptr %563, align 8, !tbaa !18
  %565 = getelementptr inbounds i8, ptr %562, i64 8
  %566 = load i32, ptr %565, align 8, !tbaa !20
  %567 = sext i32 %566 to i64
  %568 = mul nsw i64 %567, 24
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %47, ptr align 8 %564, i64 %568, i1 false)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %48) #9
  store i32 %566, ptr %48, align 8, !tbaa !30
  store ptr %47, ptr %553, align 8, !tbaa !32
  store ptr null, ptr %554, align 8, !tbaa !33
  %569 = getelementptr inbounds i8, ptr %562, i64 4
  %570 = load i32, ptr %569, align 4, !tbaa !40
  %571 = call i32 @ptm_index(ptr noundef %61, i64 noundef 0, ptr noundef nonnull @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef nonnull %48, i32 noundef %570, i1 noundef zeroext true, ptr noundef nonnull %39, ptr noundef null, ptr noundef nonnull %40, ptr noundef nonnull %41, ptr noundef nonnull %44, ptr noundef nonnull %45, ptr noundef nonnull %46, ptr noundef null, ptr noundef null, ptr noundef nonnull %42, ptr noundef nonnull %43, ptr noundef null, ptr noundef null, ptr noundef null)
  %.not249 = icmp eq i32 %571, 0
  br i1 %.not249, label %574, label %572

572:                                              ; preds = %561
  %573 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 866, ptr noundef nonnull @.str.91, i32 noundef %571)
  br label %.thread336

574:                                              ; preds = %561
  %575 = load i32, ptr %39, align 4, !tbaa !9
  %576 = load i32, ptr %562, align 8, !tbaa !34
  %.not250 = icmp eq i32 %575, %576
  br i1 %.not250, label %579, label %577

577:                                              ; preds = %574
  %578 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 870, ptr noundef nonnull @.str.92, i32 noundef -1)
  br label %.thread336

579:                                              ; preds = %574
  %580 = load double, ptr %41, align 8, !tbaa !5
  %581 = fcmp ogt double %580, 1.000000e-05
  br i1 %581, label %582, label %584

582:                                              ; preds = %579
  %583 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 874, ptr noundef nonnull @.str.97, i32 noundef -1)
  br label %.thread336

584:                                              ; preds = %579
  %585 = load double, ptr %46, align 16, !tbaa !5
  %586 = load double, ptr %555, align 8, !tbaa !5
  %587 = fmul double %586, %586
  %588 = call double @llvm.fmuladd.f64(double %585, double %585, double %587)
  %589 = load double, ptr %556, align 16, !tbaa !5
  %590 = call double @llvm.fmuladd.f64(double %589, double %589, double %588)
  %sqrt348 = call double @llvm.sqrt.f64(double %590)
  %591 = fcmp ogt double %sqrt348, 1.000000e-05
  br i1 %591, label %592, label %594

592:                                              ; preds = %584
  %593 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 879, ptr noundef nonnull @.str.107, i32 noundef -1)
  br label %.thread336

594:                                              ; preds = %584
  %595 = call noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef nonnull %45, ptr noundef nonnull %1, double noundef 1.000000e-05)
  br i1 %595, label %598, label %596

596:                                              ; preds = %594
  %597 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 883, ptr noundef nonnull @.str.108, i32 noundef -1)
  br label %.thread336

.thread336:                                       ; preds = %596, %592, %582, %577, %572
  %.22.ph = phi i32 [ -1, %596 ], [ -1, %592 ], [ -1, %582 ], [ -1, %577 ], [ %571, %572 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %48) #9
  call void @llvm.lifetime.end.p0(i64 408, ptr nonnull %47) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %46) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %45) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %44) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %43) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %42) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %41) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %40) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %39) #9
  br label %.loopexit

598:                                              ; preds = %594
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %48) #9
  call void @llvm.lifetime.end.p0(i64 408, ptr nonnull %47) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %46) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %45) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %44) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %43) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %42) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %41) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %40) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %39) #9
  %indvars.iv.next605 = add nuw nsw i64 %indvars.iv604, 1
  %exitcond607.not = icmp eq i64 %indvars.iv.next605, 8
  br i1 %exitcond607.not, label %.preheader, label %561, !llvm.loop !41

599:                                              ; preds = %.preheader, %636
  %indvars.iv608 = phi i64 [ 0, %.preheader ], [ %indvars.iv.next609, %636 ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %49) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %50) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %51) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %52) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %53) #9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %54) #9
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %55) #9
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %56) #9
  call void @llvm.lifetime.start.p0(i64 408, ptr nonnull %57) #9
  %600 = getelementptr inbounds [6 x ptr], ptr @__const._ZN3ptm9run_testsEv.alt_templates, i64 0, i64 %indvars.iv608
  %601 = load ptr, ptr %600, align 8, !tbaa !11
  %602 = getelementptr inbounds [6 x i32], ptr @__const._ZN3ptm9run_testsEv.num_points, i64 0, i64 %indvars.iv608
  %603 = load i32, ptr %602, align 4, !tbaa !9
  %604 = sext i32 %603 to i64
  %605 = mul nsw i64 %604, 24
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %57, ptr align 1 %601, i64 %605, i1 false)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %58) #9
  store i32 %603, ptr %58, align 8, !tbaa !30
  store ptr %57, ptr %557, align 8, !tbaa !32
  store ptr null, ptr %558, align 8, !tbaa !33
  %606 = getelementptr inbounds [6 x i32], ptr @__const._ZN3ptm9run_testsEv.checks, i64 0, i64 %indvars.iv608
  %607 = load i32, ptr %606, align 4, !tbaa !9
  %608 = call i32 @ptm_index(ptr noundef %61, i64 noundef 0, ptr noundef nonnull @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d, ptr noundef nonnull %58, i32 noundef %607, i1 noundef zeroext true, ptr noundef nonnull %49, ptr noundef null, ptr noundef nonnull %50, ptr noundef nonnull %51, ptr noundef nonnull %54, ptr noundef nonnull %55, ptr noundef nonnull %56, ptr noundef null, ptr noundef null, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef null, ptr noundef null, ptr noundef null)
  %.not251 = icmp eq i32 %608, 0
  br i1 %.not251, label %611, label %609

609:                                              ; preds = %599
  %610 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 904, ptr noundef nonnull @.str.91, i32 noundef %608)
  br label %.thread342

611:                                              ; preds = %599
  %612 = load i32, ptr %49, align 4, !tbaa !9
  %613 = getelementptr inbounds [6 x i32], ptr @__const._ZN3ptm9run_testsEv.types, i64 0, i64 %indvars.iv608
  %614 = load i32, ptr %613, align 4, !tbaa !9
  %.not252 = icmp eq i32 %612, %614
  br i1 %.not252, label %617, label %615

615:                                              ; preds = %611
  %616 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 908, ptr noundef nonnull @.str.92, i32 noundef -1)
  br label %.thread342

617:                                              ; preds = %611
  %618 = load double, ptr %51, align 8, !tbaa !5
  %619 = fcmp ogt double %618, 1.000000e-05
  br i1 %619, label %620, label %622

620:                                              ; preds = %617
  %621 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 912, ptr noundef nonnull @.str.97, i32 noundef -1)
  br label %.thread342

622:                                              ; preds = %617
  %623 = load double, ptr %56, align 16, !tbaa !5
  %624 = load double, ptr %559, align 8, !tbaa !5
  %625 = fmul double %624, %624
  %626 = call double @llvm.fmuladd.f64(double %623, double %623, double %625)
  %627 = load double, ptr %560, align 16, !tbaa !5
  %628 = call double @llvm.fmuladd.f64(double %627, double %627, double %626)
  %sqrt349 = call double @llvm.sqrt.f64(double %628)
  %629 = fcmp ogt double %sqrt349, 1.000000e-05
  br i1 %629, label %630, label %632

630:                                              ; preds = %622
  %631 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 917, ptr noundef nonnull @.str.107, i32 noundef -1)
  br label %.thread342

632:                                              ; preds = %622
  %633 = call noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef nonnull %55, ptr noundef nonnull %1, double noundef 1.000000e-05)
  br i1 %633, label %636, label %634

634:                                              ; preds = %632
  %635 = call noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef nonnull @.str, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN3ptm9run_testsEv, i32 noundef 921, ptr noundef nonnull @.str.108, i32 noundef -1)
  br label %.thread342

.thread342:                                       ; preds = %609, %615, %620, %630, %634
  %.26.ph = phi i32 [ -1, %634 ], [ -1, %630 ], [ -1, %620 ], [ -1, %615 ], [ %608, %609 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %58) #9
  call void @llvm.lifetime.end.p0(i64 408, ptr nonnull %57) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %56) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %55) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %54) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %53) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %52) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %51) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %50) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %49) #9
  br label %.loopexit

636:                                              ; preds = %632
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %58) #9
  call void @llvm.lifetime.end.p0(i64 408, ptr nonnull %57) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %56) #9
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %55) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %54) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %53) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %52) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %51) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %50) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %49) #9
  %indvars.iv.next609 = add nuw nsw i64 %indvars.iv608, 1
  %exitcond611.not = icmp eq i64 %indvars.iv.next609, 6
  br i1 %exitcond611.not, label %.loopexit, label %599, !llvm.loop !42

.loopexit:                                        ; preds = %636, %.thread342, %.thread336, %.thread328, %408, %.thread271, %91
  %.11199 = phi i32 [ 0, %91 ], [ %.4192.ph, %408 ], [ 0, %.thread271 ], [ %.7195480503, %.thread328 ], [ %418, %.thread336 ], [ %418, %.thread342 ], [ %418, %636 ]
  %.28 = phi i32 [ -1, %91 ], [ %.13.ph, %408 ], [ -1, %.thread271 ], [ %.18.ph, %.thread328 ], [ %.22.ph, %.thread336 ], [ %.26.ph, %.thread342 ], [ 0, %636 ]
  %637 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.109, i32 noundef %.11199)
  call void @ptm_uninitialize_local(ptr noundef %61)
  %638 = sext i32 %.28 to i64
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %1) #9
  ret i64 %638
}

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

declare ptr @ptm_initialize_local() local_unnamed_addr #5

declare void @_ZN3ptm29rotation_matrix_to_quaternionEPdS0_(ptr noundef, ptr noundef) local_unnamed_addr #5

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

; Function Attrs: mustprogress uwtable
declare hidden noundef i32 @_ZN3ptmL11print_errorEPKcS1_iS1_i(ptr noundef, ptr noundef, i32 noundef, ptr noundef, i32 noundef) local_unnamed_addr #3

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

declare void @_ZN3ptm29quaternion_to_rotation_matrixEPdS0_(ptr noundef, ptr noundef) local_unnamed_addr #5

declare void @_ZN3ptm20normalize_quaternionEPd(ptr noundef) local_unnamed_addr #5

; Function Attrs: mustprogress nounwind uwtable
declare hidden void @_ZN3ptmL6matvecEPdS0_S0_(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #6

declare i32 @ptm_index(ptr noundef, i64 noundef, ptr noundef, ptr noundef, i32 noundef, i1 noundef zeroext, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #5

; Function Attrs: mustprogress uwtable
declare hidden noundef i32 @_ZN3ptmL14get_neighboursEPvmmiPiPmS1_PA3_d(ptr noundef, i64 noundef, i64 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #3

; Function Attrs: mustprogress nounwind uwtable
declare hidden noundef double @_ZN3ptmL18matrix_determinantEPd(ptr noundef) local_unnamed_addr #6

; Function Attrs: mustprogress nounwind uwtable
declare hidden void @_ZN3ptmL6matmulEPdS0_S0_(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #6

; Function Attrs: mustprogress nounwind uwtable
declare hidden noundef zeroext i1 @_ZN3ptmL21check_matrix_equalityEPdS0_d(ptr noundef, ptr noundef, double noundef) local_unnamed_addr #6

declare noundef double @_ZN3ptm19quat_misorientationEPdS0_(ptr noundef, ptr noundef) local_unnamed_addr #5

; Function Attrs: mustprogress uwtable
declare hidden noundef double @_ZN3ptmL22nearest_neighbour_rmsdEidPdPA3_dPA3_Kd(i32 noundef, double noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: mustprogress uwtable
declare hidden noundef double @_ZN3ptmL21mapped_neighbour_rmsdEidPdPA3_dPA3_KdPa(i32 noundef, double noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: nofree nounwind
declare noundef i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #7

declare void @ptm_uninitialize_local(ptr noundef) local_unnamed_addr #5

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <2 x double> @llvm.fmuladd.v2f64(<2 x double>, <2 x double>, <2 x double>) #8

attributes #0 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { mustprogress 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 nosync nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { "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 = { mustprogress 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 #7 = { nofree 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 #8 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #9 = { 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 = !{!"double", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"any pointer", !7, i64 0}
!13 = !{!14, !15, i64 0}
!14 = !{!"_ZTSN3ptm10quattest_tE", !15, i64 0, !7, i64 8, !7, i64 80}
!15 = !{!"bool", !7, i64 0}
!16 = !{i8 0, i8 2}
!17 = !{}
!18 = !{!19, !12, i64 16}
!19 = !{!"_ZTSN3ptm12structdata_tE", !10, i64 0, !10, i64 4, !10, i64 8, !12, i64 16}
!20 = !{!19, !10, i64 8}
!21 = distinct !{!21, !22, !23, !24}
!22 = !{!"llvm.loop.mustprogress"}
!23 = !{!"llvm.loop.isvectorized", i32 1}
!24 = !{!"llvm.loop.unroll.runtime.disable"}
!25 = distinct !{!25, !22}
!26 = distinct !{!26, !22, !23, !24}
!27 = distinct !{!27, !22, !24, !23}
!28 = distinct !{!28, !22, !24, !23}
!29 = distinct !{!29, !22}
!30 = !{!31, !10, i64 0}
!31 = !{!"_ZTSN3ptm18unittest_nbrdata_tE", !10, i64 0, !12, i64 8, !12, i64 16}
!32 = !{!31, !12, i64 8}
!33 = !{!31, !12, i64 16}
!34 = !{!19, !10, i64 0}
!35 = !{!36, !10, i64 0}
!36 = !{!"_ZTSN3ptm11alloytest_tE", !10, i64 0, !7, i64 4}
!37 = distinct !{!37, !22}
!38 = distinct !{!38, !22}
!39 = distinct !{!39, !22}
!40 = !{!19, !10, i64 4}
!41 = distinct !{!41, !22}
!42 = distinct !{!42, !22}


; Effective O3 passes: AggressiveInstCombinePass,CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,MemCpyOptPass,ReassociatePass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass