; LLVM IR from Overload-Technologies/Overload :: Dependencies/assimp/code/PostProcessing (FixNormalsStep)

; 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"

%class.aiVector3t = type { float, float, float }
%struct.aiMesh = type { i32, i32, i32, ptr, ptr, ptr, ptr, [8 x ptr], [8 x ptr], [8 x i32], ptr, i32, ptr, i32, %struct.aiString, i32, ptr, i32, %struct.aiAABB, ptr }
%struct.aiString = type { i32, [1024 x i8] }
%struct.aiAABB = type { %class.aiVector3t, %class.aiVector3t }
%struct.aiFace = type { i32, ptr }

@.str.3 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [123 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [53 x i8], align 1

declare noundef ptr @_ZN6Assimp13DefaultLogger3getEv() #0

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

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZN6Assimp25FixInfacingNormalsProcess11ProcessMeshEP6aiMeshj(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef %1, i32 noundef %2) #2 align 2 {
  %4 = alloca i1, align 1
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca %class.aiVector3t, align 4
  %9 = alloca %class.aiVector3t, align 4
  %10 = alloca %class.aiVector3t, align 4
  %11 = alloca %class.aiVector3t, align 4
  %12 = alloca i32, align 4
  %13 = alloca %class.aiVector3t, align 4
  %14 = alloca { <2 x float>, float }, align 8
  %15 = alloca float, align 4
  %16 = alloca float, align 4
  %17 = alloca float, align 4
  %18 = alloca float, align 4
  %19 = alloca float, align 4
  %20 = alloca float, align 4
  %21 = alloca i32, align 4
  %22 = alloca float, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca ptr, align 8
  %26 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store i32 %2, ptr %7, align 4, !tbaa !9
  %27 = load ptr, ptr %5, align 8
  %28 = load ptr, ptr %6, align 8, !tbaa !5
  %29 = icmp ne ptr null, %28
  br i1 %29, label %31, label %30

30:                                               ; preds = %3
  call void @_ZN6Assimp17aiAssertViolationEPKcS1_i(ptr noundef @.str.3, ptr noundef @.str.4, i32 noundef 88)
  br label %31

31:                                               ; preds = %30, %3
  %32 = phi i1 [ true, %3 ], [ false, %30 ]
  %33 = load ptr, ptr %6, align 8, !tbaa !5
  %34 = call noundef zeroext i1 @_ZNK6aiMesh10HasNormalsEv(ptr noundef nonnull align 8 dereferenceable(1320) %33)
  br i1 %34, label %36, label %35

35:                                               ; preds = %31
  store i1 false, ptr %4, align 1
  br label %329

36:                                               ; preds = %31
  call void @llvm.lifetime.start.p0(i64 12, ptr %8) #8
  call void @_ZN10aiVector3tIfEC2Efff(ptr noundef nonnull align 4 dereferenceable(12) %8, float noundef 1.000000e+10, float noundef 1.000000e+10, float noundef 1.000000e+10)
  call void @llvm.lifetime.start.p0(i64 12, ptr %9) #8
  call void @_ZN10aiVector3tIfEC2Efff(ptr noundef nonnull align 4 dereferenceable(12) %9, float noundef 1.000000e+10, float noundef 1.000000e+10, float noundef 1.000000e+10)
  call void @llvm.lifetime.start.p0(i64 12, ptr %10) #8
  call void @_ZN10aiVector3tIfEC2Efff(ptr noundef nonnull align 4 dereferenceable(12) %10, float noundef -1.000000e+10, float noundef -1.000000e+10, float noundef -1.000000e+10)
  call void @llvm.lifetime.start.p0(i64 12, ptr %11) #8
  call void @_ZN10aiVector3tIfEC2Efff(ptr noundef nonnull align 4 dereferenceable(12) %11, float noundef -1.000000e+10, float noundef -1.000000e+10, float noundef -1.000000e+10)
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #8
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %37

37:                                               ; preds = %154, %36
  %38 = load i32, ptr %12, align 4, !tbaa !9
  %39 = load ptr, ptr %6, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.aiMesh, ptr %39, i32 0, i32 1
  %41 = load i32, ptr %40, align 4, !tbaa !11
  %42 = icmp ult i32 %38, %41
  br i1 %42, label %44, label %43

43:                                               ; preds = %37
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #8
  br label %157

44:                                               ; preds = %37
  %45 = getelementptr inbounds %class.aiVector3t, ptr %9, i32 0, i32 0
  %46 = load ptr, ptr %6, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.aiMesh, ptr %46, i32 0, i32 3
  %48 = load ptr, ptr %47, align 8, !tbaa !18
  %49 = load i32, ptr %12, align 4, !tbaa !9
  %50 = zext i32 %49 to i64
  %51 = getelementptr inbounds %class.aiVector3t, ptr %48, i64 %50
  %52 = getelementptr inbounds %class.aiVector3t, ptr %51, i32 0, i32 0
  %53 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %45, ptr noundef nonnull align 4 dereferenceable(4) %52)
  %54 = load float, ptr %53, align 4, !tbaa !19
  %55 = getelementptr inbounds %class.aiVector3t, ptr %9, i32 0, i32 0
  store float %54, ptr %55, align 4, !tbaa !20
  %56 = getelementptr inbounds %class.aiVector3t, ptr %9, i32 0, i32 1
  %57 = load ptr, ptr %6, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct.aiMesh, ptr %57, i32 0, i32 3
  %59 = load ptr, ptr %58, align 8, !tbaa !18
  %60 = load i32, ptr %12, align 4, !tbaa !9
  %61 = zext i32 %60 to i64
  %62 = getelementptr inbounds %class.aiVector3t, ptr %59, i64 %61
  %63 = getelementptr inbounds %class.aiVector3t, ptr %62, i32 0, i32 1
  %64 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %56, ptr noundef nonnull align 4 dereferenceable(4) %63)
  %65 = load float, ptr %64, align 4, !tbaa !19
  %66 = getelementptr inbounds %class.aiVector3t, ptr %9, i32 0, i32 1
  store float %65, ptr %66, align 4, !tbaa !21
  %67 = getelementptr inbounds %class.aiVector3t, ptr %9, i32 0, i32 2
  %68 = load ptr, ptr %6, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.aiMesh, ptr %68, i32 0, i32 3
  %70 = load ptr, ptr %69, align 8, !tbaa !18
  %71 = load i32, ptr %12, align 4, !tbaa !9
  %72 = zext i32 %71 to i64
  %73 = getelementptr inbounds %class.aiVector3t, ptr %70, i64 %72
  %74 = getelementptr inbounds %class.aiVector3t, ptr %73, i32 0, i32 2
  %75 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %67, ptr noundef nonnull align 4 dereferenceable(4) %74)
  %76 = load float, ptr %75, align 4, !tbaa !19
  %77 = getelementptr inbounds %class.aiVector3t, ptr %9, i32 0, i32 2
  store float %76, ptr %77, align 4, !tbaa !22
  %78 = getelementptr inbounds %class.aiVector3t, ptr %11, i32 0, i32 0
  %79 = load ptr, ptr %6, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.aiMesh, ptr %79, i32 0, i32 3
  %81 = load ptr, ptr %80, align 8, !tbaa !18
  %82 = load i32, ptr %12, align 4, !tbaa !9
  %83 = zext i32 %82 to i64
  %84 = getelementptr inbounds %class.aiVector3t, ptr %81, i64 %83
  %85 = getelementptr inbounds %class.aiVector3t, ptr %84, i32 0, i32 0
  %86 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %78, ptr noundef nonnull align 4 dereferenceable(4) %85)
  %87 = load float, ptr %86, align 4, !tbaa !19
  %88 = getelementptr inbounds %class.aiVector3t, ptr %11, i32 0, i32 0
  store float %87, ptr %88, align 4, !tbaa !20
  %89 = getelementptr inbounds %class.aiVector3t, ptr %11, i32 0, i32 1
  %90 = load ptr, ptr %6, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.aiMesh, ptr %90, i32 0, i32 3
  %92 = load ptr, ptr %91, align 8, !tbaa !18
  %93 = load i32, ptr %12, align 4, !tbaa !9
  %94 = zext i32 %93 to i64
  %95 = getelementptr inbounds %class.aiVector3t, ptr %92, i64 %94
  %96 = getelementptr inbounds %class.aiVector3t, ptr %95, i32 0, i32 1
  %97 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %89, ptr noundef nonnull align 4 dereferenceable(4) %96)
  %98 = load float, ptr %97, align 4, !tbaa !19
  %99 = getelementptr inbounds %class.aiVector3t, ptr %11, i32 0, i32 1
  store float %98, ptr %99, align 4, !tbaa !21
  %100 = getelementptr inbounds %class.aiVector3t, ptr %11, i32 0, i32 2
  %101 = load ptr, ptr %6, align 8, !tbaa !5
  %102 = getelementptr inbounds %struct.aiMesh, ptr %101, i32 0, i32 3
  %103 = load ptr, ptr %102, align 8, !tbaa !18
  %104 = load i32, ptr %12, align 4, !tbaa !9
  %105 = zext i32 %104 to i64
  %106 = getelementptr inbounds %class.aiVector3t, ptr %103, i64 %105
  %107 = getelementptr inbounds %class.aiVector3t, ptr %106, i32 0, i32 2
  %108 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %100, ptr noundef nonnull align 4 dereferenceable(4) %107)
  %109 = load float, ptr %108, align 4, !tbaa !19
  %110 = getelementptr inbounds %class.aiVector3t, ptr %11, i32 0, i32 2
  store float %109, ptr %110, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 12, ptr %13) #8
  %111 = load ptr, ptr %6, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.aiMesh, ptr %111, i32 0, i32 3
  %113 = load ptr, ptr %112, align 8, !tbaa !18
  %114 = load i32, ptr %12, align 4, !tbaa !9
  %115 = zext i32 %114 to i64
  %116 = getelementptr inbounds %class.aiVector3t, ptr %113, i64 %115
  %117 = load ptr, ptr %6, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct.aiMesh, ptr %117, i32 0, i32 4
  %119 = load ptr, ptr %118, align 8, !tbaa !23
  %120 = load i32, ptr %12, align 4, !tbaa !9
  %121 = zext i32 %120 to i64
  %122 = getelementptr inbounds %class.aiVector3t, ptr %119, i64 %121
  %123 = call { <2 x float>, float } @_ZplIfE10aiVector3tIT_ERKS2_S4_(ptr noundef nonnull align 4 dereferenceable(12) %116, ptr noundef nonnull align 4 dereferenceable(12) %122)
  store { <2 x float>, float } %123, ptr %14, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %13, ptr align 8 %14, i64 12, i1 false)
  %124 = getelementptr inbounds %class.aiVector3t, ptr %8, i32 0, i32 0
  %125 = getelementptr inbounds %class.aiVector3t, ptr %13, i32 0, i32 0
  %126 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %124, ptr noundef nonnull align 4 dereferenceable(4) %125)
  %127 = load float, ptr %126, align 4, !tbaa !19
  %128 = getelementptr inbounds %class.aiVector3t, ptr %8, i32 0, i32 0
  store float %127, ptr %128, align 4, !tbaa !20
  %129 = getelementptr inbounds %class.aiVector3t, ptr %8, i32 0, i32 1
  %130 = getelementptr inbounds %class.aiVector3t, ptr %13, i32 0, i32 1
  %131 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %129, ptr noundef nonnull align 4 dereferenceable(4) %130)
  %132 = load float, ptr %131, align 4, !tbaa !19
  %133 = getelementptr inbounds %class.aiVector3t, ptr %8, i32 0, i32 1
  store float %132, ptr %133, align 4, !tbaa !21
  %134 = getelementptr inbounds %class.aiVector3t, ptr %8, i32 0, i32 2
  %135 = getelementptr inbounds %class.aiVector3t, ptr %13, i32 0, i32 2
  %136 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %134, ptr noundef nonnull align 4 dereferenceable(4) %135)
  %137 = load float, ptr %136, align 4, !tbaa !19
  %138 = getelementptr inbounds %class.aiVector3t, ptr %8, i32 0, i32 2
  store float %137, ptr %138, align 4, !tbaa !22
  %139 = getelementptr inbounds %class.aiVector3t, ptr %10, i32 0, i32 0
  %140 = getelementptr inbounds %class.aiVector3t, ptr %13, i32 0, i32 0
  %141 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %139, ptr noundef nonnull align 4 dereferenceable(4) %140)
  %142 = load float, ptr %141, align 4, !tbaa !19
  %143 = getelementptr inbounds %class.aiVector3t, ptr %10, i32 0, i32 0
  store float %142, ptr %143, align 4, !tbaa !20
  %144 = getelementptr inbounds %class.aiVector3t, ptr %10, i32 0, i32 1
  %145 = getelementptr inbounds %class.aiVector3t, ptr %13, i32 0, i32 1
  %146 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %144, ptr noundef nonnull align 4 dereferenceable(4) %145)
  %147 = load float, ptr %146, align 4, !tbaa !19
  %148 = getelementptr inbounds %class.aiVector3t, ptr %10, i32 0, i32 1
  store float %147, ptr %148, align 4, !tbaa !21
  %149 = getelementptr inbounds %class.aiVector3t, ptr %10, i32 0, i32 2
  %150 = getelementptr inbounds %class.aiVector3t, ptr %13, i32 0, i32 2
  %151 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %149, ptr noundef nonnull align 4 dereferenceable(4) %150)
  %152 = load float, ptr %151, align 4, !tbaa !19
  %153 = getelementptr inbounds %class.aiVector3t, ptr %10, i32 0, i32 2
  store float %152, ptr %153, align 4, !tbaa !22
  call void @llvm.lifetime.end.p0(i64 12, ptr %13) #8
  br label %154

154:                                              ; preds = %44
  %155 = load i32, ptr %12, align 4, !tbaa !9
  %156 = add i32 %155, 1
  store i32 %156, ptr %12, align 4, !tbaa !9
  br label %37, !llvm.loop !24

157:                                              ; preds = %43
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #8
  %158 = getelementptr inbounds %class.aiVector3t, ptr %10, i32 0, i32 0
  %159 = load float, ptr %158, align 4, !tbaa !20
  %160 = getelementptr inbounds %class.aiVector3t, ptr %8, i32 0, i32 0
  %161 = load float, ptr %160, align 4, !tbaa !20
  %162 = fsub float %159, %161
  store float %162, ptr %15, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #8
  %163 = getelementptr inbounds %class.aiVector3t, ptr %10, i32 0, i32 1
  %164 = load float, ptr %163, align 4, !tbaa !21
  %165 = getelementptr inbounds %class.aiVector3t, ptr %8, i32 0, i32 1
  %166 = load float, ptr %165, align 4, !tbaa !21
  %167 = fsub float %164, %166
  store float %167, ptr %16, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #8
  %168 = getelementptr inbounds %class.aiVector3t, ptr %10, i32 0, i32 2
  %169 = load float, ptr %168, align 4, !tbaa !22
  %170 = getelementptr inbounds %class.aiVector3t, ptr %8, i32 0, i32 2
  %171 = load float, ptr %170, align 4, !tbaa !22
  %172 = fsub float %169, %171
  store float %172, ptr %17, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #8
  %173 = getelementptr inbounds %class.aiVector3t, ptr %11, i32 0, i32 0
  %174 = load float, ptr %173, align 4, !tbaa !20
  %175 = getelementptr inbounds %class.aiVector3t, ptr %9, i32 0, i32 0
  %176 = load float, ptr %175, align 4, !tbaa !20
  %177 = fsub float %174, %176
  store float %177, ptr %18, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #8
  %178 = getelementptr inbounds %class.aiVector3t, ptr %11, i32 0, i32 1
  %179 = load float, ptr %178, align 4, !tbaa !21
  %180 = getelementptr inbounds %class.aiVector3t, ptr %9, i32 0, i32 1
  %181 = load float, ptr %180, align 4, !tbaa !21
  %182 = fsub float %179, %181
  store float %182, ptr %19, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #8
  %183 = getelementptr inbounds %class.aiVector3t, ptr %11, i32 0, i32 2
  %184 = load float, ptr %183, align 4, !tbaa !22
  %185 = getelementptr inbounds %class.aiVector3t, ptr %9, i32 0, i32 2
  %186 = load float, ptr %185, align 4, !tbaa !22
  %187 = fsub float %184, %186
  store float %187, ptr %20, align 4, !tbaa !19
  %188 = load float, ptr %15, align 4, !tbaa !19
  %189 = fcmp ogt float %188, 0.000000e+00
  %190 = zext i1 %189 to i32
  %191 = load float, ptr %18, align 4, !tbaa !19
  %192 = fcmp ogt float %191, 0.000000e+00
  %193 = zext i1 %192 to i32
  %194 = icmp ne i32 %190, %193
  br i1 %194, label %195, label %196

195:                                              ; preds = %157
  store i1 false, ptr %4, align 1
  store i32 1, ptr %21, align 4
  br label %328

196:                                              ; preds = %157
  %197 = load float, ptr %16, align 4, !tbaa !19
  %198 = fcmp ogt float %197, 0.000000e+00
  %199 = zext i1 %198 to i32
  %200 = load float, ptr %19, align 4, !tbaa !19
  %201 = fcmp ogt float %200, 0.000000e+00
  %202 = zext i1 %201 to i32
  %203 = icmp ne i32 %199, %202
  br i1 %203, label %204, label %205

204:                                              ; preds = %196
  store i1 false, ptr %4, align 1
  store i32 1, ptr %21, align 4
  br label %328

205:                                              ; preds = %196
  %206 = load float, ptr %17, align 4, !tbaa !19
  %207 = fcmp ogt float %206, 0.000000e+00
  %208 = zext i1 %207 to i32
  %209 = load float, ptr %20, align 4, !tbaa !19
  %210 = fcmp ogt float %209, 0.000000e+00
  %211 = zext i1 %210 to i32
  %212 = icmp ne i32 %208, %211
  br i1 %212, label %213, label %214

213:                                              ; preds = %205
  store i1 false, ptr %4, align 1
  store i32 1, ptr %21, align 4
  br label %328

214:                                              ; preds = %205
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #8
  %215 = load float, ptr %19, align 4, !tbaa !19
  %216 = load float, ptr %20, align 4, !tbaa !19
  %217 = fmul float %215, %216
  store float %217, ptr %22, align 4, !tbaa !19
  %218 = load float, ptr %18, align 4, !tbaa !19
  %219 = load float, ptr %22, align 4, !tbaa !19
  %220 = call noundef float @_ZSt4sqrtf(float noundef %219)
  %221 = fmul float 0x3FA99999A0000000, %220
  %222 = fcmp olt float %218, %221
  br i1 %222, label %223, label %224

223:                                              ; preds = %214
  store i1 false, ptr %4, align 1
  store i32 1, ptr %21, align 4
  br label %327

224:                                              ; preds = %214
  %225 = load float, ptr %19, align 4, !tbaa !19
  %226 = load float, ptr %20, align 4, !tbaa !19
  %227 = load float, ptr %18, align 4, !tbaa !19
  %228 = fmul float %226, %227
  %229 = call noundef float @_ZSt4sqrtf(float noundef %228)
  %230 = fmul float 0x3FA99999A0000000, %229
  %231 = fcmp olt float %225, %230
  br i1 %231, label %232, label %233

232:                                              ; preds = %224
  store i1 false, ptr %4, align 1
  store i32 1, ptr %21, align 4
  br label %327

233:                                              ; preds = %224
  %234 = load float, ptr %20, align 4, !tbaa !19
  %235 = load float, ptr %19, align 4, !tbaa !19
  %236 = load float, ptr %18, align 4, !tbaa !19
  %237 = fmul float %235, %236
  %238 = call noundef float @_ZSt4sqrtf(float noundef %237)
  %239 = fmul float 0x3FA99999A0000000, %238
  %240 = fcmp olt float %234, %239
  br i1 %240, label %241, label %242

241:                                              ; preds = %233
  store i1 false, ptr %4, align 1
  store i32 1, ptr %21, align 4
  br label %327

242:                                              ; preds = %233
  %243 = load float, ptr %15, align 4, !tbaa !19
  %244 = load float, ptr %16, align 4, !tbaa !19
  %245 = fmul float %243, %244
  %246 = load float, ptr %17, align 4, !tbaa !19
  %247 = fmul float %245, %246
  %248 = call noundef float @_ZSt4fabsf(float noundef %247)
  %249 = load float, ptr %18, align 4, !tbaa !19
  %250 = load float, ptr %22, align 4, !tbaa !19
  %251 = fmul float %249, %250
  %252 = call noundef float @_ZSt4fabsf(float noundef %251)
  %253 = fcmp olt float %248, %252
  br i1 %253, label %254, label %326

254:                                              ; preds = %242
  %255 = call noundef zeroext i1 @_ZN6Assimp13DefaultLogger12isNullLoggerEv()
  br i1 %255, label %258, label %256

256:                                              ; preds = %254
  %257 = call noundef ptr @_ZN6Assimp13DefaultLogger3getEv()
  call void @_ZN6Assimp6Logger4infoIJRA6_KcRjRA53_S2_S5_EEEvDpOT_(ptr noundef nonnull align 8 dereferenceable(12) %257, ptr noundef nonnull align 1 dereferenceable(6) @.str.5, ptr noundef nonnull align 4 dereferenceable(4) %7, ptr noundef nonnull align 1 dereferenceable(53) @.str.6, ptr noundef nonnull align 4 dereferenceable(4) %7)
  br label %258

258:                                              ; preds = %256, %254
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #8
  store i32 0, ptr %23, align 4, !tbaa !9
  br label %259

259:                                              ; preds = %274, %258
  %260 = load i32, ptr %23, align 4, !tbaa !9
  %261 = load ptr, ptr %6, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct.aiMesh, ptr %261, i32 0, i32 1
  %263 = load i32, ptr %262, align 4, !tbaa !11
  %264 = icmp ult i32 %260, %263
  br i1 %264, label %266, label %265

265:                                              ; preds = %259
  store i32 5, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #8
  br label %277

266:                                              ; preds = %259
  %267 = load ptr, ptr %6, align 8, !tbaa !5
  %268 = getelementptr inbounds %struct.aiMesh, ptr %267, i32 0, i32 4
  %269 = load ptr, ptr %268, align 8, !tbaa !23
  %270 = load i32, ptr %23, align 4, !tbaa !9
  %271 = zext i32 %270 to i64
  %272 = getelementptr inbounds %class.aiVector3t, ptr %269, i64 %271
  %273 = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfEmLEf(ptr noundef nonnull align 4 dereferenceable(12) %272, float noundef -1.000000e+00)
  br label %274

274:                                              ; preds = %266
  %275 = load i32, ptr %23, align 4, !tbaa !9
  %276 = add i32 %275, 1
  store i32 %276, ptr %23, align 4, !tbaa !9
  br label %259, !llvm.loop !26

277:                                              ; preds = %265
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #8
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %278

278:                                              ; preds = %322, %277
  %279 = load i32, ptr %24, align 4, !tbaa !9
  %280 = load ptr, ptr %6, align 8, !tbaa !5
  %281 = getelementptr inbounds %struct.aiMesh, ptr %280, i32 0, i32 2
  %282 = load i32, ptr %281, align 8, !tbaa !27
  %283 = icmp ult i32 %279, %282
  br i1 %283, label %285, label %284

284:                                              ; preds = %278
  store i32 8, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #8
  br label %325

285:                                              ; preds = %278
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #8
  %286 = load ptr, ptr %6, align 8, !tbaa !5
  %287 = getelementptr inbounds %struct.aiMesh, ptr %286, i32 0, i32 10
  %288 = load ptr, ptr %287, align 8, !tbaa !28
  %289 = load i32, ptr %24, align 4, !tbaa !9
  %290 = zext i32 %289 to i64
  %291 = getelementptr inbounds %struct.aiFace, ptr %288, i64 %290
  store ptr %291, ptr %25, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #8
  store i32 0, ptr %26, align 4, !tbaa !9
  br label %292

292:                                              ; preds = %318, %285
  %293 = load i32, ptr %26, align 4, !tbaa !9
  %294 = load ptr, ptr %25, align 8, !tbaa !5
  %295 = getelementptr inbounds %struct.aiFace, ptr %294, i32 0, i32 0
  %296 = load i32, ptr %295, align 8, !tbaa !29
  %297 = udiv i32 %296, 2
  %298 = icmp ult i32 %293, %297
  br i1 %298, label %300, label %299

299:                                              ; preds = %292
  store i32 11, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #8
  br label %321

300:                                              ; preds = %292
  %301 = load ptr, ptr %25, align 8, !tbaa !5
  %302 = getelementptr inbounds %struct.aiFace, ptr %301, i32 0, i32 1
  %303 = load ptr, ptr %302, align 8, !tbaa !31
  %304 = load i32, ptr %26, align 4, !tbaa !9
  %305 = zext i32 %304 to i64
  %306 = getelementptr inbounds i32, ptr %303, i64 %305
  %307 = load ptr, ptr %25, align 8, !tbaa !5
  %308 = getelementptr inbounds %struct.aiFace, ptr %307, i32 0, i32 1
  %309 = load ptr, ptr %308, align 8, !tbaa !31
  %310 = load ptr, ptr %25, align 8, !tbaa !5
  %311 = getelementptr inbounds %struct.aiFace, ptr %310, i32 0, i32 0
  %312 = load i32, ptr %311, align 8, !tbaa !29
  %313 = sub i32 %312, 1
  %314 = load i32, ptr %26, align 4, !tbaa !9
  %315 = sub i32 %313, %314
  %316 = zext i32 %315 to i64
  %317 = getelementptr inbounds i32, ptr %309, i64 %316
  call void @_ZSt4swapIjENSt9enable_ifIXsr6__and_ISt6__not_ISt15__is_tuple_likeIT_EESt21is_move_constructibleIS3_ESt18is_move_assignableIS3_EEE5valueEvE4typeERS3_SC_(ptr noundef nonnull align 4 dereferenceable(4) %306, ptr noundef nonnull align 4 dereferenceable(4) %317) #8
  br label %318

318:                                              ; preds = %300
  %319 = load i32, ptr %26, align 4, !tbaa !9
  %320 = add i32 %319, 1
  store i32 %320, ptr %26, align 4, !tbaa !9
  br label %292, !llvm.loop !32

321:                                              ; preds = %299
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #8
  br label %322

322:                                              ; preds = %321
  %323 = load i32, ptr %24, align 4, !tbaa !9
  %324 = add i32 %323, 1
  store i32 %324, ptr %24, align 4, !tbaa !9
  br label %278, !llvm.loop !33

325:                                              ; preds = %284
  store i1 true, ptr %4, align 1
  store i32 1, ptr %21, align 4
  br label %327

326:                                              ; preds = %242
  store i1 false, ptr %4, align 1
  store i32 1, ptr %21, align 4
  br label %327

327:                                              ; preds = %326, %325, %241, %232, %223
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #8
  br label %328

328:                                              ; preds = %327, %213, %204, %195
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 12, ptr %11) #8
  call void @llvm.lifetime.end.p0(i64 12, ptr %10) #8
  call void @llvm.lifetime.end.p0(i64 12, ptr %9) #8
  call void @llvm.lifetime.end.p0(i64 12, ptr %8) #8
  br label %329

329:                                              ; preds = %328, %35
  %330 = load i1, ptr %4, align 1
  ret i1 %330
}

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

declare void @_ZN6Assimp17aiAssertViolationEPKcS1_i(ptr noundef, ptr noundef, i32 noundef) #0

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK6aiMesh10HasNormalsEv(ptr noundef nonnull align 8 dereferenceable(1320)) #3 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN10aiVector3tIfEC2Efff(ptr noundef nonnull align 4 dereferenceable(12), float noundef, float noundef, float noundef) unnamed_addr #3 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) #4

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) #4

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { <2 x float>, float } @_ZplIfE10aiVector3tIT_ERKS2_S4_(ptr noundef nonnull align 4 dereferenceable(12), ptr noundef nonnull align 4 dereferenceable(12)) #5

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef float @_ZSt4sqrtf(float noundef) #4

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef float @_ZSt4fabsf(float noundef) #4

declare noundef zeroext i1 @_ZN6Assimp13DefaultLogger12isNullLoggerEv() #0

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN6Assimp6Logger4infoIJRA6_KcRjRA53_S2_S5_EEEvDpOT_(ptr noundef nonnull align 8 dereferenceable(12), ptr noundef nonnull align 1 dereferenceable(6), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 1 dereferenceable(53), ptr noundef nonnull align 4 dereferenceable(4)) #7 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfEmLEf(ptr noundef nonnull align 4 dereferenceable(12), float noundef) #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZSt4swapIjENSt9enable_ifIXsr6__and_ISt6__not_ISt15__is_tuple_likeIT_EESt21is_move_constructibleIS3_ESt18is_move_assignableIS3_EEE5valueEvE4typeERS3_SC_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) #4

attributes #0 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nounwind 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 = { inlinehint 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 #5 = { inlinehint 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 #6 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #7 = { 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 #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 = !{!"any pointer", !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, !10, i64 4}
!12 = !{!"_ZTS6aiMesh", !10, i64 0, !10, i64 4, !10, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !7, i64 48, !7, i64 112, !7, i64 176, !6, i64 208, !10, i64 216, !6, i64 224, !10, i64 232, !13, i64 236, !10, i64 1264, !6, i64 1272, !14, i64 1280, !15, i64 1284, !6, i64 1312}
!13 = !{!"_ZTS8aiString", !10, i64 0, !7, i64 4}
!14 = !{!"_ZTS16aiMorphingMethod", !7, i64 0}
!15 = !{!"_ZTS6aiAABB", !16, i64 0, !16, i64 12}
!16 = !{!"_ZTS10aiVector3tIfE", !17, i64 0, !17, i64 4, !17, i64 8}
!17 = !{!"float", !7, i64 0}
!18 = !{!12, !6, i64 16}
!19 = !{!17, !17, i64 0}
!20 = !{!16, !17, i64 0}
!21 = !{!16, !17, i64 4}
!22 = !{!16, !17, i64 8}
!23 = !{!12, !6, i64 24}
!24 = distinct !{!24, !25}
!25 = !{!"llvm.loop.mustprogress"}
!26 = distinct !{!26, !25}
!27 = !{!12, !10, i64 8}
!28 = !{!12, !6, i64 208}
!29 = !{!30, !10, i64 0}
!30 = !{!"_ZTS6aiFace", !10, i64 0, !6, i64 8}
!31 = !{!30, !6, i64 8}
!32 = distinct !{!32, !25}
!33 = distinct !{!33, !25}


; 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"

%class.aiVector3t = type { float, float, float }
%struct.aiFace = type { i32, ptr }

@.str.3 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [123 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [53 x i8], align 1

declare noundef ptr @_ZN6Assimp13DefaultLogger3getEv() local_unnamed_addr #0

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

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZN6Assimp25FixInfacingNormalsProcess11ProcessMeshEP6aiMeshj(ptr nocapture noundef nonnull readnone align 8 dereferenceable(24) %0, ptr noundef %1, i32 noundef %2) local_unnamed_addr #2 align 2 {
  %4 = alloca i32, align 4
  %5 = alloca %class.aiVector3t, align 4
  %6 = alloca %class.aiVector3t, align 4
  %7 = alloca %class.aiVector3t, align 4
  %8 = alloca %class.aiVector3t, align 4
  %9 = alloca %class.aiVector3t, align 8
  store i32 %2, ptr %4, align 4, !tbaa !5
  %.not = icmp eq ptr %1, null
  br i1 %.not, label %10, label %11

10:                                               ; preds = %3
  tail call void @_ZN6Assimp17aiAssertViolationEPKcS1_i(ptr noundef nonnull @.str.3, ptr noundef nonnull @.str.4, i32 noundef 88)
  br label %11

11:                                               ; preds = %10, %3
  %12 = tail call noundef zeroext i1 @_ZNK6aiMesh10HasNormalsEv(ptr noundef nonnull align 8 dereferenceable(1320) %1)
  br i1 %12, label %13, label %166

13:                                               ; preds = %11
  call void @llvm.lifetime.start.p0(i64 12, ptr nonnull %5) #7
  call void @_ZN10aiVector3tIfEC2Efff(ptr noundef nonnull align 4 dereferenceable(12) %5, float noundef 1.000000e+10, float noundef 1.000000e+10, float noundef 1.000000e+10)
  call void @llvm.lifetime.start.p0(i64 12, ptr nonnull %6) #7
  call void @_ZN10aiVector3tIfEC2Efff(ptr noundef nonnull align 4 dereferenceable(12) %6, float noundef 1.000000e+10, float noundef 1.000000e+10, float noundef 1.000000e+10)
  call void @llvm.lifetime.start.p0(i64 12, ptr nonnull %7) #7
  call void @_ZN10aiVector3tIfEC2Efff(ptr noundef nonnull align 4 dereferenceable(12) %7, float noundef -1.000000e+10, float noundef -1.000000e+10, float noundef -1.000000e+10)
  call void @llvm.lifetime.start.p0(i64 12, ptr nonnull %8) #7
  call void @_ZN10aiVector3tIfEC2Efff(ptr noundef nonnull align 4 dereferenceable(12) %8, float noundef -1.000000e+10, float noundef -1.000000e+10, float noundef -1.000000e+10)
  %14 = getelementptr inbounds i8, ptr %1, i64 4
  %15 = load i32, ptr %14, align 4, !tbaa !9
  %.not80 = icmp eq i32 %15, 0
  br i1 %.not80, label %.._crit_edge_crit_edge, label %.lr.ph

.._crit_edge_crit_edge:                           ; preds = %13
  %.phi.trans.insert = getelementptr inbounds i8, ptr %7, i64 8
  %.pre = load float, ptr %.phi.trans.insert, align 4, !tbaa !17
  br label %._crit_edge

.lr.ph:                                           ; preds = %13
  %16 = getelementptr inbounds i8, ptr %1, i64 16
  %17 = getelementptr inbounds i8, ptr %6, i64 4
  %18 = getelementptr inbounds i8, ptr %6, i64 8
  %19 = getelementptr inbounds i8, ptr %8, i64 4
  %20 = getelementptr inbounds i8, ptr %8, i64 8
  %21 = getelementptr inbounds i8, ptr %1, i64 24
  %.sroa.2.0..sroa_idx = getelementptr inbounds i8, ptr %9, i64 8
  %22 = getelementptr inbounds i8, ptr %5, i64 4
  %23 = getelementptr inbounds i8, ptr %9, i64 4
  %24 = getelementptr inbounds i8, ptr %5, i64 8
  %25 = getelementptr inbounds i8, ptr %7, i64 4
  %26 = getelementptr inbounds i8, ptr %7, i64 8
  br label %54

._crit_edge:                                      ; preds = %54, %.._crit_edge_crit_edge
  %27 = phi float [ %.pre, %.._crit_edge_crit_edge ], [ %95, %54 ]
  %28 = load float, ptr %7, align 4, !tbaa !18
  %29 = load float, ptr %5, align 4, !tbaa !18
  %30 = fsub float %28, %29
  %31 = getelementptr inbounds i8, ptr %7, i64 4
  %32 = load float, ptr %31, align 4, !tbaa !19
  %33 = getelementptr inbounds i8, ptr %5, i64 4
  %34 = load float, ptr %33, align 4, !tbaa !19
  %35 = fsub float %32, %34
  %36 = getelementptr inbounds i8, ptr %5, i64 8
  %37 = load float, ptr %36, align 4, !tbaa !17
  %38 = fsub float %27, %37
  %39 = load float, ptr %8, align 4, !tbaa !18
  %40 = load float, ptr %6, align 4, !tbaa !18
  %41 = fsub float %39, %40
  %42 = getelementptr inbounds i8, ptr %8, i64 4
  %43 = load float, ptr %42, align 4, !tbaa !19
  %44 = getelementptr inbounds i8, ptr %6, i64 4
  %45 = load float, ptr %44, align 4, !tbaa !19
  %46 = fsub float %43, %45
  %47 = getelementptr inbounds i8, ptr %8, i64 8
  %48 = load float, ptr %47, align 4, !tbaa !17
  %49 = getelementptr inbounds i8, ptr %6, i64 8
  %50 = load float, ptr %49, align 4, !tbaa !17
  %51 = fsub float %48, %50
  %52 = fcmp ogt float %30, 0.000000e+00
  %53 = fcmp ule float %41, 0.000000e+00
  %.not67 = xor i1 %52, %53
  br i1 %.not67, label %99, label %.loopexit

54:                                               ; preds = %.lr.ph, %54
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %54 ]
  %55 = load ptr, ptr %16, align 8, !tbaa !20
  %56 = getelementptr inbounds %class.aiVector3t, ptr %55, i64 %indvars.iv
  %57 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %6, ptr noundef nonnull align 4 dereferenceable(4) %56)
  %58 = load float, ptr %57, align 4, !tbaa !21
  store float %58, ptr %6, align 4, !tbaa !18
  %59 = load ptr, ptr %16, align 8, !tbaa !20
  %60 = getelementptr inbounds %class.aiVector3t, ptr %59, i64 %indvars.iv, i32 1
  %61 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %17, ptr noundef nonnull align 4 dereferenceable(4) %60)
  %62 = load float, ptr %61, align 4, !tbaa !21
  store float %62, ptr %17, align 4, !tbaa !19
  %63 = load ptr, ptr %16, align 8, !tbaa !20
  %64 = getelementptr inbounds %class.aiVector3t, ptr %63, i64 %indvars.iv, i32 2
  %65 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %18, ptr noundef nonnull align 4 dereferenceable(4) %64)
  %66 = load float, ptr %65, align 4, !tbaa !21
  store float %66, ptr %18, align 4, !tbaa !17
  %67 = load ptr, ptr %16, align 8, !tbaa !20
  %68 = getelementptr inbounds %class.aiVector3t, ptr %67, i64 %indvars.iv
  %69 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %8, ptr noundef nonnull align 4 dereferenceable(4) %68)
  %70 = load float, ptr %69, align 4, !tbaa !21
  store float %70, ptr %8, align 4, !tbaa !18
  %71 = load ptr, ptr %16, align 8, !tbaa !20
  %72 = getelementptr inbounds %class.aiVector3t, ptr %71, i64 %indvars.iv, i32 1
  %73 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %19, ptr noundef nonnull align 4 dereferenceable(4) %72)
  %74 = load float, ptr %73, align 4, !tbaa !21
  store float %74, ptr %19, align 4, !tbaa !19
  %75 = load ptr, ptr %16, align 8, !tbaa !20
  %76 = getelementptr inbounds %class.aiVector3t, ptr %75, i64 %indvars.iv, i32 2
  %77 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %20, ptr noundef nonnull align 4 dereferenceable(4) %76)
  %78 = load float, ptr %77, align 4, !tbaa !21
  store float %78, ptr %20, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 12, ptr nonnull %9) #7
  %79 = load ptr, ptr %16, align 8, !tbaa !20
  %80 = getelementptr inbounds %class.aiVector3t, ptr %79, i64 %indvars.iv
  %81 = load ptr, ptr %21, align 8, !tbaa !22
  %82 = getelementptr inbounds %class.aiVector3t, ptr %81, i64 %indvars.iv
  %83 = call { <2 x float>, float } @_ZplIfE10aiVector3tIT_ERKS2_S4_(ptr noundef nonnull align 4 dereferenceable(12) %80, ptr noundef nonnull align 4 dereferenceable(12) %82)
  %.fca.0.extract = extractvalue { <2 x float>, float } %83, 0
  %.fca.1.extract = extractvalue { <2 x float>, float } %83, 1
  store <2 x float> %.fca.0.extract, ptr %9, align 8
  store float %.fca.1.extract, ptr %.sroa.2.0..sroa_idx, align 8
  %84 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %5, ptr noundef nonnull align 4 dereferenceable(4) %9)
  %85 = load float, ptr %84, align 4, !tbaa !21
  store float %85, ptr %5, align 4, !tbaa !18
  %86 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %22, ptr noundef nonnull align 4 dereferenceable(4) %23)
  %87 = load float, ptr %86, align 4, !tbaa !21
  store float %87, ptr %22, align 4, !tbaa !19
  %88 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %24, ptr noundef nonnull align 4 dereferenceable(4) %.sroa.2.0..sroa_idx)
  %89 = load float, ptr %88, align 4, !tbaa !21
  store float %89, ptr %24, align 4, !tbaa !17
  %90 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %7, ptr noundef nonnull align 4 dereferenceable(4) %9)
  %91 = load float, ptr %90, align 4, !tbaa !21
  store float %91, ptr %7, align 4, !tbaa !18
  %92 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %25, ptr noundef nonnull align 4 dereferenceable(4) %23)
  %93 = load float, ptr %92, align 4, !tbaa !21
  store float %93, ptr %25, align 4, !tbaa !19
  %94 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %26, ptr noundef nonnull align 4 dereferenceable(4) %.sroa.2.0..sroa_idx)
  %95 = load float, ptr %94, align 4, !tbaa !21
  store float %95, ptr %26, align 4, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 12, ptr nonnull %9) #7
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %96 = load i32, ptr %14, align 4, !tbaa !9
  %97 = zext i32 %96 to i64
  %98 = icmp ult i64 %indvars.iv.next, %97
  br i1 %98, label %54, label %._crit_edge, !llvm.loop !23

99:                                               ; preds = %._crit_edge
  %100 = fcmp ogt float %35, 0.000000e+00
  %101 = fcmp ule float %46, 0.000000e+00
  %.not68 = xor i1 %100, %101
  br i1 %.not68, label %102, label %.loopexit

102:                                              ; preds = %99
  %103 = fcmp ogt float %38, 0.000000e+00
  %104 = fcmp ule float %51, 0.000000e+00
  %.not69 = xor i1 %103, %104
  br i1 %.not69, label %105, label %.loopexit

105:                                              ; preds = %102
  %106 = fmul float %46, %51
  %107 = call noundef float @_ZSt4sqrtf(float noundef %106)
  %108 = fmul float %107, 0x3FA99999A0000000
  %109 = fcmp olt float %41, %108
  br i1 %109, label %.loopexit, label %110

110:                                              ; preds = %105
  %111 = fmul float %41, %51
  %112 = call noundef float @_ZSt4sqrtf(float noundef %111)
  %113 = fmul float %112, 0x3FA99999A0000000
  %114 = fcmp olt float %46, %113
  br i1 %114, label %.loopexit, label %115

115:                                              ; preds = %110
  %116 = fmul float %41, %46
  %117 = call noundef float @_ZSt4sqrtf(float noundef %116)
  %118 = fmul float %117, 0x3FA99999A0000000
  %119 = fcmp olt float %51, %118
  br i1 %119, label %.loopexit, label %120

120:                                              ; preds = %115
  %121 = fmul float %30, %35
  %122 = fmul float %121, %38
  %123 = call noundef float @_ZSt4fabsf(float noundef %122)
  %124 = fmul float %41, %106
  %125 = call noundef float @_ZSt4fabsf(float noundef %124)
  %126 = fcmp olt float %123, %125
  br i1 %126, label %127, label %.loopexit

127:                                              ; preds = %120
  %128 = call noundef zeroext i1 @_ZN6Assimp13DefaultLogger12isNullLoggerEv()
  br i1 %128, label %131, label %129

129:                                              ; preds = %127
  %130 = call noundef ptr @_ZN6Assimp13DefaultLogger3getEv()
  call void @_ZN6Assimp6Logger4infoIJRA6_KcRjRA53_S2_S5_EEEvDpOT_(ptr noundef nonnull align 8 dereferenceable(12) %130, ptr noundef nonnull align 1 dereferenceable(6) @.str.5, ptr noundef nonnull align 4 dereferenceable(4) %4, ptr noundef nonnull align 1 dereferenceable(53) @.str.6, ptr noundef nonnull align 4 dereferenceable(4) %4)
  br label %131

131:                                              ; preds = %129, %127
  %132 = load i32, ptr %14, align 4, !tbaa !9
  %.not81 = icmp eq i32 %132, 0
  br i1 %.not81, label %.preheader, label %.lr.ph73

.lr.ph73:                                         ; preds = %131
  %133 = getelementptr inbounds i8, ptr %1, i64 24
  br label %137

.preheader:                                       ; preds = %137, %131
  %134 = getelementptr inbounds i8, ptr %1, i64 8
  %135 = load i32, ptr %134, align 8, !tbaa !25
  %.not82 = icmp eq i32 %135, 0
  br i1 %.not82, label %.loopexit, label %.lr.ph79

.lr.ph79:                                         ; preds = %.preheader
  %136 = getelementptr inbounds i8, ptr %1, i64 208
  br label %144

137:                                              ; preds = %.lr.ph73, %137
  %indvars.iv85 = phi i64 [ 0, %.lr.ph73 ], [ %indvars.iv.next86, %137 ]
  %138 = load ptr, ptr %133, align 8, !tbaa !22
  %139 = getelementptr inbounds %class.aiVector3t, ptr %138, i64 %indvars.iv85
  %140 = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfEmLEf(ptr noundef nonnull align 4 dereferenceable(12) %139, float noundef -1.000000e+00)
  %indvars.iv.next86 = add nuw nsw i64 %indvars.iv85, 1
  %141 = load i32, ptr %14, align 4, !tbaa !9
  %142 = zext i32 %141 to i64
  %143 = icmp ult i64 %indvars.iv.next86, %142
  br i1 %143, label %137, label %.preheader, !llvm.loop !26

144:                                              ; preds = %.lr.ph79, %._crit_edge77
  %145 = phi i32 [ %135, %.lr.ph79 ], [ %150, %._crit_edge77 ]
  %indvars.iv91 = phi i64 [ 0, %.lr.ph79 ], [ %indvars.iv.next92, %._crit_edge77 ]
  %146 = load ptr, ptr %136, align 8, !tbaa !27
  %147 = getelementptr inbounds %struct.aiFace, ptr %146, i64 %indvars.iv91
  %148 = load i32, ptr %147, align 8, !tbaa !28
  %.not83 = icmp ult i32 %148, 2
  br i1 %.not83, label %._crit_edge77, label %.lr.ph76

.lr.ph76:                                         ; preds = %144
  %149 = getelementptr inbounds i8, ptr %147, i64 8
  br label %153

._crit_edge77.loopexit:                           ; preds = %153
  %.pre94 = load i32, ptr %134, align 8, !tbaa !25
  br label %._crit_edge77

._crit_edge77:                                    ; preds = %._crit_edge77.loopexit, %144
  %150 = phi i32 [ %.pre94, %._crit_edge77.loopexit ], [ %145, %144 ]
  %indvars.iv.next92 = add nuw nsw i64 %indvars.iv91, 1
  %151 = zext i32 %150 to i64
  %152 = icmp ult i64 %indvars.iv.next92, %151
  br i1 %152, label %144, label %.loopexit, !llvm.loop !30

153:                                              ; preds = %.lr.ph76, %153
  %indvars.iv88 = phi i64 [ 0, %.lr.ph76 ], [ %indvars.iv.next89, %153 ]
  %154 = phi i32 [ %148, %.lr.ph76 ], [ %162, %153 ]
  %155 = load ptr, ptr %149, align 8, !tbaa !31
  %156 = getelementptr inbounds i32, ptr %155, i64 %indvars.iv88
  %157 = trunc nuw nsw i64 %indvars.iv88 to i32
  %158 = xor i32 %157, -1
  %159 = add i32 %154, %158
  %160 = zext i32 %159 to i64
  %161 = getelementptr inbounds i32, ptr %155, i64 %160
  call void @_ZSt4swapIjENSt9enable_ifIXsr6__and_ISt6__not_ISt15__is_tuple_likeIT_EESt21is_move_constructibleIS3_ESt18is_move_assignableIS3_EEE5valueEvE4typeERS3_SC_(ptr noundef nonnull align 4 dereferenceable(4) %156, ptr noundef nonnull align 4 dereferenceable(4) %161) #7
  %indvars.iv.next89 = add nuw nsw i64 %indvars.iv88, 1
  %162 = load i32, ptr %147, align 8, !tbaa !28
  %163 = lshr i32 %162, 1
  %164 = zext nneg i32 %163 to i64
  %165 = icmp ult i64 %indvars.iv.next89, %164
  br i1 %165, label %153, label %._crit_edge77.loopexit, !llvm.loop !32

.loopexit:                                        ; preds = %._crit_edge77, %.preheader, %105, %110, %115, %120, %102, %99, %._crit_edge
  %.1 = phi i1 [ false, %._crit_edge ], [ false, %99 ], [ false, %102 ], [ false, %105 ], [ false, %110 ], [ false, %115 ], [ false, %120 ], [ true, %.preheader ], [ true, %._crit_edge77 ]
  call void @llvm.lifetime.end.p0(i64 12, ptr nonnull %8) #7
  call void @llvm.lifetime.end.p0(i64 12, ptr nonnull %7) #7
  call void @llvm.lifetime.end.p0(i64 12, ptr nonnull %6) #7
  call void @llvm.lifetime.end.p0(i64 12, ptr nonnull %5) #7
  br label %166

166:                                              ; preds = %11, %.loopexit
  %.2 = phi i1 [ %.1, %.loopexit ], [ false, %11 ]
  ret i1 %.2
}

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

declare void @_ZN6Assimp17aiAssertViolationEPKcS1_i(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK6aiMesh10HasNormalsEv(ptr noundef nonnull align 8 dereferenceable(1320)) local_unnamed_addr #3 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN10aiVector3tIfEC2Efff(ptr noundef nonnull align 4 dereferenceable(12), float noundef, float noundef, float noundef) unnamed_addr #3 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #4

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #4

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { <2 x float>, float } @_ZplIfE10aiVector3tIT_ERKS2_S4_(ptr noundef nonnull align 4 dereferenceable(12), ptr noundef nonnull align 4 dereferenceable(12)) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef float @_ZSt4sqrtf(float noundef) local_unnamed_addr #4

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef float @_ZSt4fabsf(float noundef) local_unnamed_addr #4

declare noundef zeroext i1 @_ZN6Assimp13DefaultLogger12isNullLoggerEv() local_unnamed_addr #0

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN6Assimp6Logger4infoIJRA6_KcRjRA53_S2_S5_EEEvDpOT_(ptr noundef nonnull align 8 dereferenceable(12), ptr noundef nonnull align 1 dereferenceable(6), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 1 dereferenceable(53), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfEmLEf(ptr noundef nonnull align 4 dereferenceable(12), float noundef) local_unnamed_addr #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZSt4swapIjENSt9enable_ifIXsr6__and_ISt6__not_ISt15__is_tuple_likeIT_EESt21is_move_constructibleIS3_ESt18is_move_assignableIS3_EEE5valueEvE4typeERS3_SC_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #4

attributes #0 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nounwind 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 = { inlinehint 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 #5 = { inlinehint 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 #6 = { 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 #7 = { 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, !6, i64 4}
!10 = !{!"_ZTS6aiMesh", !6, i64 0, !6, i64 4, !6, i64 8, !11, i64 16, !11, i64 24, !11, i64 32, !11, i64 40, !7, i64 48, !7, i64 112, !7, i64 176, !11, i64 208, !6, i64 216, !11, i64 224, !6, i64 232, !12, i64 236, !6, i64 1264, !11, i64 1272, !13, i64 1280, !14, i64 1284, !11, i64 1312}
!11 = !{!"any pointer", !7, i64 0}
!12 = !{!"_ZTS8aiString", !6, i64 0, !7, i64 4}
!13 = !{!"_ZTS16aiMorphingMethod", !7, i64 0}
!14 = !{!"_ZTS6aiAABB", !15, i64 0, !15, i64 12}
!15 = !{!"_ZTS10aiVector3tIfE", !16, i64 0, !16, i64 4, !16, i64 8}
!16 = !{!"float", !7, i64 0}
!17 = !{!15, !16, i64 8}
!18 = !{!15, !16, i64 0}
!19 = !{!15, !16, i64 4}
!20 = !{!10, !11, i64 16}
!21 = !{!16, !16, i64 0}
!22 = !{!10, !11, i64 24}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = !{!10, !6, i64 8}
!26 = distinct !{!26, !24}
!27 = !{!10, !11, i64 208}
!28 = !{!29, !6, i64 0}
!29 = !{!"_ZTS6aiFace", !6, i64 0, !11, i64 8}
!30 = distinct !{!30, !24}
!31 = !{!29, !11, i64 8}
!32 = distinct !{!32, !24}


; Effective O3 passes: BDCEPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass