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

; 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 }
%class.aiMatrix4x4t = type { float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float }
%class.aiMatrix3x3t = type { float, float, float, float, float, float, float, float, float }
%struct.aiNode = type { %struct.aiString, %class.aiMatrix4x4t, ptr, i32, ptr, i32, ptr, ptr }
%struct.aiString = type { i32, [1024 x i8] }
%struct.aiScene = type { i32, ptr, i32, ptr, i32, ptr, i32, ptr, i32, ptr, i32, ptr, i32, ptr, ptr, %struct.aiString, i32, ptr, ptr }
%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.aiAABB = type { %class.aiVector3t, %class.aiVector3t }
%class.aiColor4t = type { float, float, float, float }
%struct.aiFace = type { i32, ptr }

@.str.5 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [129 x i8], align 1

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

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

; Function Attrs: mustprogress uwtable
declare hidden noundef i32 @_ZN12_GLOBAL__N_114GetMeshVFormatEP6aiMesh(ptr noundef) #2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZNK6Assimp20PretransformVertices11CollectDataEPK7aiScenePK6aiNodejjP6aiMeshPjS9_(ptr noundef nonnull align 8 dereferenceable(93) %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, i32 noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7) #3 align 2 {
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i8, align 1
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca i32, align 4
  %23 = alloca %class.aiVector3t, align 4
  %24 = alloca { <2 x float>, float }, align 8
  %25 = alloca %class.aiMatrix4x4t, align 4
  %26 = alloca %class.aiMatrix3x3t, align 4
  %27 = alloca i32, align 4
  %28 = alloca %class.aiVector3t, align 4
  %29 = alloca { <2 x float>, float }, align 8
  %30 = alloca i32, align 4
  %31 = alloca %class.aiVector3t, align 4
  %32 = alloca { <2 x float>, float }, align 8
  %33 = alloca %class.aiVector3t, align 4
  %34 = alloca { <2 x float>, float }, align 8
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca i32, align 4
  %40 = alloca ptr, align 8
  %41 = alloca i32, align 4
  %42 = alloca i32, align 4
  %43 = alloca i32, align 4
  store ptr %0, ptr %9, align 8, !tbaa !5
  store ptr %1, ptr %10, align 8, !tbaa !5
  store ptr %2, ptr %11, align 8, !tbaa !5
  store i32 %3, ptr %12, align 4, !tbaa !9
  store i32 %4, ptr %13, align 4, !tbaa !9
  store ptr %5, ptr %14, align 8, !tbaa !5
  store ptr %6, ptr %15, align 8, !tbaa !5
  store ptr %7, ptr %16, align 8, !tbaa !5
  %44 = load ptr, ptr %9, align 8
  call void @llvm.lifetime.start.p0(i64 1, ptr %17) #10
  %45 = load ptr, ptr %11, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.aiNode, ptr %45, i32 0, i32 1
  %47 = call noundef zeroext i1 @_ZNK12aiMatrix4x4tIfE10IsIdentityEf(ptr noundef nonnull align 4 dereferenceable(64) %46, float noundef 0x3F847AE140000000)
  %48 = zext i1 %47 to i8
  store i8 %48, ptr %17, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #10
  store i32 0, ptr %18, align 4, !tbaa !9
  br label %49

49:                                               ; preds = %518, %8
  %50 = load i32, ptr %18, align 4, !tbaa !9
  %51 = load ptr, ptr %11, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.aiNode, ptr %51, i32 0, i32 5
  %53 = load i32, ptr %52, align 8, !tbaa !13
  %54 = icmp ult i32 %50, %53
  br i1 %54, label %56, label %55

55:                                               ; preds = %49
  store i32 2, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #10
  br label %521

56:                                               ; preds = %49
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #10
  %57 = load ptr, ptr %10, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct.aiScene, ptr %57, i32 0, i32 3
  %59 = load ptr, ptr %58, align 8, !tbaa !18
  %60 = load ptr, ptr %11, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.aiNode, ptr %60, i32 0, i32 6
  %62 = load ptr, ptr %61, align 8, !tbaa !20
  %63 = load i32, ptr %18, align 4, !tbaa !9
  %64 = zext i32 %63 to i64
  %65 = getelementptr inbounds i32, ptr %62, i64 %64
  %66 = load i32, ptr %65, align 4, !tbaa !9
  %67 = zext i32 %66 to i64
  %68 = getelementptr inbounds ptr, ptr %59, i64 %67
  %69 = load ptr, ptr %68, align 8, !tbaa !5
  store ptr %69, ptr %20, align 8, !tbaa !5
  %70 = load i32, ptr %12, align 4, !tbaa !9
  %71 = load ptr, ptr %20, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.aiMesh, ptr %71, i32 0, i32 13
  %73 = load i32, ptr %72, align 8, !tbaa !21
  %74 = icmp eq i32 %70, %73
  br i1 %74, label %75, label %517

75:                                               ; preds = %56
  %76 = load i32, ptr %13, align 4, !tbaa !9
  %77 = load ptr, ptr %20, align 8, !tbaa !5
  %78 = call noundef i32 @_ZN12_GLOBAL__N_114GetMeshVFormatEP6aiMesh(ptr noundef %77)
  %79 = icmp eq i32 %76, %78
  br i1 %79, label %80, label %517

80:                                               ; preds = %75
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #10
  %81 = load ptr, ptr %16, align 8, !tbaa !5
  %82 = load ptr, ptr %11, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.aiNode, ptr %82, i32 0, i32 6
  %84 = load ptr, ptr %83, align 8, !tbaa !20
  %85 = load i32, ptr %18, align 4, !tbaa !9
  %86 = zext i32 %85 to i64
  %87 = getelementptr inbounds i32, ptr %84, i64 %86
  %88 = load i32, ptr %87, align 4, !tbaa !9
  %89 = zext i32 %88 to i64
  %90 = getelementptr inbounds i32, ptr %81, i64 %89
  store ptr %90, ptr %21, align 8, !tbaa !5
  %91 = load ptr, ptr %21, align 8, !tbaa !5
  %92 = load i32, ptr %91, align 4, !tbaa !9
  %93 = icmp ne i32 0, %92
  br i1 %93, label %95, label %94

94:                                               ; preds = %80
  call void @_ZN6Assimp17aiAssertViolationEPKcS1_i(ptr noundef @.str.5, ptr noundef @.str.6, i32 noundef 154)
  br label %95

95:                                               ; preds = %94, %80
  %96 = phi i1 [ true, %80 ], [ false, %94 ]
  %97 = load ptr, ptr %21, align 8, !tbaa !5
  %98 = load i32, ptr %97, align 4, !tbaa !9
  %99 = add i32 %98, -1
  store i32 %99, ptr %97, align 4, !tbaa !9
  %100 = load ptr, ptr %21, align 8, !tbaa !5
  %101 = load i32, ptr %100, align 4, !tbaa !9
  %102 = icmp eq i32 %101, 0
  br i1 %102, label %103, label %109

103:                                              ; preds = %95
  %104 = load ptr, ptr %20, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.aiMesh, ptr %104, i32 0, i32 14
  %106 = load ptr, ptr %14, align 8, !tbaa !5
  %107 = getelementptr inbounds %struct.aiMesh, ptr %106, i32 0, i32 14
  %108 = call noundef nonnull align 4 dereferenceable(1028) ptr @_ZN8aiStringaSERKS_(ptr noundef nonnull align 4 dereferenceable(1028) %107, ptr noundef nonnull align 4 dereferenceable(1028) %105)
  br label %109

109:                                              ; preds = %103, %95
  %110 = load i8, ptr %17, align 1, !tbaa !11, !range !26, !noundef !27
  %111 = trunc i8 %110 to i1
  br i1 %111, label %112, label %187

112:                                              ; preds = %109
  %113 = load ptr, ptr %14, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.aiMesh, ptr %113, i32 0, i32 3
  %115 = load ptr, ptr %114, align 8, !tbaa !28
  %116 = load ptr, ptr %15, align 8, !tbaa !5
  %117 = getelementptr inbounds i32, ptr %116, i64 0
  %118 = load i32, ptr %117, align 4, !tbaa !9
  %119 = zext i32 %118 to i64
  %120 = getelementptr inbounds %class.aiVector3t, ptr %115, i64 %119
  %121 = load ptr, ptr %20, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.aiMesh, ptr %121, i32 0, i32 3
  %123 = load ptr, ptr %122, align 8, !tbaa !28
  %124 = load ptr, ptr %20, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.aiMesh, ptr %124, i32 0, i32 1
  %126 = load i32, ptr %125, align 4, !tbaa !29
  %127 = zext i32 %126 to i64
  %128 = mul i64 %127, 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %120, ptr align 4 %123, i64 %128, i1 false)
  %129 = load i32, ptr %13, align 4, !tbaa !9
  %130 = and i32 %129, 2
  %131 = icmp ne i32 %130, 0
  br i1 %131, label %132, label %149

132:                                              ; preds = %112
  %133 = load ptr, ptr %14, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.aiMesh, ptr %133, i32 0, i32 4
  %135 = load ptr, ptr %134, align 8, !tbaa !30
  %136 = load ptr, ptr %15, align 8, !tbaa !5
  %137 = getelementptr inbounds i32, ptr %136, i64 0
  %138 = load i32, ptr %137, align 4, !tbaa !9
  %139 = zext i32 %138 to i64
  %140 = getelementptr inbounds %class.aiVector3t, ptr %135, i64 %139
  %141 = load ptr, ptr %20, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.aiMesh, ptr %141, i32 0, i32 4
  %143 = load ptr, ptr %142, align 8, !tbaa !30
  %144 = load ptr, ptr %20, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.aiMesh, ptr %144, i32 0, i32 1
  %146 = load i32, ptr %145, align 4, !tbaa !29
  %147 = zext i32 %146 to i64
  %148 = mul i64 %147, 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %140, ptr align 4 %143, i64 %148, i1 false)
  br label %149

149:                                              ; preds = %132, %112
  %150 = load i32, ptr %13, align 4, !tbaa !9
  %151 = and i32 %150, 4
  %152 = icmp ne i32 %151, 0
  br i1 %152, label %153, label %186

153:                                              ; preds = %149
  %154 = load ptr, ptr %14, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.aiMesh, ptr %154, i32 0, i32 5
  %156 = load ptr, ptr %155, align 8, !tbaa !31
  %157 = load ptr, ptr %15, align 8, !tbaa !5
  %158 = getelementptr inbounds i32, ptr %157, i64 0
  %159 = load i32, ptr %158, align 4, !tbaa !9
  %160 = zext i32 %159 to i64
  %161 = getelementptr inbounds %class.aiVector3t, ptr %156, i64 %160
  %162 = load ptr, ptr %20, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.aiMesh, ptr %162, i32 0, i32 5
  %164 = load ptr, ptr %163, align 8, !tbaa !31
  %165 = load ptr, ptr %20, align 8, !tbaa !5
  %166 = getelementptr inbounds %struct.aiMesh, ptr %165, i32 0, i32 1
  %167 = load i32, ptr %166, align 4, !tbaa !29
  %168 = zext i32 %167 to i64
  %169 = mul i64 %168, 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %161, ptr align 4 %164, i64 %169, i1 false)
  %170 = load ptr, ptr %14, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct.aiMesh, ptr %170, i32 0, i32 6
  %172 = load ptr, ptr %171, align 8, !tbaa !32
  %173 = load ptr, ptr %15, align 8, !tbaa !5
  %174 = getelementptr inbounds i32, ptr %173, i64 0
  %175 = load i32, ptr %174, align 4, !tbaa !9
  %176 = zext i32 %175 to i64
  %177 = getelementptr inbounds %class.aiVector3t, ptr %172, i64 %176
  %178 = load ptr, ptr %20, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.aiMesh, ptr %178, i32 0, i32 6
  %180 = load ptr, ptr %179, align 8, !tbaa !32
  %181 = load ptr, ptr %20, align 8, !tbaa !5
  %182 = getelementptr inbounds %struct.aiMesh, ptr %181, i32 0, i32 1
  %183 = load i32, ptr %182, align 4, !tbaa !29
  %184 = zext i32 %183 to i64
  %185 = mul i64 %184, 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %177, ptr align 4 %180, i64 %185, i1 false)
  br label %186

186:                                              ; preds = %153, %149
  br label %311

187:                                              ; preds = %109
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #10
  store i32 0, ptr %22, align 4, !tbaa !9
  br label %188

188:                                              ; preds = %215, %187
  %189 = load i32, ptr %22, align 4, !tbaa !9
  %190 = load ptr, ptr %20, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.aiMesh, ptr %190, i32 0, i32 1
  %192 = load i32, ptr %191, align 4, !tbaa !29
  %193 = icmp ult i32 %189, %192
  br i1 %193, label %195, label %194

194:                                              ; preds = %188
  store i32 5, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #10
  br label %218

195:                                              ; preds = %188
  call void @llvm.lifetime.start.p0(i64 12, ptr %23) #10
  %196 = load ptr, ptr %11, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.aiNode, ptr %196, i32 0, i32 1
  %198 = load ptr, ptr %20, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.aiMesh, ptr %198, i32 0, i32 3
  %200 = load ptr, ptr %199, align 8, !tbaa !28
  %201 = load i32, ptr %22, align 4, !tbaa !9
  %202 = zext i32 %201 to i64
  %203 = getelementptr inbounds %class.aiVector3t, ptr %200, i64 %202
  %204 = call { <2 x float>, float } @_ZmlIfE10aiVector3tIT_ERK12aiMatrix4x4tIS1_ERKS2_(ptr noundef nonnull align 4 dereferenceable(64) %197, ptr noundef nonnull align 4 dereferenceable(12) %203)
  store { <2 x float>, float } %204, ptr %24, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %23, ptr align 8 %24, i64 12, i1 false)
  %205 = load ptr, ptr %14, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct.aiMesh, ptr %205, i32 0, i32 3
  %207 = load ptr, ptr %206, align 8, !tbaa !28
  %208 = load ptr, ptr %15, align 8, !tbaa !5
  %209 = getelementptr inbounds i32, ptr %208, i64 0
  %210 = load i32, ptr %209, align 4, !tbaa !9
  %211 = load i32, ptr %22, align 4, !tbaa !9
  %212 = add i32 %210, %211
  %213 = zext i32 %212 to i64
  %214 = getelementptr inbounds %class.aiVector3t, ptr %207, i64 %213
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %214, ptr align 4 %23, i64 12, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.end.p0(i64 12, ptr %23) #10
  br label %215

215:                                              ; preds = %195
  %216 = load i32, ptr %22, align 4, !tbaa !9
  %217 = add i32 %216, 1
  store i32 %217, ptr %22, align 4, !tbaa !9
  br label %188, !llvm.loop !35

218:                                              ; preds = %194
  call void @llvm.lifetime.start.p0(i64 64, ptr %25) #10
  %219 = load ptr, ptr %11, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.aiNode, ptr %219, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %25, ptr align 4 %220, i64 64, i1 false), !tbaa.struct !37
  %221 = call noundef nonnull align 4 dereferenceable(64) ptr @_ZN12aiMatrix4x4tIfE7InverseEv(ptr noundef nonnull align 4 dereferenceable(64) %25)
  %222 = call noundef nonnull align 4 dereferenceable(64) ptr @_ZN12aiMatrix4x4tIfE9TransposeEv(ptr noundef nonnull align 4 dereferenceable(64) %221)
  call void @llvm.lifetime.start.p0(i64 36, ptr %26) #10
  call void @_ZN12aiMatrix3x3tIfEC2ERK12aiMatrix4x4tIfE(ptr noundef nonnull align 4 dereferenceable(36) %26, ptr noundef nonnull align 4 dereferenceable(64) %25)
  %223 = load i32, ptr %13, align 4, !tbaa !9
  %224 = and i32 %223, 2
  %225 = icmp ne i32 %224, 0
  br i1 %225, label %226, label %257

226:                                              ; preds = %218
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #10
  store i32 0, ptr %27, align 4, !tbaa !9
  br label %227

227:                                              ; preds = %253, %226
  %228 = load i32, ptr %27, align 4, !tbaa !9
  %229 = load ptr, ptr %20, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.aiMesh, ptr %229, i32 0, i32 1
  %231 = load i32, ptr %230, align 4, !tbaa !29
  %232 = icmp ult i32 %228, %231
  br i1 %232, label %234, label %233

233:                                              ; preds = %227
  store i32 8, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #10
  br label %256

234:                                              ; preds = %227
  call void @llvm.lifetime.start.p0(i64 12, ptr %28) #10
  %235 = load ptr, ptr %20, align 8, !tbaa !5
  %236 = getelementptr inbounds %struct.aiMesh, ptr %235, i32 0, i32 4
  %237 = load ptr, ptr %236, align 8, !tbaa !30
  %238 = load i32, ptr %27, align 4, !tbaa !9
  %239 = zext i32 %238 to i64
  %240 = getelementptr inbounds %class.aiVector3t, ptr %237, i64 %239
  %241 = call { <2 x float>, float } @_ZmlIfE10aiVector3tIT_ERK12aiMatrix3x3tIS1_ERKS2_(ptr noundef nonnull align 4 dereferenceable(36) %26, ptr noundef nonnull align 4 dereferenceable(12) %240)
  store { <2 x float>, float } %241, ptr %29, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %28, ptr align 8 %29, i64 12, i1 false)
  %242 = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfE9NormalizeEv(ptr noundef nonnull align 4 dereferenceable(12) %28)
  %243 = load ptr, ptr %14, align 8, !tbaa !5
  %244 = getelementptr inbounds %struct.aiMesh, ptr %243, i32 0, i32 4
  %245 = load ptr, ptr %244, align 8, !tbaa !30
  %246 = load ptr, ptr %15, align 8, !tbaa !5
  %247 = getelementptr inbounds i32, ptr %246, i64 0
  %248 = load i32, ptr %247, align 4, !tbaa !9
  %249 = load i32, ptr %27, align 4, !tbaa !9
  %250 = add i32 %248, %249
  %251 = zext i32 %250 to i64
  %252 = getelementptr inbounds %class.aiVector3t, ptr %245, i64 %251
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %252, ptr align 4 %242, i64 12, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.end.p0(i64 12, ptr %28) #10
  br label %253

253:                                              ; preds = %234
  %254 = load i32, ptr %27, align 4, !tbaa !9
  %255 = add i32 %254, 1
  store i32 %255, ptr %27, align 4, !tbaa !9
  br label %227, !llvm.loop !38

256:                                              ; preds = %233
  br label %257

257:                                              ; preds = %256, %218
  %258 = load i32, ptr %13, align 4, !tbaa !9
  %259 = and i32 %258, 4
  %260 = icmp ne i32 %259, 0
  br i1 %260, label %261, label %310

261:                                              ; preds = %257
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #10
  store i32 0, ptr %30, align 4, !tbaa !9
  br label %262

262:                                              ; preds = %306, %261
  %263 = load i32, ptr %30, align 4, !tbaa !9
  %264 = load ptr, ptr %20, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.aiMesh, ptr %264, i32 0, i32 1
  %266 = load i32, ptr %265, align 4, !tbaa !29
  %267 = icmp ult i32 %263, %266
  br i1 %267, label %269, label %268

268:                                              ; preds = %262
  store i32 11, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #10
  br label %309

269:                                              ; preds = %262
  call void @llvm.lifetime.start.p0(i64 12, ptr %31) #10
  %270 = load ptr, ptr %20, align 8, !tbaa !5
  %271 = getelementptr inbounds %struct.aiMesh, ptr %270, i32 0, i32 5
  %272 = load ptr, ptr %271, align 8, !tbaa !31
  %273 = load i32, ptr %30, align 4, !tbaa !9
  %274 = zext i32 %273 to i64
  %275 = getelementptr inbounds %class.aiVector3t, ptr %272, i64 %274
  %276 = call { <2 x float>, float } @_ZmlIfE10aiVector3tIT_ERK12aiMatrix3x3tIS1_ERKS2_(ptr noundef nonnull align 4 dereferenceable(36) %26, ptr noundef nonnull align 4 dereferenceable(12) %275)
  store { <2 x float>, float } %276, ptr %32, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %31, ptr align 8 %32, i64 12, i1 false)
  %277 = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfE9NormalizeEv(ptr noundef nonnull align 4 dereferenceable(12) %31)
  %278 = load ptr, ptr %14, align 8, !tbaa !5
  %279 = getelementptr inbounds %struct.aiMesh, ptr %278, i32 0, i32 5
  %280 = load ptr, ptr %279, align 8, !tbaa !31
  %281 = load ptr, ptr %15, align 8, !tbaa !5
  %282 = getelementptr inbounds i32, ptr %281, i64 0
  %283 = load i32, ptr %282, align 4, !tbaa !9
  %284 = load i32, ptr %30, align 4, !tbaa !9
  %285 = add i32 %283, %284
  %286 = zext i32 %285 to i64
  %287 = getelementptr inbounds %class.aiVector3t, ptr %280, i64 %286
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %287, ptr align 4 %277, i64 12, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.end.p0(i64 12, ptr %31) #10
  call void @llvm.lifetime.start.p0(i64 12, ptr %33) #10
  %288 = load ptr, ptr %20, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct.aiMesh, ptr %288, i32 0, i32 6
  %290 = load ptr, ptr %289, align 8, !tbaa !32
  %291 = load i32, ptr %30, align 4, !tbaa !9
  %292 = zext i32 %291 to i64
  %293 = getelementptr inbounds %class.aiVector3t, ptr %290, i64 %292
  %294 = call { <2 x float>, float } @_ZmlIfE10aiVector3tIT_ERK12aiMatrix3x3tIS1_ERKS2_(ptr noundef nonnull align 4 dereferenceable(36) %26, ptr noundef nonnull align 4 dereferenceable(12) %293)
  store { <2 x float>, float } %294, ptr %34, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %33, ptr align 8 %34, i64 12, i1 false)
  %295 = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfE9NormalizeEv(ptr noundef nonnull align 4 dereferenceable(12) %33)
  %296 = load ptr, ptr %14, align 8, !tbaa !5
  %297 = getelementptr inbounds %struct.aiMesh, ptr %296, i32 0, i32 6
  %298 = load ptr, ptr %297, align 8, !tbaa !32
  %299 = load ptr, ptr %15, align 8, !tbaa !5
  %300 = getelementptr inbounds i32, ptr %299, i64 0
  %301 = load i32, ptr %300, align 4, !tbaa !9
  %302 = load i32, ptr %30, align 4, !tbaa !9
  %303 = add i32 %301, %302
  %304 = zext i32 %303 to i64
  %305 = getelementptr inbounds %class.aiVector3t, ptr %298, i64 %304
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %305, ptr align 4 %295, i64 12, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.end.p0(i64 12, ptr %33) #10
  br label %306

306:                                              ; preds = %269
  %307 = load i32, ptr %30, align 4, !tbaa !9
  %308 = add i32 %307, 1
  store i32 %308, ptr %30, align 4, !tbaa !9
  br label %262, !llvm.loop !39

309:                                              ; preds = %268
  br label %310

310:                                              ; preds = %309, %257
  call void @llvm.lifetime.end.p0(i64 36, ptr %26) #10
  call void @llvm.lifetime.end.p0(i64 64, ptr %25) #10
  br label %311

311:                                              ; preds = %310, %186
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #10
  store i32 0, ptr %35, align 4, !tbaa !9
  br label %312

312:                                              ; preds = %318, %311
  %313 = load i32, ptr %13, align 4, !tbaa !9
  %314 = load i32, ptr %35, align 4, !tbaa !9
  %315 = shl i32 256, %314
  %316 = and i32 %313, %315
  %317 = icmp ne i32 %316, 0
  br i1 %317, label %318, label %343

318:                                              ; preds = %312
  %319 = load ptr, ptr %14, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.aiMesh, ptr %319, i32 0, i32 8
  %321 = load i32, ptr %35, align 4, !tbaa !9
  %322 = zext i32 %321 to i64
  %323 = getelementptr inbounds [8 x ptr], ptr %320, i64 0, i64 %322
  %324 = load ptr, ptr %323, align 8, !tbaa !5
  %325 = load ptr, ptr %15, align 8, !tbaa !5
  %326 = getelementptr inbounds i32, ptr %325, i64 0
  %327 = load i32, ptr %326, align 4, !tbaa !9
  %328 = zext i32 %327 to i64
  %329 = getelementptr inbounds %class.aiVector3t, ptr %324, i64 %328
  %330 = load ptr, ptr %20, align 8, !tbaa !5
  %331 = getelementptr inbounds %struct.aiMesh, ptr %330, i32 0, i32 8
  %332 = load i32, ptr %35, align 4, !tbaa !9
  %333 = zext i32 %332 to i64
  %334 = getelementptr inbounds [8 x ptr], ptr %331, i64 0, i64 %333
  %335 = load ptr, ptr %334, align 8, !tbaa !5
  %336 = load ptr, ptr %20, align 8, !tbaa !5
  %337 = getelementptr inbounds %struct.aiMesh, ptr %336, i32 0, i32 1
  %338 = load i32, ptr %337, align 4, !tbaa !29
  %339 = zext i32 %338 to i64
  %340 = mul i64 %339, 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %329, ptr align 4 %335, i64 %340, i1 false)
  %341 = load i32, ptr %35, align 4, !tbaa !9
  %342 = add i32 %341, 1
  store i32 %342, ptr %35, align 4, !tbaa !9
  br label %312, !llvm.loop !40

343:                                              ; preds = %312
  store i32 0, ptr %35, align 4, !tbaa !9
  br label %344

344:                                              ; preds = %350, %343
  %345 = load i32, ptr %13, align 4, !tbaa !9
  %346 = load i32, ptr %35, align 4, !tbaa !9
  %347 = shl i32 16777216, %346
  %348 = and i32 %345, %347
  %349 = icmp ne i32 %348, 0
  br i1 %349, label %350, label %375

350:                                              ; preds = %344
  %351 = load ptr, ptr %14, align 8, !tbaa !5
  %352 = getelementptr inbounds %struct.aiMesh, ptr %351, i32 0, i32 7
  %353 = load i32, ptr %35, align 4, !tbaa !9
  %354 = zext i32 %353 to i64
  %355 = getelementptr inbounds [8 x ptr], ptr %352, i64 0, i64 %354
  %356 = load ptr, ptr %355, align 8, !tbaa !5
  %357 = load ptr, ptr %15, align 8, !tbaa !5
  %358 = getelementptr inbounds i32, ptr %357, i64 0
  %359 = load i32, ptr %358, align 4, !tbaa !9
  %360 = zext i32 %359 to i64
  %361 = getelementptr inbounds %class.aiColor4t, ptr %356, i64 %360
  %362 = load ptr, ptr %20, align 8, !tbaa !5
  %363 = getelementptr inbounds %struct.aiMesh, ptr %362, i32 0, i32 7
  %364 = load i32, ptr %35, align 4, !tbaa !9
  %365 = zext i32 %364 to i64
  %366 = getelementptr inbounds [8 x ptr], ptr %363, i64 0, i64 %365
  %367 = load ptr, ptr %366, align 8, !tbaa !5
  %368 = load ptr, ptr %20, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.aiMesh, ptr %368, i32 0, i32 1
  %370 = load i32, ptr %369, align 4, !tbaa !29
  %371 = zext i32 %370 to i64
  %372 = mul i64 %371, 16
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %361, ptr align 4 %367, i64 %372, i1 false)
  %373 = load i32, ptr %35, align 4, !tbaa !9
  %374 = add i32 %373, 1
  store i32 %374, ptr %35, align 4, !tbaa !9
  br label %344, !llvm.loop !41

375:                                              ; preds = %344
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #10
  store i32 0, ptr %36, align 4, !tbaa !9
  br label %376

376:                                              ; preds = %499, %375
  %377 = load i32, ptr %36, align 4, !tbaa !9
  %378 = load ptr, ptr %20, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.aiMesh, ptr %378, i32 0, i32 2
  %380 = load i32, ptr %379, align 8, !tbaa !42
  %381 = icmp ult i32 %377, %380
  br i1 %381, label %383, label %382

382:                                              ; preds = %376
  store i32 18, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #10
  br label %502

383:                                              ; preds = %376
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #10
  %384 = load ptr, ptr %20, align 8, !tbaa !5
  %385 = getelementptr inbounds %struct.aiMesh, ptr %384, i32 0, i32 10
  %386 = load ptr, ptr %385, align 8, !tbaa !43
  %387 = load i32, ptr %36, align 4, !tbaa !9
  %388 = zext i32 %387 to i64
  %389 = getelementptr inbounds %struct.aiFace, ptr %386, i64 %388
  store ptr %389, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #10
  %390 = load ptr, ptr %14, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.aiMesh, ptr %390, i32 0, i32 10
  %392 = load ptr, ptr %391, align 8, !tbaa !43
  %393 = load ptr, ptr %15, align 8, !tbaa !5
  %394 = getelementptr inbounds i32, ptr %393, i64 1
  %395 = load i32, ptr %394, align 4, !tbaa !9
  %396 = load i32, ptr %36, align 4, !tbaa !9
  %397 = add i32 %395, %396
  %398 = zext i32 %397 to i64
  %399 = getelementptr inbounds %struct.aiFace, ptr %392, i64 %398
  store ptr %399, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #10
  %400 = load ptr, ptr %37, align 8, !tbaa !5
  %401 = getelementptr inbounds %struct.aiFace, ptr %400, i32 0, i32 0
  %402 = load i32, ptr %401, align 8, !tbaa !44
  store i32 %402, ptr %39, align 4, !tbaa !9
  %403 = load i32, ptr %39, align 4, !tbaa !9
  %404 = load ptr, ptr %38, align 8, !tbaa !5
  %405 = getelementptr inbounds %struct.aiFace, ptr %404, i32 0, i32 0
  store i32 %403, ptr %405, align 8, !tbaa !44
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #10
  %406 = load ptr, ptr %21, align 8, !tbaa !5
  %407 = load i32, ptr %406, align 4, !tbaa !9
  %408 = icmp ne i32 %407, 0
  br i1 %408, label %434, label %409

409:                                              ; preds = %383
  %410 = load ptr, ptr %37, align 8, !tbaa !5
  %411 = getelementptr inbounds %struct.aiFace, ptr %410, i32 0, i32 1
  %412 = load ptr, ptr %411, align 8, !tbaa !46
  %413 = load ptr, ptr %38, align 8, !tbaa !5
  %414 = getelementptr inbounds %struct.aiFace, ptr %413, i32 0, i32 1
  store ptr %412, ptr %414, align 8, !tbaa !46
  store ptr %412, ptr %40, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #10
  store i32 0, ptr %41, align 4, !tbaa !9
  br label %415

415:                                              ; preds = %430, %409
  %416 = load i32, ptr %41, align 4, !tbaa !9
  %417 = load i32, ptr %39, align 4, !tbaa !9
  %418 = icmp ult i32 %416, %417
  br i1 %418, label %420, label %419

419:                                              ; preds = %415
  store i32 21, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #10
  br label %433

420:                                              ; preds = %415
  %421 = load ptr, ptr %15, align 8, !tbaa !5
  %422 = getelementptr inbounds i32, ptr %421, i64 0
  %423 = load i32, ptr %422, align 4, !tbaa !9
  %424 = load ptr, ptr %40, align 8, !tbaa !5
  %425 = load i32, ptr %41, align 4, !tbaa !9
  %426 = zext i32 %425 to i64
  %427 = getelementptr inbounds i32, ptr %424, i64 %426
  %428 = load i32, ptr %427, align 4, !tbaa !9
  %429 = add i32 %428, %423
  store i32 %429, ptr %427, align 4, !tbaa !9
  br label %430

430:                                              ; preds = %420
  %431 = load i32, ptr %41, align 4, !tbaa !9
  %432 = add i32 %431, 1
  store i32 %432, ptr %41, align 4, !tbaa !9
  br label %415, !llvm.loop !47

433:                                              ; preds = %419
  br label %469

434:                                              ; preds = %383
  %435 = load i32, ptr %39, align 4, !tbaa !9
  %436 = zext i32 %435 to i64
  %437 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %436, i64 4)
  %438 = extractvalue { i64, i1 } %437, 1
  %439 = extractvalue { i64, i1 } %437, 0
  %440 = select i1 %438, i64 -1, i64 %439
  %441 = call noalias noundef nonnull ptr @_Znam(i64 noundef %440) #11
  %442 = load ptr, ptr %38, align 8, !tbaa !5
  %443 = getelementptr inbounds %struct.aiFace, ptr %442, i32 0, i32 1
  store ptr %441, ptr %443, align 8, !tbaa !46
  store ptr %441, ptr %40, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #10
  store i32 0, ptr %42, align 4, !tbaa !9
  br label %444

444:                                              ; preds = %465, %434
  %445 = load i32, ptr %42, align 4, !tbaa !9
  %446 = load i32, ptr %39, align 4, !tbaa !9
  %447 = icmp ult i32 %445, %446
  br i1 %447, label %449, label %448

448:                                              ; preds = %444
  store i32 24, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #10
  br label %468

449:                                              ; preds = %444
  %450 = load ptr, ptr %37, align 8, !tbaa !5
  %451 = getelementptr inbounds %struct.aiFace, ptr %450, i32 0, i32 1
  %452 = load ptr, ptr %451, align 8, !tbaa !46
  %453 = load i32, ptr %42, align 4, !tbaa !9
  %454 = zext i32 %453 to i64
  %455 = getelementptr inbounds i32, ptr %452, i64 %454
  %456 = load i32, ptr %455, align 4, !tbaa !9
  %457 = load ptr, ptr %15, align 8, !tbaa !5
  %458 = getelementptr inbounds i32, ptr %457, i64 0
  %459 = load i32, ptr %458, align 4, !tbaa !9
  %460 = add i32 %456, %459
  %461 = load ptr, ptr %40, align 8, !tbaa !5
  %462 = load i32, ptr %42, align 4, !tbaa !9
  %463 = zext i32 %462 to i64
  %464 = getelementptr inbounds i32, ptr %461, i64 %463
  store i32 %460, ptr %464, align 4, !tbaa !9
  br label %465

465:                                              ; preds = %449
  %466 = load i32, ptr %42, align 4, !tbaa !9
  %467 = add i32 %466, 1
  store i32 %467, ptr %42, align 4, !tbaa !9
  br label %444, !llvm.loop !48

468:                                              ; preds = %448
  br label %469

469:                                              ; preds = %468, %433
  %470 = load ptr, ptr %20, align 8, !tbaa !5
  %471 = getelementptr inbounds %struct.aiMesh, ptr %470, i32 0, i32 10
  %472 = load ptr, ptr %471, align 8, !tbaa !43
  %473 = load i32, ptr %36, align 4, !tbaa !9
  %474 = zext i32 %473 to i64
  %475 = getelementptr inbounds %struct.aiFace, ptr %472, i64 %474
  %476 = getelementptr inbounds %struct.aiFace, ptr %475, i32 0, i32 0
  %477 = load i32, ptr %476, align 8, !tbaa !44
  switch i32 %477, label %493 [
    i32 1, label %478
    i32 2, label %483
    i32 3, label %488
  ]

478:                                              ; preds = %469
  %479 = load ptr, ptr %14, align 8, !tbaa !5
  %480 = getelementptr inbounds %struct.aiMesh, ptr %479, i32 0, i32 0
  %481 = load i32, ptr %480, align 8, !tbaa !49
  %482 = or i32 %481, 1
  store i32 %482, ptr %480, align 8, !tbaa !49
  br label %498

483:                                              ; preds = %469
  %484 = load ptr, ptr %14, align 8, !tbaa !5
  %485 = getelementptr inbounds %struct.aiMesh, ptr %484, i32 0, i32 0
  %486 = load i32, ptr %485, align 8, !tbaa !49
  %487 = or i32 %486, 2
  store i32 %487, ptr %485, align 8, !tbaa !49
  br label %498

488:                                              ; preds = %469
  %489 = load ptr, ptr %14, align 8, !tbaa !5
  %490 = getelementptr inbounds %struct.aiMesh, ptr %489, i32 0, i32 0
  %491 = load i32, ptr %490, align 8, !tbaa !49
  %492 = or i32 %491, 4
  store i32 %492, ptr %490, align 8, !tbaa !49
  br label %498

493:                                              ; preds = %469
  %494 = load ptr, ptr %14, align 8, !tbaa !5
  %495 = getelementptr inbounds %struct.aiMesh, ptr %494, i32 0, i32 0
  %496 = load i32, ptr %495, align 8, !tbaa !49
  %497 = or i32 %496, 8
  store i32 %497, ptr %495, align 8, !tbaa !49
  br label %498

498:                                              ; preds = %493, %488, %483, %478
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #10
  br label %499

499:                                              ; preds = %498
  %500 = load i32, ptr %36, align 4, !tbaa !9
  %501 = add i32 %500, 1
  store i32 %501, ptr %36, align 4, !tbaa !9
  br label %376, !llvm.loop !50

502:                                              ; preds = %382
  %503 = load ptr, ptr %20, align 8, !tbaa !5
  %504 = getelementptr inbounds %struct.aiMesh, ptr %503, i32 0, i32 1
  %505 = load i32, ptr %504, align 4, !tbaa !29
  %506 = load ptr, ptr %15, align 8, !tbaa !5
  %507 = getelementptr inbounds i32, ptr %506, i64 0
  %508 = load i32, ptr %507, align 4, !tbaa !9
  %509 = add i32 %508, %505
  store i32 %509, ptr %507, align 4, !tbaa !9
  %510 = load ptr, ptr %20, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.aiMesh, ptr %510, i32 0, i32 2
  %512 = load i32, ptr %511, align 8, !tbaa !42
  %513 = load ptr, ptr %15, align 8, !tbaa !5
  %514 = getelementptr inbounds i32, ptr %513, i64 1
  %515 = load i32, ptr %514, align 4, !tbaa !9
  %516 = add i32 %515, %512
  store i32 %516, ptr %514, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #10
  br label %517

517:                                              ; preds = %502, %75, %56
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #10
  br label %518

518:                                              ; preds = %517
  %519 = load i32, ptr %18, align 4, !tbaa !9
  %520 = add i32 %519, 1
  store i32 %520, ptr %18, align 4, !tbaa !9
  br label %49, !llvm.loop !51

521:                                              ; preds = %55
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #10
  store i32 0, ptr %43, align 4, !tbaa !9
  br label %522

522:                                              ; preds = %543, %521
  %523 = load i32, ptr %43, align 4, !tbaa !9
  %524 = load ptr, ptr %11, align 8, !tbaa !5
  %525 = getelementptr inbounds %struct.aiNode, ptr %524, i32 0, i32 3
  %526 = load i32, ptr %525, align 8, !tbaa !52
  %527 = icmp ult i32 %523, %526
  br i1 %527, label %529, label %528

528:                                              ; preds = %522
  store i32 28, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #10
  br label %546

529:                                              ; preds = %522
  %530 = load ptr, ptr %10, align 8, !tbaa !5
  %531 = load ptr, ptr %11, align 8, !tbaa !5
  %532 = getelementptr inbounds %struct.aiNode, ptr %531, i32 0, i32 4
  %533 = load ptr, ptr %532, align 8, !tbaa !53
  %534 = load i32, ptr %43, align 4, !tbaa !9
  %535 = zext i32 %534 to i64
  %536 = getelementptr inbounds ptr, ptr %533, i64 %535
  %537 = load ptr, ptr %536, align 8, !tbaa !5
  %538 = load i32, ptr %12, align 4, !tbaa !9
  %539 = load i32, ptr %13, align 4, !tbaa !9
  %540 = load ptr, ptr %14, align 8, !tbaa !5
  %541 = load ptr, ptr %15, align 8, !tbaa !5
  %542 = load ptr, ptr %16, align 8, !tbaa !5
  call void @_ZNK6Assimp20PretransformVertices11CollectDataEPK7aiScenePK6aiNodejjP6aiMeshPjS9_(ptr noundef nonnull align 8 dereferenceable(93) %44, ptr noundef %530, ptr noundef %537, i32 noundef %538, i32 noundef %539, ptr noundef %540, ptr noundef %541, ptr noundef %542)
  br label %543

543:                                              ; preds = %529
  %544 = load i32, ptr %43, align 4, !tbaa !9
  %545 = add i32 %544, 1
  store i32 %545, ptr %43, align 4, !tbaa !9
  br label %522, !llvm.loop !54

546:                                              ; preds = %528
  call void @llvm.lifetime.end.p0(i64 1, ptr %17) #10
  ret void
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK12aiMatrix4x4tIfE10IsIdentityEf(ptr noundef nonnull align 4 dereferenceable(64), float noundef) #4 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(1028) ptr @_ZN8aiStringaSERKS_(ptr noundef nonnull align 4 dereferenceable(1028), ptr noundef nonnull align 4 dereferenceable(1028)) #6 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 4 dereferenceable(64) ptr @_ZN12aiMatrix4x4tIfE7InverseEv(ptr noundef nonnull align 4 dereferenceable(64)) #7 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN12aiMatrix3x3tIfEC2ERK12aiMatrix4x4tIfE(ptr noundef nonnull align 4 dereferenceable(36), ptr noundef nonnull align 4 dereferenceable(64)) unnamed_addr #4 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfE9NormalizeEv(ptr noundef nonnull align 4 dereferenceable(12)) #2 align 2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) #8

; Function Attrs: nobuiltin allocsize(0)
declare noundef nonnull ptr @_Znam(i64 noundef) #9

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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 #3 = { 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 #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 = { "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 = { 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 #8 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #9 = { nobuiltin allocsize(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 #10 = { nounwind }
attributes #11 = { builtin allocsize(0) }

!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, !12, i64 0}
!12 = !{!"bool", !7, i64 0}
!13 = !{!14, !10, i64 1120}
!14 = !{!"_ZTS6aiNode", !15, i64 0, !16, i64 1028, !6, i64 1096, !10, i64 1104, !6, i64 1112, !10, i64 1120, !6, i64 1128, !6, i64 1136}
!15 = !{!"_ZTS8aiString", !10, i64 0, !7, i64 4}
!16 = !{!"_ZTS12aiMatrix4x4tIfE", !17, i64 0, !17, i64 4, !17, i64 8, !17, i64 12, !17, i64 16, !17, i64 20, !17, i64 24, !17, i64 28, !17, i64 32, !17, i64 36, !17, i64 40, !17, i64 44, !17, i64 48, !17, i64 52, !17, i64 56, !17, i64 60}
!17 = !{!"float", !7, i64 0}
!18 = !{!19, !6, i64 24}
!19 = !{!"_ZTS7aiScene", !10, i64 0, !6, i64 8, !10, i64 16, !6, i64 24, !10, i64 32, !6, i64 40, !10, i64 48, !6, i64 56, !10, i64 64, !6, i64 72, !10, i64 80, !6, i64 88, !10, i64 96, !6, i64 104, !6, i64 112, !15, i64 120, !10, i64 1148, !6, i64 1152, !6, i64 1160}
!20 = !{!14, !6, i64 1128}
!21 = !{!22, !10, i64 232}
!22 = !{!"_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, !15, i64 236, !10, i64 1264, !6, i64 1272, !23, i64 1280, !24, i64 1284, !6, i64 1312}
!23 = !{!"_ZTS16aiMorphingMethod", !7, i64 0}
!24 = !{!"_ZTS6aiAABB", !25, i64 0, !25, i64 12}
!25 = !{!"_ZTS10aiVector3tIfE", !17, i64 0, !17, i64 4, !17, i64 8}
!26 = !{i8 0, i8 2}
!27 = !{}
!28 = !{!22, !6, i64 16}
!29 = !{!22, !10, i64 4}
!30 = !{!22, !6, i64 24}
!31 = !{!22, !6, i64 32}
!32 = !{!22, !6, i64 40}
!33 = !{i64 0, i64 4, !34, i64 4, i64 4, !34, i64 8, i64 4, !34}
!34 = !{!17, !17, i64 0}
!35 = distinct !{!35, !36}
!36 = !{!"llvm.loop.mustprogress"}
!37 = !{i64 0, i64 4, !34, i64 4, i64 4, !34, i64 8, i64 4, !34, i64 12, i64 4, !34, i64 16, i64 4, !34, i64 20, i64 4, !34, i64 24, i64 4, !34, i64 28, i64 4, !34, i64 32, i64 4, !34, i64 36, i64 4, !34, i64 40, i64 4, !34, i64 44, i64 4, !34, i64 48, i64 4, !34, i64 52, i64 4, !34, i64 56, i64 4, !34, i64 60, i64 4, !34}
!38 = distinct !{!38, !36}
!39 = distinct !{!39, !36}
!40 = distinct !{!40, !36}
!41 = distinct !{!41, !36}
!42 = !{!22, !10, i64 8}
!43 = !{!22, !6, i64 208}
!44 = !{!45, !10, i64 0}
!45 = !{!"_ZTS6aiFace", !10, i64 0, !6, i64 8}
!46 = !{!45, !6, i64 8}
!47 = distinct !{!47, !36}
!48 = distinct !{!48, !36}
!49 = !{!22, !10, i64 0}
!50 = distinct !{!50, !36}
!51 = distinct !{!51, !36}
!52 = !{!14, !10, i64 1104}
!53 = !{!14, !6, i64 1112}
!54 = distinct !{!54, !36}


; 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.aiMatrix4x4t = type { float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float }
%class.aiMatrix3x3t = type { float, float, float, float, float, float, float, float, float }
%class.aiVector3t = type { float, float, float }
%class.aiColor4t = type { float, float, float, float }
%struct.aiFace = type { i32, ptr }

@.str.5 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [129 x i8], align 1
@switch.table._ZNK6Assimp20PretransformVertices11CollectDataEPK7aiScenePK6aiNodejjP6aiMeshPjS9_ = private unnamed_addr constant [3 x i32] [i32 1, i32 2, i32 4], align 4

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

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

; Function Attrs: mustprogress uwtable
declare hidden noundef i32 @_ZN12_GLOBAL__N_114GetMeshVFormatEP6aiMesh(ptr noundef) local_unnamed_addr #2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZNK6Assimp20PretransformVertices11CollectDataEPK7aiScenePK6aiNodejjP6aiMeshPjS9_(ptr nocapture noundef nonnull readnone align 8 dereferenceable(93) %0, ptr nocapture noundef readonly %1, ptr noundef %2, i32 noundef %3, i32 noundef %4, ptr noundef %5, ptr nocapture noundef %6, ptr nocapture noundef %7) local_unnamed_addr #3 align 2 {
  %9 = alloca %class.aiMatrix4x4t, align 4
  %10 = alloca %class.aiMatrix3x3t, align 4
  %11 = alloca %class.aiVector3t, align 8
  %12 = alloca %class.aiVector3t, align 8
  %13 = alloca %class.aiVector3t, align 8
  %14 = getelementptr inbounds i8, ptr %2, i64 1028
  %15 = tail call noundef zeroext i1 @_ZNK12aiMatrix4x4tIfE10IsIdentityEf(ptr noundef nonnull align 4 dereferenceable(64) %14, float noundef 0x3F847AE140000000)
  %16 = getelementptr inbounds i8, ptr %2, i64 1120
  %17 = load i32, ptr %16, align 8, !tbaa !5
  %.not205 = icmp eq i32 %17, 0
  br i1 %.not205, label %.preheader, label %.lr.ph201

.lr.ph201:                                        ; preds = %8
  %18 = getelementptr inbounds i8, ptr %1, i64 24
  %19 = getelementptr inbounds i8, ptr %2, i64 1128
  %20 = getelementptr inbounds i8, ptr %5, i64 236
  %21 = getelementptr inbounds i8, ptr %5, i64 16
  %22 = and i32 %4, 2
  %.not162 = icmp eq i32 %22, 0
  %.sroa.247.0..sroa_idx = getelementptr inbounds i8, ptr %11, i64 8
  %23 = getelementptr inbounds i8, ptr %5, i64 24
  %24 = and i32 %4, 4
  %.not163 = icmp eq i32 %24, 0
  %.sroa.237.0..sroa_idx = getelementptr inbounds i8, ptr %12, i64 8
  %25 = getelementptr inbounds i8, ptr %5, i64 32
  %.sroa.2.0..sroa_idx = getelementptr inbounds i8, ptr %13, i64 8
  %26 = getelementptr inbounds i8, ptr %5, i64 40
  %27 = and i32 %4, 256
  %.not166183 = icmp eq i32 %27, 0
  %28 = getelementptr inbounds i8, ptr %5, i64 112
  %29 = and i32 %4, 16777216
  %.not167187 = icmp eq i32 %29, 0
  %30 = getelementptr inbounds i8, ptr %5, i64 48
  %31 = getelementptr inbounds i8, ptr %5, i64 208
  %32 = getelementptr inbounds i8, ptr %6, i64 4
  br label %36

.preheader:                                       ; preds = %304, %8
  %33 = getelementptr inbounds i8, ptr %2, i64 1104
  %34 = load i32, ptr %33, align 8, !tbaa !14
  %.not212 = icmp eq i32 %34, 0
  br i1 %.not212, label %._crit_edge204, label %.lr.ph203

.lr.ph203:                                        ; preds = %.preheader
  %35 = getelementptr inbounds i8, ptr %2, i64 1112
  br label %308

36:                                               ; preds = %.lr.ph201, %304
  %indvars.iv232 = phi i64 [ 0, %.lr.ph201 ], [ %indvars.iv.next233, %304 ]
  %37 = load ptr, ptr %18, align 8, !tbaa !15
  %38 = load ptr, ptr %19, align 8, !tbaa !17
  %39 = getelementptr inbounds i32, ptr %38, i64 %indvars.iv232
  %40 = load i32, ptr %39, align 4, !tbaa !18
  %41 = zext i32 %40 to i64
  %42 = getelementptr inbounds ptr, ptr %37, i64 %41
  %43 = load ptr, ptr %42, align 8, !tbaa !19
  %44 = getelementptr inbounds i8, ptr %43, i64 232
  %45 = load i32, ptr %44, align 8, !tbaa !20
  %46 = icmp eq i32 %45, %3
  br i1 %46, label %47, label %304

47:                                               ; preds = %36
  %48 = call noundef i32 @_ZN12_GLOBAL__N_114GetMeshVFormatEP6aiMesh(ptr noundef nonnull %43)
  %49 = icmp eq i32 %48, %4
  br i1 %49, label %50, label %304

50:                                               ; preds = %47
  %51 = load ptr, ptr %19, align 8, !tbaa !17
  %52 = getelementptr inbounds i32, ptr %51, i64 %indvars.iv232
  %53 = load i32, ptr %52, align 4, !tbaa !18
  %54 = zext i32 %53 to i64
  %55 = getelementptr inbounds i32, ptr %7, i64 %54
  %56 = load i32, ptr %55, align 4, !tbaa !18
  %.not = icmp eq i32 %56, 0
  br i1 %.not, label %57, label %58

57:                                               ; preds = %50
  call void @_ZN6Assimp17aiAssertViolationEPKcS1_i(ptr noundef nonnull @.str.5, ptr noundef nonnull @.str.6, i32 noundef 154)
  %.pre = load i32, ptr %55, align 4, !tbaa !18
  br label %58

58:                                               ; preds = %57, %50
  %59 = phi i32 [ %.pre, %57 ], [ %56, %50 ]
  %60 = add i32 %59, -1
  store i32 %60, ptr %55, align 4, !tbaa !18
  %61 = icmp eq i32 %60, 0
  br i1 %61, label %62, label %65

62:                                               ; preds = %58
  %63 = getelementptr inbounds i8, ptr %43, i64 236
  %64 = call noundef nonnull align 4 dereferenceable(1028) ptr @_ZN8aiStringaSERKS_(ptr noundef nonnull align 4 dereferenceable(1028) %20, ptr noundef nonnull align 4 dereferenceable(1028) %63)
  br label %65

65:                                               ; preds = %62, %58
  br i1 %15, label %69, label %.preheader176

.preheader176:                                    ; preds = %65
  %66 = getelementptr inbounds i8, ptr %43, i64 4
  %67 = load i32, ptr %66, align 4, !tbaa !25
  %.not206 = icmp eq i32 %67, 0
  br i1 %.not206, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader176
  %68 = getelementptr inbounds i8, ptr %43, i64 16
  br label %114

69:                                               ; preds = %65
  %70 = load ptr, ptr %21, align 8, !tbaa !26
  %71 = load i32, ptr %6, align 4, !tbaa !18
  %72 = zext i32 %71 to i64
  %73 = getelementptr inbounds %class.aiVector3t, ptr %70, i64 %72
  %74 = getelementptr inbounds i8, ptr %43, i64 16
  %75 = load ptr, ptr %74, align 8, !tbaa !26
  %76 = getelementptr inbounds i8, ptr %43, i64 4
  %77 = load i32, ptr %76, align 4, !tbaa !25
  %78 = zext i32 %77 to i64
  %79 = mul nuw nsw i64 %78, 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %75, i64 %79, i1 false)
  br i1 %.not162, label %90, label %80

80:                                               ; preds = %69
  %81 = load ptr, ptr %23, align 8, !tbaa !27
  %82 = load i32, ptr %6, align 4, !tbaa !18
  %83 = zext i32 %82 to i64
  %84 = getelementptr inbounds %class.aiVector3t, ptr %81, i64 %83
  %85 = getelementptr inbounds i8, ptr %43, i64 24
  %86 = load ptr, ptr %85, align 8, !tbaa !27
  %87 = load i32, ptr %76, align 4, !tbaa !25
  %88 = zext i32 %87 to i64
  %89 = mul nuw nsw i64 %88, 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %84, ptr align 4 %86, i64 %89, i1 false)
  br label %90

90:                                               ; preds = %80, %69
  br i1 %.not163, label %167, label %91

91:                                               ; preds = %90
  %92 = load ptr, ptr %25, align 8, !tbaa !28
  %93 = load i32, ptr %6, align 4, !tbaa !18
  %94 = zext i32 %93 to i64
  %95 = getelementptr inbounds %class.aiVector3t, ptr %92, i64 %94
  %96 = getelementptr inbounds i8, ptr %43, i64 32
  %97 = load ptr, ptr %96, align 8, !tbaa !28
  %98 = load i32, ptr %76, align 4, !tbaa !25
  %99 = zext i32 %98 to i64
  %100 = mul nuw nsw i64 %99, 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %95, ptr align 4 %97, i64 %100, i1 false)
  %101 = load ptr, ptr %26, align 8, !tbaa !29
  %102 = load i32, ptr %6, align 4, !tbaa !18
  %103 = zext i32 %102 to i64
  %104 = getelementptr inbounds %class.aiVector3t, ptr %101, i64 %103
  %105 = getelementptr inbounds i8, ptr %43, i64 40
  %106 = load ptr, ptr %105, align 8, !tbaa !29
  %107 = load i32, ptr %76, align 4, !tbaa !25
  %108 = zext i32 %107 to i64
  %109 = mul nuw nsw i64 %108, 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %104, ptr align 4 %106, i64 %109, i1 false)
  br label %167

._crit_edge:                                      ; preds = %114, %.preheader176
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %9) #9
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(64) %9, ptr noundef nonnull align 4 dereferenceable(64) %14, i64 64, i1 false), !tbaa.struct !30
  %110 = call noundef nonnull align 4 dereferenceable(64) ptr @_ZN12aiMatrix4x4tIfE7InverseEv(ptr noundef nonnull align 4 dereferenceable(64) %9)
  %111 = call noundef nonnull align 4 dereferenceable(64) ptr @_ZN12aiMatrix4x4tIfE9TransposeEv(ptr noundef nonnull align 4 dereferenceable(64) %110)
  call void @llvm.lifetime.start.p0(i64 36, ptr nonnull %10) #9
  call void @_ZN12aiMatrix3x3tIfEC2ERK12aiMatrix4x4tIfE(ptr noundef nonnull align 4 dereferenceable(36) %10, ptr noundef nonnull align 4 dereferenceable(64) %9)
  br i1 %.not162, label %.loopexit175, label %.preheader174

.preheader174:                                    ; preds = %._crit_edge
  %112 = load i32, ptr %66, align 4, !tbaa !25
  %.not207 = icmp eq i32 %112, 0
  br i1 %.not207, label %.loopexit175, label %.lr.ph180

.lr.ph180:                                        ; preds = %.preheader174
  %113 = getelementptr inbounds i8, ptr %43, i64 24
  br label %127

114:                                              ; preds = %.lr.ph, %114
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %114 ]
  %115 = load ptr, ptr %68, align 8, !tbaa !26
  %116 = getelementptr inbounds %class.aiVector3t, ptr %115, i64 %indvars.iv
  %117 = call { <2 x float>, float } @_ZmlIfE10aiVector3tIT_ERK12aiMatrix4x4tIS1_ERKS2_(ptr noundef nonnull align 4 dereferenceable(64) %14, ptr noundef nonnull align 4 dereferenceable(12) %116)
  %.fca.0.extract52 = extractvalue { <2 x float>, float } %117, 0
  %.fca.1.extract53 = extractvalue { <2 x float>, float } %117, 1
  %118 = load ptr, ptr %21, align 8, !tbaa !26
  %119 = load i32, ptr %6, align 4, !tbaa !18
  %120 = trunc nuw i64 %indvars.iv to i32
  %121 = add i32 %119, %120
  %122 = zext i32 %121 to i64
  %123 = getelementptr inbounds %class.aiVector3t, ptr %118, i64 %122
  store <2 x float> %.fca.0.extract52, ptr %123, align 4
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %123, i64 8
  store float %.fca.1.extract53, ptr %.sroa.4.0..sroa_idx, align 4, !tbaa !31
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %124 = load i32, ptr %66, align 4, !tbaa !25
  %125 = zext i32 %124 to i64
  %126 = icmp ult i64 %indvars.iv.next, %125
  br i1 %126, label %114, label %._crit_edge, !llvm.loop !32

127:                                              ; preds = %.lr.ph180, %127
  %indvars.iv215 = phi i64 [ 0, %.lr.ph180 ], [ %indvars.iv.next216, %127 ]
  call void @llvm.lifetime.start.p0(i64 12, ptr nonnull %11) #9
  %128 = load ptr, ptr %113, align 8, !tbaa !27
  %129 = getelementptr inbounds %class.aiVector3t, ptr %128, i64 %indvars.iv215
  %130 = call { <2 x float>, float } @_ZmlIfE10aiVector3tIT_ERK12aiMatrix3x3tIS1_ERKS2_(ptr noundef nonnull align 4 dereferenceable(36) %10, ptr noundef nonnull align 4 dereferenceable(12) %129)
  %.fca.0.extract44 = extractvalue { <2 x float>, float } %130, 0
  %.fca.1.extract45 = extractvalue { <2 x float>, float } %130, 1
  store <2 x float> %.fca.0.extract44, ptr %11, align 8
  store float %.fca.1.extract45, ptr %.sroa.247.0..sroa_idx, align 8
  %131 = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfE9NormalizeEv(ptr noundef nonnull align 4 dereferenceable(12) %11)
  %132 = load ptr, ptr %23, align 8, !tbaa !27
  %133 = load i32, ptr %6, align 4, !tbaa !18
  %134 = trunc nuw i64 %indvars.iv215 to i32
  %135 = add i32 %133, %134
  %136 = zext i32 %135 to i64
  %137 = getelementptr inbounds %class.aiVector3t, ptr %132, i64 %136
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(12) %137, ptr noundef nonnull align 4 dereferenceable(12) %131, i64 12, i1 false), !tbaa.struct !34
  call void @llvm.lifetime.end.p0(i64 12, ptr nonnull %11) #9
  %indvars.iv.next216 = add nuw nsw i64 %indvars.iv215, 1
  %138 = load i32, ptr %66, align 4, !tbaa !25
  %139 = zext i32 %138 to i64
  %140 = icmp ult i64 %indvars.iv.next216, %139
  br i1 %140, label %127, label %.loopexit175, !llvm.loop !35

.loopexit175:                                     ; preds = %127, %.preheader174, %._crit_edge
  br i1 %.not163, label %.loopexit173, label %.preheader172

.preheader172:                                    ; preds = %.loopexit175
  %141 = load i32, ptr %66, align 4, !tbaa !25
  %.not208 = icmp eq i32 %141, 0
  br i1 %.not208, label %.loopexit173, label %.lr.ph182

.lr.ph182:                                        ; preds = %.preheader172
  %142 = getelementptr inbounds i8, ptr %43, i64 32
  %143 = getelementptr inbounds i8, ptr %43, i64 40
  br label %144

144:                                              ; preds = %.lr.ph182, %144
  %indvars.iv218 = phi i64 [ 0, %.lr.ph182 ], [ %indvars.iv.next219, %144 ]
  call void @llvm.lifetime.start.p0(i64 12, ptr nonnull %12) #9
  %145 = load ptr, ptr %142, align 8, !tbaa !28
  %146 = getelementptr inbounds %class.aiVector3t, ptr %145, i64 %indvars.iv218
  %147 = call { <2 x float>, float } @_ZmlIfE10aiVector3tIT_ERK12aiMatrix3x3tIS1_ERKS2_(ptr noundef nonnull align 4 dereferenceable(36) %10, ptr noundef nonnull align 4 dereferenceable(12) %146)
  %.fca.0.extract34 = extractvalue { <2 x float>, float } %147, 0
  %.fca.1.extract35 = extractvalue { <2 x float>, float } %147, 1
  store <2 x float> %.fca.0.extract34, ptr %12, align 8
  store float %.fca.1.extract35, ptr %.sroa.237.0..sroa_idx, align 8
  %148 = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfE9NormalizeEv(ptr noundef nonnull align 4 dereferenceable(12) %12)
  %149 = load ptr, ptr %25, align 8, !tbaa !28
  %150 = load i32, ptr %6, align 4, !tbaa !18
  %151 = trunc nuw i64 %indvars.iv218 to i32
  %152 = add i32 %150, %151
  %153 = zext i32 %152 to i64
  %154 = getelementptr inbounds %class.aiVector3t, ptr %149, i64 %153
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(12) %154, ptr noundef nonnull align 4 dereferenceable(12) %148, i64 12, i1 false), !tbaa.struct !34
  call void @llvm.lifetime.end.p0(i64 12, ptr nonnull %12) #9
  call void @llvm.lifetime.start.p0(i64 12, ptr nonnull %13) #9
  %155 = load ptr, ptr %143, align 8, !tbaa !29
  %156 = getelementptr inbounds %class.aiVector3t, ptr %155, i64 %indvars.iv218
  %157 = call { <2 x float>, float } @_ZmlIfE10aiVector3tIT_ERK12aiMatrix3x3tIS1_ERKS2_(ptr noundef nonnull align 4 dereferenceable(36) %10, ptr noundef nonnull align 4 dereferenceable(12) %156)
  %.fca.0.extract = extractvalue { <2 x float>, float } %157, 0
  %.fca.1.extract = extractvalue { <2 x float>, float } %157, 1
  store <2 x float> %.fca.0.extract, ptr %13, align 8
  store float %.fca.1.extract, ptr %.sroa.2.0..sroa_idx, align 8
  %158 = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfE9NormalizeEv(ptr noundef nonnull align 4 dereferenceable(12) %13)
  %159 = load ptr, ptr %26, align 8, !tbaa !29
  %160 = load i32, ptr %6, align 4, !tbaa !18
  %161 = add i32 %160, %151
  %162 = zext i32 %161 to i64
  %163 = getelementptr inbounds %class.aiVector3t, ptr %159, i64 %162
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(12) %163, ptr noundef nonnull align 4 dereferenceable(12) %158, i64 12, i1 false), !tbaa.struct !34
  call void @llvm.lifetime.end.p0(i64 12, ptr nonnull %13) #9
  %indvars.iv.next219 = add nuw nsw i64 %indvars.iv218, 1
  %164 = load i32, ptr %66, align 4, !tbaa !25
  %165 = zext i32 %164 to i64
  %166 = icmp ult i64 %indvars.iv.next219, %165
  br i1 %166, label %144, label %.loopexit173, !llvm.loop !36

.loopexit173:                                     ; preds = %144, %.preheader172, %.loopexit175
  call void @llvm.lifetime.end.p0(i64 36, ptr nonnull %10) #9
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %9) #9
  br label %167

167:                                              ; preds = %90, %91, %.loopexit173
  br i1 %.not166183, label %.preheader171, label %.lr.ph186

.lr.ph186:                                        ; preds = %167
  %168 = getelementptr inbounds i8, ptr %43, i64 112
  %169 = getelementptr inbounds i8, ptr %43, i64 4
  br label %172

.preheader171:                                    ; preds = %172, %167
  br i1 %.not167187, label %.preheader170, label %.lr.ph189

.lr.ph189:                                        ; preds = %.preheader171
  %170 = getelementptr inbounds i8, ptr %43, i64 48
  %171 = getelementptr inbounds i8, ptr %43, i64 4
  br label %191

172:                                              ; preds = %.lr.ph186, %172
  %.0158184 = phi i32 [ 0, %.lr.ph186 ], [ %184, %172 ]
  %173 = zext i32 %.0158184 to i64
  %174 = getelementptr inbounds [8 x ptr], ptr %28, i64 0, i64 %173
  %175 = load ptr, ptr %174, align 8, !tbaa !19
  %176 = load i32, ptr %6, align 4, !tbaa !18
  %177 = zext i32 %176 to i64
  %178 = getelementptr inbounds %class.aiVector3t, ptr %175, i64 %177
  %179 = getelementptr inbounds [8 x ptr], ptr %168, i64 0, i64 %173
  %180 = load ptr, ptr %179, align 8, !tbaa !19
  %181 = load i32, ptr %169, align 4, !tbaa !25
  %182 = zext i32 %181 to i64
  %183 = mul nuw nsw i64 %182, 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %178, ptr align 4 %180, i64 %183, i1 false)
  %184 = add i32 %.0158184, 1
  %185 = shl i32 256, %184
  %186 = and i32 %185, %4
  %.not166 = icmp eq i32 %186, 0
  br i1 %.not166, label %.preheader171, label %172, !llvm.loop !37

.preheader170:                                    ; preds = %191, %.preheader171
  %187 = getelementptr inbounds i8, ptr %43, i64 8
  %188 = load i32, ptr %187, align 8, !tbaa !38
  %.not209 = icmp eq i32 %188, 0
  br i1 %.not209, label %._crit_edge198, label %.lr.ph197

.lr.ph197:                                        ; preds = %.preheader170
  %189 = getelementptr inbounds i8, ptr %43, i64 208
  %190 = load ptr, ptr %31, align 8, !tbaa !39
  %.pre238 = load ptr, ptr %189, align 8, !tbaa !39
  br label %213

191:                                              ; preds = %.lr.ph189, %191
  %.1188 = phi i32 [ 0, %.lr.ph189 ], [ %203, %191 ]
  %192 = zext i32 %.1188 to i64
  %193 = getelementptr inbounds [8 x ptr], ptr %30, i64 0, i64 %192
  %194 = load ptr, ptr %193, align 8, !tbaa !19
  %195 = load i32, ptr %6, align 4, !tbaa !18
  %196 = zext i32 %195 to i64
  %197 = getelementptr inbounds %class.aiColor4t, ptr %194, i64 %196
  %198 = getelementptr inbounds [8 x ptr], ptr %170, i64 0, i64 %192
  %199 = load ptr, ptr %198, align 8, !tbaa !19
  %200 = load i32, ptr %171, align 4, !tbaa !25
  %201 = zext i32 %200 to i64
  %202 = shl nuw nsw i64 %201, 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %197, ptr align 4 %199, i64 %202, i1 false)
  %203 = add i32 %.1188, 1
  %204 = shl i32 16777216, %203
  %205 = and i32 %204, %4
  %.not167 = icmp eq i32 %205, 0
  br i1 %.not167, label %.preheader170, label %191, !llvm.loop !40

._crit_edge198:                                   ; preds = %299, %.preheader170
  %206 = getelementptr inbounds i8, ptr %43, i64 4
  %207 = load i32, ptr %206, align 4, !tbaa !25
  %208 = load i32, ptr %6, align 4, !tbaa !18
  %209 = add i32 %208, %207
  store i32 %209, ptr %6, align 4, !tbaa !18
  %210 = load i32, ptr %187, align 8, !tbaa !38
  %211 = load i32, ptr %32, align 4, !tbaa !18
  %212 = add i32 %211, %210
  store i32 %212, ptr %32, align 4, !tbaa !18
  br label %304

213:                                              ; preds = %.lr.ph197, %299
  %214 = phi ptr [ %.pre238, %.lr.ph197 ], [ %293, %299 ]
  %indvars.iv229 = phi i64 [ 0, %.lr.ph197 ], [ %indvars.iv.next230, %299 ]
  %215 = getelementptr inbounds %struct.aiFace, ptr %214, i64 %indvars.iv229
  %216 = load i32, ptr %32, align 4, !tbaa !18
  %217 = trunc nuw i64 %indvars.iv229 to i32
  %218 = add i32 %216, %217
  %219 = zext i32 %218 to i64
  %220 = getelementptr inbounds %struct.aiFace, ptr %190, i64 %219
  %221 = load i32, ptr %215, align 8, !tbaa !41
  store i32 %221, ptr %220, align 8, !tbaa !41
  %222 = load i32, ptr %55, align 4, !tbaa !18
  %.not168 = icmp eq i32 %222, 0
  br i1 %.not168, label %223, label %253

223:                                              ; preds = %213
  %224 = getelementptr inbounds i8, ptr %215, i64 8
  %225 = load ptr, ptr %224, align 8, !tbaa !43
  %226 = getelementptr inbounds i8, ptr %220, i64 8
  store ptr %225, ptr %226, align 8, !tbaa !43
  %.not211 = icmp eq i32 %221, 0
  br i1 %.not211, label %.loopexit, label %.lr.ph195.preheader

.lr.ph195.preheader:                              ; preds = %223
  %wide.trip.count227 = zext i32 %221 to i64
  %min.iters.check = icmp ult i32 %221, 8
  br i1 %min.iters.check, label %.lr.ph195.preheader260, label %vector.memcheck

vector.memcheck:                                  ; preds = %.lr.ph195.preheader
  %227 = shl nuw nsw i64 %wide.trip.count227, 2
  %scevgep = getelementptr i8, ptr %225, i64 %227
  %bound0 = icmp ult ptr %225, %32
  %bound1 = icmp ugt ptr %scevgep, %6
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph195.preheader260, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %wide.trip.count227, 4294967288
  %228 = load i32, ptr %6, align 4, !tbaa !18, !alias.scope !44
  %broadcast.splatinsert243 = insertelement <4 x i32> poison, i32 %228, i64 0
  %broadcast.splat244 = shufflevector <4 x i32> %broadcast.splatinsert243, <4 x i32> poison, <4 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %229 = getelementptr inbounds i32, ptr %225, i64 %index
  %230 = getelementptr inbounds i8, ptr %229, i64 16
  %wide.load = load <4 x i32>, ptr %229, align 4, !tbaa !18, !alias.scope !47, !noalias !44
  %wide.load242 = load <4 x i32>, ptr %230, align 4, !tbaa !18, !alias.scope !47, !noalias !44
  %231 = add <4 x i32> %wide.load, %broadcast.splat244
  %232 = add <4 x i32> %wide.load242, %broadcast.splat244
  store <4 x i32> %231, ptr %229, align 4, !tbaa !18, !alias.scope !47, !noalias !44
  store <4 x i32> %232, ptr %230, align 4, !tbaa !18, !alias.scope !47, !noalias !44
  %index.next = add nuw i64 %index, 8
  %233 = icmp eq i64 %index.next, %n.vec
  br i1 %233, label %middle.block, label %vector.body, !llvm.loop !49

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count227
  br i1 %cmp.n, label %.loopexit, label %.lr.ph195.preheader260

.lr.ph195.preheader260:                           ; preds = %middle.block, %vector.memcheck, %.lr.ph195.preheader
  %indvars.iv224.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %.lr.ph195.preheader ], [ %n.vec, %middle.block ]
  %xtraiter262 = and i64 %wide.trip.count227, 3
  %lcmp.mod263.not = icmp eq i64 %xtraiter262, 0
  br i1 %lcmp.mod263.not, label %.lr.ph195.prol.loopexit, label %.lr.ph195.prol

.lr.ph195.prol:                                   ; preds = %.lr.ph195.preheader260, %.lr.ph195.prol
  %indvars.iv224.prol = phi i64 [ %indvars.iv.next225.prol, %.lr.ph195.prol ], [ %indvars.iv224.ph, %.lr.ph195.preheader260 ]
  %prol.iter264 = phi i64 [ %prol.iter264.next, %.lr.ph195.prol ], [ 0, %.lr.ph195.preheader260 ]
  %234 = load i32, ptr %6, align 4, !tbaa !18
  %235 = getelementptr inbounds i32, ptr %225, i64 %indvars.iv224.prol
  %236 = load i32, ptr %235, align 4, !tbaa !18
  %237 = add i32 %236, %234
  store i32 %237, ptr %235, align 4, !tbaa !18
  %indvars.iv.next225.prol = add nuw nsw i64 %indvars.iv224.prol, 1
  %prol.iter264.next = add i64 %prol.iter264, 1
  %prol.iter264.cmp.not = icmp eq i64 %prol.iter264.next, %xtraiter262
  br i1 %prol.iter264.cmp.not, label %.lr.ph195.prol.loopexit, label %.lr.ph195.prol, !llvm.loop !52

.lr.ph195.prol.loopexit:                          ; preds = %.lr.ph195.prol, %.lr.ph195.preheader260
  %indvars.iv224.unr = phi i64 [ %indvars.iv224.ph, %.lr.ph195.preheader260 ], [ %indvars.iv.next225.prol, %.lr.ph195.prol ]
  %238 = sub nsw i64 %indvars.iv224.ph, %wide.trip.count227
  %239 = icmp ugt i64 %238, -4
  br i1 %239, label %.loopexit, label %.lr.ph195.preheader260.new

.lr.ph195.preheader260.new:                       ; preds = %.lr.ph195.prol.loopexit
  %invariant.gep = getelementptr i8, ptr %225, i64 4
  %invariant.gep265 = getelementptr i8, ptr %225, i64 8
  %invariant.gep267 = getelementptr i8, ptr %225, i64 12
  br label %.lr.ph195

.lr.ph195:                                        ; preds = %.lr.ph195, %.lr.ph195.preheader260.new
  %indvars.iv224 = phi i64 [ %indvars.iv224.unr, %.lr.ph195.preheader260.new ], [ %indvars.iv.next225.3, %.lr.ph195 ]
  %240 = load i32, ptr %6, align 4, !tbaa !18
  %241 = getelementptr inbounds i32, ptr %225, i64 %indvars.iv224
  %242 = load i32, ptr %241, align 4, !tbaa !18
  %243 = add i32 %242, %240
  store i32 %243, ptr %241, align 4, !tbaa !18
  %244 = load i32, ptr %6, align 4, !tbaa !18
  %gep = getelementptr i32, ptr %invariant.gep, i64 %indvars.iv224
  %245 = load i32, ptr %gep, align 4, !tbaa !18
  %246 = add i32 %245, %244
  store i32 %246, ptr %gep, align 4, !tbaa !18
  %247 = load i32, ptr %6, align 4, !tbaa !18
  %gep266 = getelementptr i32, ptr %invariant.gep265, i64 %indvars.iv224
  %248 = load i32, ptr %gep266, align 4, !tbaa !18
  %249 = add i32 %248, %247
  store i32 %249, ptr %gep266, align 4, !tbaa !18
  %250 = load i32, ptr %6, align 4, !tbaa !18
  %gep268 = getelementptr i32, ptr %invariant.gep267, i64 %indvars.iv224
  %251 = load i32, ptr %gep268, align 4, !tbaa !18
  %252 = add i32 %251, %250
  store i32 %252, ptr %gep268, align 4, !tbaa !18
  %indvars.iv.next225.3 = add nuw nsw i64 %indvars.iv224, 4
  %exitcond228.not.3 = icmp eq i64 %indvars.iv.next225.3, %wide.trip.count227
  br i1 %exitcond228.not.3, label %.loopexit, label %.lr.ph195, !llvm.loop !54

253:                                              ; preds = %213
  %254 = zext i32 %221 to i64
  %255 = shl nuw nsw i64 %254, 2
  %256 = call noalias noundef nonnull ptr @_Znam(i64 noundef %255) #10
  %257 = getelementptr inbounds i8, ptr %220, i64 8
  store ptr %256, ptr %257, align 8, !tbaa !43
  %.not210 = icmp eq i32 %221, 0
  br i1 %.not210, label %.loopexit, label %.lr.ph192

.lr.ph192:                                        ; preds = %253
  %258 = ptrtoint ptr %256 to i64
  %259 = getelementptr inbounds i8, ptr %215, i64 8
  %260 = load ptr, ptr %259, align 8, !tbaa !43
  %261 = load i32, ptr %6, align 4, !tbaa !18
  %min.iters.check248 = icmp ult i32 %221, 8
  %262 = ptrtoint ptr %260 to i64
  %263 = sub i64 %258, %262
  %diff.check = icmp ult i64 %263, 32
  %or.cond = select i1 %min.iters.check248, i1 true, i1 %diff.check
  br i1 %or.cond, label %scalar.ph247.preheader, label %vector.ph249

vector.ph249:                                     ; preds = %.lr.ph192
  %n.vec251 = and i64 %254, 4294967288
  %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %261, i64 0
  %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer
  br label %vector.body253

vector.body253:                                   ; preds = %vector.body253, %vector.ph249
  %index254 = phi i64 [ 0, %vector.ph249 ], [ %index.next257, %vector.body253 ]
  %264 = getelementptr inbounds i32, ptr %260, i64 %index254
  %265 = getelementptr inbounds i8, ptr %264, i64 16
  %wide.load255 = load <4 x i32>, ptr %264, align 4, !tbaa !18
  %wide.load256 = load <4 x i32>, ptr %265, align 4, !tbaa !18
  %266 = add <4 x i32> %broadcast.splat, %wide.load255
  %267 = add <4 x i32> %broadcast.splat, %wide.load256
  %268 = getelementptr inbounds i32, ptr %256, i64 %index254
  %269 = getelementptr inbounds i8, ptr %268, i64 16
  store <4 x i32> %266, ptr %268, align 4, !tbaa !18
  store <4 x i32> %267, ptr %269, align 4, !tbaa !18
  %index.next257 = add nuw i64 %index254, 8
  %270 = icmp eq i64 %index.next257, %n.vec251
  br i1 %270, label %middle.block246, label %vector.body253, !llvm.loop !55

middle.block246:                                  ; preds = %vector.body253
  %cmp.n258 = icmp eq i64 %n.vec251, %254
  br i1 %cmp.n258, label %.loopexit, label %scalar.ph247.preheader

scalar.ph247.preheader:                           ; preds = %middle.block246, %.lr.ph192
  %indvars.iv221.ph = phi i64 [ 0, %.lr.ph192 ], [ %n.vec251, %middle.block246 ]
  %xtraiter = and i64 %254, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %scalar.ph247.prol.loopexit, label %scalar.ph247.prol

scalar.ph247.prol:                                ; preds = %scalar.ph247.preheader, %scalar.ph247.prol
  %indvars.iv221.prol = phi i64 [ %indvars.iv.next222.prol, %scalar.ph247.prol ], [ %indvars.iv221.ph, %scalar.ph247.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph247.prol ], [ 0, %scalar.ph247.preheader ]
  %271 = getelementptr inbounds i32, ptr %260, i64 %indvars.iv221.prol
  %272 = load i32, ptr %271, align 4, !tbaa !18
  %273 = add i32 %261, %272
  %274 = getelementptr inbounds i32, ptr %256, i64 %indvars.iv221.prol
  store i32 %273, ptr %274, align 4, !tbaa !18
  %indvars.iv.next222.prol = add nuw nsw i64 %indvars.iv221.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %scalar.ph247.prol.loopexit, label %scalar.ph247.prol, !llvm.loop !56

scalar.ph247.prol.loopexit:                       ; preds = %scalar.ph247.prol, %scalar.ph247.preheader
  %indvars.iv221.unr = phi i64 [ %indvars.iv221.ph, %scalar.ph247.preheader ], [ %indvars.iv.next222.prol, %scalar.ph247.prol ]
  %275 = sub nsw i64 %indvars.iv221.ph, %254
  %276 = icmp ugt i64 %275, -4
  br i1 %276, label %.loopexit, label %scalar.ph247

scalar.ph247:                                     ; preds = %scalar.ph247.prol.loopexit, %scalar.ph247
  %indvars.iv221 = phi i64 [ %indvars.iv.next222.3, %scalar.ph247 ], [ %indvars.iv221.unr, %scalar.ph247.prol.loopexit ]
  %277 = getelementptr inbounds i32, ptr %260, i64 %indvars.iv221
  %278 = load i32, ptr %277, align 4, !tbaa !18
  %279 = add i32 %261, %278
  %280 = getelementptr inbounds i32, ptr %256, i64 %indvars.iv221
  store i32 %279, ptr %280, align 4, !tbaa !18
  %indvars.iv.next222 = add nuw nsw i64 %indvars.iv221, 1
  %281 = getelementptr inbounds i32, ptr %260, i64 %indvars.iv.next222
  %282 = load i32, ptr %281, align 4, !tbaa !18
  %283 = add i32 %261, %282
  %284 = getelementptr inbounds i32, ptr %256, i64 %indvars.iv.next222
  store i32 %283, ptr %284, align 4, !tbaa !18
  %indvars.iv.next222.1 = add nuw nsw i64 %indvars.iv221, 2
  %285 = getelementptr inbounds i32, ptr %260, i64 %indvars.iv.next222.1
  %286 = load i32, ptr %285, align 4, !tbaa !18
  %287 = add i32 %261, %286
  %288 = getelementptr inbounds i32, ptr %256, i64 %indvars.iv.next222.1
  store i32 %287, ptr %288, align 4, !tbaa !18
  %indvars.iv.next222.2 = add nuw nsw i64 %indvars.iv221, 3
  %289 = getelementptr inbounds i32, ptr %260, i64 %indvars.iv.next222.2
  %290 = load i32, ptr %289, align 4, !tbaa !18
  %291 = add i32 %261, %290
  %292 = getelementptr inbounds i32, ptr %256, i64 %indvars.iv.next222.2
  store i32 %291, ptr %292, align 4, !tbaa !18
  %indvars.iv.next222.3 = add nuw nsw i64 %indvars.iv221, 4
  %exitcond.not.3 = icmp eq i64 %indvars.iv.next222.3, %254
  br i1 %exitcond.not.3, label %.loopexit, label %scalar.ph247, !llvm.loop !57

.loopexit:                                        ; preds = %scalar.ph247.prol.loopexit, %scalar.ph247, %.lr.ph195.prol.loopexit, %.lr.ph195, %middle.block246, %middle.block, %253, %223
  %293 = load ptr, ptr %189, align 8, !tbaa !39
  %294 = getelementptr inbounds %struct.aiFace, ptr %293, i64 %indvars.iv229
  %295 = load i32, ptr %294, align 8, !tbaa !41
  %296 = load i32, ptr %5, align 8, !tbaa !58
  %switch.tableidx = add i32 %295, -1
  %297 = icmp ult i32 %switch.tableidx, 3
  br i1 %297, label %switch.lookup, label %299

switch.lookup:                                    ; preds = %.loopexit
  %298 = zext nneg i32 %switch.tableidx to i64
  %switch.gep = getelementptr inbounds [3 x i32], ptr @switch.table._ZNK6Assimp20PretransformVertices11CollectDataEPK7aiScenePK6aiNodejjP6aiMeshPjS9_, i64 0, i64 %298
  %switch.load = load i32, ptr %switch.gep, align 4
  br label %299

299:                                              ; preds = %.loopexit, %switch.lookup
  %.sink240 = phi i32 [ %switch.load, %switch.lookup ], [ 8, %.loopexit ]
  %300 = or i32 %296, %.sink240
  store i32 %300, ptr %5, align 8, !tbaa !58
  %indvars.iv.next230 = add nuw nsw i64 %indvars.iv229, 1
  %301 = load i32, ptr %187, align 8, !tbaa !38
  %302 = zext i32 %301 to i64
  %303 = icmp ult i64 %indvars.iv.next230, %302
  br i1 %303, label %213, label %._crit_edge198, !llvm.loop !59

304:                                              ; preds = %._crit_edge198, %47, %36
  %indvars.iv.next233 = add nuw nsw i64 %indvars.iv232, 1
  %305 = load i32, ptr %16, align 8, !tbaa !5
  %306 = zext i32 %305 to i64
  %307 = icmp ult i64 %indvars.iv.next233, %306
  br i1 %307, label %36, label %.preheader, !llvm.loop !60

._crit_edge204:                                   ; preds = %308, %.preheader
  ret void

308:                                              ; preds = %.lr.ph203, %308
  %indvars.iv235 = phi i64 [ 0, %.lr.ph203 ], [ %indvars.iv.next236, %308 ]
  %309 = load ptr, ptr %35, align 8, !tbaa !61
  %310 = getelementptr inbounds ptr, ptr %309, i64 %indvars.iv235
  %311 = load ptr, ptr %310, align 8, !tbaa !19
  call void @_ZNK6Assimp20PretransformVertices11CollectDataEPK7aiScenePK6aiNodejjP6aiMeshPjS9_(ptr noundef nonnull align 8 dereferenceable(93) %0, ptr noundef %1, ptr noundef %311, i32 noundef %3, i32 noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7)
  %indvars.iv.next236 = add nuw nsw i64 %indvars.iv235, 1
  %312 = load i32, ptr %33, align 8, !tbaa !14
  %313 = zext i32 %312 to i64
  %314 = icmp ult i64 %indvars.iv.next236, %313
  br i1 %314, label %308, label %._crit_edge204, !llvm.loop !62
}

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(1028) ptr @_ZN8aiStringaSERKS_(ptr noundef nonnull align 4 dereferenceable(1028), ptr noundef nonnull align 4 dereferenceable(1028)) local_unnamed_addr #6 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 4 dereferenceable(64) ptr @_ZN12aiMatrix4x4tIfE7InverseEv(ptr noundef nonnull align 4 dereferenceable(64)) local_unnamed_addr #7 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN12aiMatrix3x3tIfEC2ERK12aiMatrix4x4tIfE(ptr noundef nonnull align 4 dereferenceable(36), ptr noundef nonnull align 4 dereferenceable(64)) unnamed_addr #4 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 4 dereferenceable(12) ptr @_ZN10aiVector3tIfE9NormalizeEv(ptr noundef nonnull align 4 dereferenceable(12)) local_unnamed_addr #2 align 2

; Function Attrs: nobuiltin allocsize(0)
declare noundef nonnull ptr @_Znam(i64 noundef) local_unnamed_addr #8

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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 #3 = { 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 #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 = { "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 = { 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 #8 = { nobuiltin allocsize(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 #9 = { nounwind }
attributes #10 = { builtin allocsize(0) }

!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, !8, i64 1120}
!6 = !{!"_ZTS6aiNode", !7, i64 0, !11, i64 1028, !13, i64 1096, !8, i64 1104, !13, i64 1112, !8, i64 1120, !13, i64 1128, !13, i64 1136}
!7 = !{!"_ZTS8aiString", !8, i64 0, !9, i64 4}
!8 = !{!"int", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C++ TBAA"}
!11 = !{!"_ZTS12aiMatrix4x4tIfE", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !12, i64 32, !12, i64 36, !12, i64 40, !12, i64 44, !12, i64 48, !12, i64 52, !12, i64 56, !12, i64 60}
!12 = !{!"float", !9, i64 0}
!13 = !{!"any pointer", !9, i64 0}
!14 = !{!6, !8, i64 1104}
!15 = !{!16, !13, i64 24}
!16 = !{!"_ZTS7aiScene", !8, i64 0, !13, i64 8, !8, i64 16, !13, i64 24, !8, i64 32, !13, i64 40, !8, i64 48, !13, i64 56, !8, i64 64, !13, i64 72, !8, i64 80, !13, i64 88, !8, i64 96, !13, i64 104, !13, i64 112, !7, i64 120, !8, i64 1148, !13, i64 1152, !13, i64 1160}
!17 = !{!6, !13, i64 1128}
!18 = !{!8, !8, i64 0}
!19 = !{!13, !13, i64 0}
!20 = !{!21, !8, i64 232}
!21 = !{!"_ZTS6aiMesh", !8, i64 0, !8, i64 4, !8, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !13, i64 40, !9, i64 48, !9, i64 112, !9, i64 176, !13, i64 208, !8, i64 216, !13, i64 224, !8, i64 232, !7, i64 236, !8, i64 1264, !13, i64 1272, !22, i64 1280, !23, i64 1284, !13, i64 1312}
!22 = !{!"_ZTS16aiMorphingMethod", !9, i64 0}
!23 = !{!"_ZTS6aiAABB", !24, i64 0, !24, i64 12}
!24 = !{!"_ZTS10aiVector3tIfE", !12, i64 0, !12, i64 4, !12, i64 8}
!25 = !{!21, !8, i64 4}
!26 = !{!21, !13, i64 16}
!27 = !{!21, !13, i64 24}
!28 = !{!21, !13, i64 32}
!29 = !{!21, !13, i64 40}
!30 = !{i64 0, i64 4, !31, i64 4, i64 4, !31, i64 8, i64 4, !31, i64 12, i64 4, !31, i64 16, i64 4, !31, i64 20, i64 4, !31, i64 24, i64 4, !31, i64 28, i64 4, !31, i64 32, i64 4, !31, i64 36, i64 4, !31, i64 40, i64 4, !31, i64 44, i64 4, !31, i64 48, i64 4, !31, i64 52, i64 4, !31, i64 56, i64 4, !31, i64 60, i64 4, !31}
!31 = !{!12, !12, i64 0}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = !{i64 0, i64 4, !31, i64 4, i64 4, !31, i64 8, i64 4, !31}
!35 = distinct !{!35, !33}
!36 = distinct !{!36, !33}
!37 = distinct !{!37, !33}
!38 = !{!21, !8, i64 8}
!39 = !{!21, !13, i64 208}
!40 = distinct !{!40, !33}
!41 = !{!42, !8, i64 0}
!42 = !{!"_ZTS6aiFace", !8, i64 0, !13, i64 8}
!43 = !{!42, !13, i64 8}
!44 = !{!45}
!45 = distinct !{!45, !46}
!46 = distinct !{!46, !"LVerDomain"}
!47 = !{!48}
!48 = distinct !{!48, !46}
!49 = distinct !{!49, !33, !50, !51}
!50 = !{!"llvm.loop.isvectorized", i32 1}
!51 = !{!"llvm.loop.unroll.runtime.disable"}
!52 = distinct !{!52, !53}
!53 = !{!"llvm.loop.unroll.disable"}
!54 = distinct !{!54, !33, !50}
!55 = distinct !{!55, !33, !50, !51}
!56 = distinct !{!56, !53}
!57 = distinct !{!57, !33, !50}
!58 = !{!21, !8, i64 0}
!59 = distinct !{!59, !33}
!60 = distinct !{!60, !33}
!61 = !{!6, !13, i64 1112}
!62 = distinct !{!62, !33}


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