; LLVM IR from Lut1n/ImpGears :: src/OGLPlugin (RenderToCubeMap)

; 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.std::shared_ptr.3" = type { %"class.std::__shared_ptr.4" }
%"class.std::__shared_ptr.4" = type { ptr, %"class.std::__shared_count" }
%"class.std::__shared_count" = type { ptr }
%"class.imp::Matrix4" = type { %"class.imp::Matrix" }
%"class.imp::Matrix" = type { %"class.imp::Object", [16 x float] }
%"class.imp::Object" = type { ptr, %"class.std::shared_ptr.0" }
%"class.std::shared_ptr.0" = type { %"class.std::__shared_ptr.1" }
%"class.std::__shared_ptr.1" = type { ptr, %"class.std::__shared_count" }
%"class.std::shared_ptr.9" = type { %"class.std::__shared_ptr.10" }
%"class.std::__shared_ptr.10" = type { ptr, %"class.std::__shared_count" }
%"class.imp::Vec3" = type { %"class.imp::Vec.base", [4 x i8] }
%"class.imp::Vec.base" = type <{ %"class.imp::Object", [3 x float] }>
%"class.std::shared_ptr" = type { %"class.std::__shared_ptr" }
%"class.std::__shared_ptr" = type { ptr, %"class.std::__shared_count" }
%"class.std::shared_ptr.12" = type { %"class.std::__shared_ptr.13" }
%"class.std::__shared_ptr.13" = type { ptr, %"class.std::__shared_count" }
%"class.imp::RenderToCubeMap" = type <{ %"class.imp::Object", ptr, %"class.std::shared_ptr.3", %"class.std::shared_ptr.6", %"class.std::shared_ptr", %"class.imp::Matrix4", %"class.std::shared_ptr.9", %"class.std::shared_ptr.12", [6 x %"class.imp::Vec3"], [6 x %"class.imp::Vec3"], [6 x %"class.std::shared_ptr.15"], %"class.imp::Vec2", float, [4 x i8] }>
%"class.std::shared_ptr.6" = type { %"class.std::__shared_ptr.7" }
%"class.std::__shared_ptr.7" = type { ptr, %"class.std::__shared_count" }
%"class.std::shared_ptr.15" = type { %"class.std::__shared_ptr.16" }
%"class.std::__shared_ptr.16" = type { ptr, %"class.std::__shared_count" }
%"class.imp::Vec2" = type { %"class.imp::Vec.18" }
%"class.imp::Vec.18" = type { %"class.imp::Object", [2 x float] }

@_ZTVN3imp15RenderToCubeMapE = external dso_local unnamed_addr constant { [5 x ptr] }, align 8

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3imp15RenderToCubeMapC2EPNS_10GlRendererESt10shared_ptrINS_14CubeMapSamplerEE(ptr noundef nonnull align 8 dereferenceable(812) %0, ptr noundef %1, ptr noundef %2) unnamed_addr #0 align 2 personality ptr @__gxx_personality_v0 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca %"class.std::shared_ptr.3", align 8
  %10 = alloca %"class.imp::Matrix4", align 8
  %11 = alloca %"class.std::shared_ptr.9", align 8
  %12 = alloca %"class.imp::Vec3", align 8
  %13 = alloca %"class.imp::Vec3", align 8
  %14 = alloca %"class.imp::Vec3", align 8
  %15 = alloca %"class.imp::Vec3", align 8
  %16 = alloca %"class.imp::Vec3", align 8
  %17 = alloca %"class.imp::Vec3", align 8
  %18 = alloca %"class.imp::Vec3", align 8
  %19 = alloca %"class.imp::Vec3", align 8
  %20 = alloca %"class.imp::Vec3", align 8
  %21 = alloca %"class.imp::Vec3", align 8
  %22 = alloca %"class.imp::Vec3", align 8
  %23 = alloca %"class.imp::Vec3", align 8
  %24 = alloca %"class.std::shared_ptr", align 8
  %25 = alloca %"class.std::shared_ptr.12", align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store ptr %2, ptr %6, align 8, !tbaa !5
  %26 = load ptr, ptr %4, align 8
  call void @_ZN3imp6ObjectC2Ev(ptr noundef nonnull align 8 dereferenceable(24) %26)
  store ptr getelementptr inbounds inrange(-16, 24) ({ [5 x ptr] }, ptr @_ZTVN3imp15RenderToCubeMapE, i32 0, i32 0, i32 2), ptr %26, align 8, !tbaa !9
  %27 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 1
  %28 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %28, ptr %27, align 8, !tbaa !11
  %29 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 2
  call void @_ZNSt10shared_ptrIN3imp5GraphEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %29) #7
  %30 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 3
  call void @_ZNSt10shared_ptrIN3imp11RenderQueueEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %30) #7
  %31 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 4
  call void @_ZNSt10shared_ptrIN3imp14CubeMapSamplerEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %31) #7
  %32 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 5
  invoke void @_ZN3imp7Matrix4C1Ev(ptr noundef nonnull align 8 dereferenceable(88) %32)
          to label %33 unwind label %135

33:                                               ; preds = %3
  %34 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 6
  call void @_ZNSt10shared_ptrIN3imp6CameraEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %34) #7
  %35 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 7
  call void @_ZNSt10shared_ptrIN3imp5StateEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %35) #7
  %36 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 8
  %37 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %36, i32 0, i32 0
  %38 = getelementptr inbounds %"class.imp::Vec3", ptr %37, i64 6
  br label %39

39:                                               ; preds = %41, %33
  %40 = phi ptr [ %37, %33 ], [ %42, %41 ]
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %40)
          to label %41 unwind label %139

41:                                               ; preds = %39
  %42 = getelementptr inbounds %"class.imp::Vec3", ptr %40, i64 1
  %43 = icmp eq ptr %42, %38
  br i1 %43, label %44, label %39

44:                                               ; preds = %41
  %45 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 9
  %46 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %45, i32 0, i32 0
  %47 = getelementptr inbounds %"class.imp::Vec3", ptr %46, i64 6
  br label %48

48:                                               ; preds = %50, %44
  %49 = phi ptr [ %46, %44 ], [ %51, %50 ]
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %49)
          to label %50 unwind label %149

50:                                               ; preds = %48
  %51 = getelementptr inbounds %"class.imp::Vec3", ptr %49, i64 1
  %52 = icmp eq ptr %51, %47
  br i1 %52, label %53, label %48

53:                                               ; preds = %50
  %54 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 10
  %55 = getelementptr inbounds [6 x %"class.std::shared_ptr.15"], ptr %54, i32 0, i32 0
  %56 = getelementptr inbounds %"class.std::shared_ptr.15", ptr %55, i64 6
  br label %57

57:                                               ; preds = %57, %53
  %58 = phi ptr [ %55, %53 ], [ %59, %57 ]
  call void @_ZNSt10shared_ptrIN3imp12RenderTargetEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %58) #7
  %59 = getelementptr inbounds %"class.std::shared_ptr.15", ptr %58, i64 1
  %60 = icmp eq ptr %59, %56
  br i1 %60, label %61, label %57

61:                                               ; preds = %57
  %62 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 11
  invoke void @_ZN3imp4Vec2C2Eff(ptr noundef nonnull align 8 dereferenceable(32) %62, float noundef 0x3FB99999A0000000, float noundef 1.024000e+03)
          to label %63 unwind label %159

63:                                               ; preds = %61
  %64 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 12
  store float 1.024000e+03, ptr %64, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 16, ptr %9) #7
  invoke void @_ZN3imp5Graph6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind writable sret(%"class.std::shared_ptr.3") align 8 %9)
          to label %65 unwind label %163

65:                                               ; preds = %63
  %66 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 2
  %67 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp5GraphEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16) %66, ptr noundef nonnull align 8 dereferenceable(16) %9) #7
  call void @_ZNSt12__shared_ptrIN3imp5GraphELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %9) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %9) #7
  call void @llvm.lifetime.start.p0(i64 88, ptr %10) #7
  %68 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 11
  %69 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZN3imp3VecILi2EfEixEj(ptr noundef nonnull align 8 dereferenceable(32) %68, i32 noundef 0)
          to label %70 unwind label %167

70:                                               ; preds = %65
  %71 = load float, ptr %69, align 4, !tbaa !33
  %72 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 11
  %73 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZN3imp3VecILi2EfEixEj(ptr noundef nonnull align 8 dereferenceable(32) %72, i32 noundef 1)
          to label %74 unwind label %167

74:                                               ; preds = %70
  %75 = load float, ptr %73, align 4, !tbaa !33
  invoke void @_ZN3imp7Matrix415perspectiveProjEffff(ptr dead_on_unwind writable sret(%"class.imp::Matrix4") align 8 %10, float noundef 9.000000e+01, float noundef 1.000000e+00, float noundef %71, float noundef %75)
          to label %76 unwind label %167

76:                                               ; preds = %74
  %77 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 5
  %78 = invoke noundef nonnull align 8 dereferenceable(88) ptr @_ZN3imp7Matrix4aSERKS0_(ptr noundef nonnull align 8 dereferenceable(88) %77, ptr noundef nonnull align 8 dereferenceable(88) %10)
          to label %79 unwind label %171

79:                                               ; preds = %76
  call void @_ZN3imp7Matrix4D1Ev(ptr noundef nonnull align 8 dereferenceable(88) %10) #7
  call void @llvm.lifetime.end.p0(i64 88, ptr %10) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %11) #7
  invoke void @_ZN3imp6Camera6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind writable sret(%"class.std::shared_ptr.9") align 8 %11)
          to label %80 unwind label %176

80:                                               ; preds = %79
  %81 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 6
  %82 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp6CameraEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16) %81, ptr noundef nonnull align 8 dereferenceable(16) %11) #7
  call void @_ZNSt12__shared_ptrIN3imp6CameraELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %11) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %11) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %12) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %12, float noundef 1.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00)
          to label %83 unwind label %180

83:                                               ; preds = %80
  %84 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 8
  %85 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %84, i64 0, i64 0
  %86 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %85, ptr noundef nonnull align 8 dereferenceable(36) %12) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %12) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %12) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %13) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %13, float noundef -1.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00)
          to label %87 unwind label %184

87:                                               ; preds = %83
  %88 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 8
  %89 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %88, i64 0, i64 1
  %90 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %89, ptr noundef nonnull align 8 dereferenceable(36) %13) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %13) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %13) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %14) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %14, float noundef 0.000000e+00, float noundef 1.000000e+00, float noundef 0.000000e+00)
          to label %91 unwind label %188

91:                                               ; preds = %87
  %92 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 8
  %93 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %92, i64 0, i64 2
  %94 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %93, ptr noundef nonnull align 8 dereferenceable(36) %14) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %14) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %14) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %15) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %15, float noundef 0.000000e+00, float noundef -1.000000e+00, float noundef 0.000000e+00)
          to label %95 unwind label %192

95:                                               ; preds = %91
  %96 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 8
  %97 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %96, i64 0, i64 3
  %98 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %97, ptr noundef nonnull align 8 dereferenceable(36) %15) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %15) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %15) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %16) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %16, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 1.000000e+00)
          to label %99 unwind label %196

99:                                               ; preds = %95
  %100 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 8
  %101 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %100, i64 0, i64 4
  %102 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %101, ptr noundef nonnull align 8 dereferenceable(36) %16) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %16) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %16) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %17) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %17, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef -1.000000e+00)
          to label %103 unwind label %200

103:                                              ; preds = %99
  %104 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 8
  %105 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %104, i64 0, i64 5
  %106 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %105, ptr noundef nonnull align 8 dereferenceable(36) %17) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %17) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %17) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %18) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %18, float noundef 0.000000e+00, float noundef 1.000000e+00, float noundef 0.000000e+00)
          to label %107 unwind label %204

107:                                              ; preds = %103
  %108 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 9
  %109 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %108, i64 0, i64 0
  %110 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %109, ptr noundef nonnull align 8 dereferenceable(36) %18) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %18) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %18) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %19) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %19, float noundef 0.000000e+00, float noundef 1.000000e+00, float noundef 0.000000e+00)
          to label %111 unwind label %208

111:                                              ; preds = %107
  %112 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 9
  %113 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %112, i64 0, i64 1
  %114 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %113, ptr noundef nonnull align 8 dereferenceable(36) %19) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %19) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %19) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %20) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %20, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef -1.000000e+00)
          to label %115 unwind label %212

115:                                              ; preds = %111
  %116 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 9
  %117 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %116, i64 0, i64 2
  %118 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %117, ptr noundef nonnull align 8 dereferenceable(36) %20) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %20) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %20) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %21) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %21, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 1.000000e+00)
          to label %119 unwind label %216

119:                                              ; preds = %115
  %120 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 9
  %121 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %120, i64 0, i64 3
  %122 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %121, ptr noundef nonnull align 8 dereferenceable(36) %21) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %21) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %21) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %22) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %22, float noundef 0.000000e+00, float noundef 1.000000e+00, float noundef 0.000000e+00)
          to label %123 unwind label %220

123:                                              ; preds = %119
  %124 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 9
  %125 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %124, i64 0, i64 4
  %126 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %125, ptr noundef nonnull align 8 dereferenceable(36) %22) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %22) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %22) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %23) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %23, float noundef 0.000000e+00, float noundef 1.000000e+00, float noundef 0.000000e+00)
          to label %127 unwind label %224

127:                                              ; preds = %123
  %128 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 9
  %129 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %128, i64 0, i64 5
  %130 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %129, ptr noundef nonnull align 8 dereferenceable(36) %23) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %23) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %23) #7
  call void @_ZNSt10shared_ptrIN3imp14CubeMapSamplerEEC2ERKS2_(ptr noundef nonnull align 8 dereferenceable(16) %24, ptr noundef nonnull align 8 dereferenceable(16) %2) #7
  invoke void @_ZN3imp15RenderToCubeMap10setCubeMapESt10shared_ptrINS_14CubeMapSamplerEE(ptr noundef nonnull align 8 dereferenceable(812) %26, ptr noundef %24)
          to label %131 unwind label %228

131:                                              ; preds = %127
  call void @_ZNSt12__shared_ptrIN3imp14CubeMapSamplerELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %24) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %25) #7
  invoke void @_ZN3imp5State6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind writable sret(%"class.std::shared_ptr.12") align 8 %25)
          to label %132 unwind label %232

132:                                              ; preds = %131
  %133 = getelementptr inbounds %"class.imp::RenderToCubeMap", ptr %26, i32 0, i32 7
  %134 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp5StateEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16) %133, ptr noundef nonnull align 8 dereferenceable(16) %25) #7
  call void @_ZNSt12__shared_ptrIN3imp5StateELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %25) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #7
  ret void

135:                                              ; preds = %3
  %136 = landingpad { ptr, i32 }
          cleanup
  %137 = extractvalue { ptr, i32 } %136, 0
  store ptr %137, ptr %7, align 8
  %138 = extractvalue { ptr, i32 } %136, 1
  store i32 %138, ptr %8, align 4
  br label %261

139:                                              ; preds = %39
  %140 = landingpad { ptr, i32 }
          cleanup
  %141 = extractvalue { ptr, i32 } %140, 0
  store ptr %141, ptr %7, align 8
  %142 = extractvalue { ptr, i32 } %140, 1
  store i32 %142, ptr %8, align 4
  %143 = icmp eq ptr %37, %40
  br i1 %143, label %148, label %144

144:                                              ; preds = %144, %139
  %145 = phi ptr [ %40, %139 ], [ %146, %144 ]
  %146 = getelementptr inbounds %"class.imp::Vec3", ptr %145, i64 -1
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %146) #7
  %147 = icmp eq ptr %146, %37
  br i1 %147, label %148, label %144

148:                                              ; preds = %144, %139
  br label %260

149:                                              ; preds = %48
  %150 = landingpad { ptr, i32 }
          cleanup
  %151 = extractvalue { ptr, i32 } %150, 0
  store ptr %151, ptr %7, align 8
  %152 = extractvalue { ptr, i32 } %150, 1
  store i32 %152, ptr %8, align 4
  %153 = icmp eq ptr %46, %49
  br i1 %153, label %158, label %154

154:                                              ; preds = %154, %149
  %155 = phi ptr [ %49, %149 ], [ %156, %154 ]
  %156 = getelementptr inbounds %"class.imp::Vec3", ptr %155, i64 -1
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %156) #7
  %157 = icmp eq ptr %156, %46
  br i1 %157, label %158, label %154

158:                                              ; preds = %154, %149
  br label %252

159:                                              ; preds = %61
  %160 = landingpad { ptr, i32 }
          cleanup
  %161 = extractvalue { ptr, i32 } %160, 0
  store ptr %161, ptr %7, align 8
  %162 = extractvalue { ptr, i32 } %160, 1
  store i32 %162, ptr %8, align 4
  br label %237

163:                                              ; preds = %63
  %164 = landingpad { ptr, i32 }
          cleanup
  %165 = extractvalue { ptr, i32 } %164, 0
  store ptr %165, ptr %7, align 8
  %166 = extractvalue { ptr, i32 } %164, 1
  store i32 %166, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %9) #7
  br label %236

167:                                              ; preds = %74, %70, %65
  %168 = landingpad { ptr, i32 }
          cleanup
  %169 = extractvalue { ptr, i32 } %168, 0
  store ptr %169, ptr %7, align 8
  %170 = extractvalue { ptr, i32 } %168, 1
  store i32 %170, ptr %8, align 4
  br label %175

171:                                              ; preds = %76
  %172 = landingpad { ptr, i32 }
          cleanup
  %173 = extractvalue { ptr, i32 } %172, 0
  store ptr %173, ptr %7, align 8
  %174 = extractvalue { ptr, i32 } %172, 1
  store i32 %174, ptr %8, align 4
  call void @_ZN3imp7Matrix4D1Ev(ptr noundef nonnull align 8 dereferenceable(88) %10) #7
  br label %175

175:                                              ; preds = %171, %167
  call void @llvm.lifetime.end.p0(i64 88, ptr %10) #7
  br label %236

176:                                              ; preds = %79
  %177 = landingpad { ptr, i32 }
          cleanup
  %178 = extractvalue { ptr, i32 } %177, 0
  store ptr %178, ptr %7, align 8
  %179 = extractvalue { ptr, i32 } %177, 1
  store i32 %179, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %11) #7
  br label %236

180:                                              ; preds = %80
  %181 = landingpad { ptr, i32 }
          cleanup
  %182 = extractvalue { ptr, i32 } %181, 0
  store ptr %182, ptr %7, align 8
  %183 = extractvalue { ptr, i32 } %181, 1
  store i32 %183, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %12) #7
  br label %236

184:                                              ; preds = %83
  %185 = landingpad { ptr, i32 }
          cleanup
  %186 = extractvalue { ptr, i32 } %185, 0
  store ptr %186, ptr %7, align 8
  %187 = extractvalue { ptr, i32 } %185, 1
  store i32 %187, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %13) #7
  br label %236

188:                                              ; preds = %87
  %189 = landingpad { ptr, i32 }
          cleanup
  %190 = extractvalue { ptr, i32 } %189, 0
  store ptr %190, ptr %7, align 8
  %191 = extractvalue { ptr, i32 } %189, 1
  store i32 %191, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %14) #7
  br label %236

192:                                              ; preds = %91
  %193 = landingpad { ptr, i32 }
          cleanup
  %194 = extractvalue { ptr, i32 } %193, 0
  store ptr %194, ptr %7, align 8
  %195 = extractvalue { ptr, i32 } %193, 1
  store i32 %195, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %15) #7
  br label %236

196:                                              ; preds = %95
  %197 = landingpad { ptr, i32 }
          cleanup
  %198 = extractvalue { ptr, i32 } %197, 0
  store ptr %198, ptr %7, align 8
  %199 = extractvalue { ptr, i32 } %197, 1
  store i32 %199, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %16) #7
  br label %236

200:                                              ; preds = %99
  %201 = landingpad { ptr, i32 }
          cleanup
  %202 = extractvalue { ptr, i32 } %201, 0
  store ptr %202, ptr %7, align 8
  %203 = extractvalue { ptr, i32 } %201, 1
  store i32 %203, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %17) #7
  br label %236

204:                                              ; preds = %103
  %205 = landingpad { ptr, i32 }
          cleanup
  %206 = extractvalue { ptr, i32 } %205, 0
  store ptr %206, ptr %7, align 8
  %207 = extractvalue { ptr, i32 } %205, 1
  store i32 %207, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %18) #7
  br label %236

208:                                              ; preds = %107
  %209 = landingpad { ptr, i32 }
          cleanup
  %210 = extractvalue { ptr, i32 } %209, 0
  store ptr %210, ptr %7, align 8
  %211 = extractvalue { ptr, i32 } %209, 1
  store i32 %211, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %19) #7
  br label %236

212:                                              ; preds = %111
  %213 = landingpad { ptr, i32 }
          cleanup
  %214 = extractvalue { ptr, i32 } %213, 0
  store ptr %214, ptr %7, align 8
  %215 = extractvalue { ptr, i32 } %213, 1
  store i32 %215, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %20) #7
  br label %236

216:                                              ; preds = %115
  %217 = landingpad { ptr, i32 }
          cleanup
  %218 = extractvalue { ptr, i32 } %217, 0
  store ptr %218, ptr %7, align 8
  %219 = extractvalue { ptr, i32 } %217, 1
  store i32 %219, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %21) #7
  br label %236

220:                                              ; preds = %119
  %221 = landingpad { ptr, i32 }
          cleanup
  %222 = extractvalue { ptr, i32 } %221, 0
  store ptr %222, ptr %7, align 8
  %223 = extractvalue { ptr, i32 } %221, 1
  store i32 %223, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %22) #7
  br label %236

224:                                              ; preds = %123
  %225 = landingpad { ptr, i32 }
          cleanup
  %226 = extractvalue { ptr, i32 } %225, 0
  store ptr %226, ptr %7, align 8
  %227 = extractvalue { ptr, i32 } %225, 1
  store i32 %227, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %23) #7
  br label %236

228:                                              ; preds = %127
  %229 = landingpad { ptr, i32 }
          cleanup
  %230 = extractvalue { ptr, i32 } %229, 0
  store ptr %230, ptr %7, align 8
  %231 = extractvalue { ptr, i32 } %229, 1
  store i32 %231, ptr %8, align 4
  call void @_ZNSt12__shared_ptrIN3imp14CubeMapSamplerELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %24) #7
  br label %236

232:                                              ; preds = %131
  %233 = landingpad { ptr, i32 }
          cleanup
  %234 = extractvalue { ptr, i32 } %233, 0
  store ptr %234, ptr %7, align 8
  %235 = extractvalue { ptr, i32 } %233, 1
  store i32 %235, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #7
  br label %236

236:                                              ; preds = %232, %228, %224, %220, %216, %212, %208, %204, %200, %196, %192, %188, %184, %180, %176, %175, %163
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(32) %62) #7
  br label %237

237:                                              ; preds = %236, %159
  %238 = getelementptr inbounds [6 x %"class.std::shared_ptr.15"], ptr %54, i32 0, i32 0
  %239 = getelementptr inbounds %"class.std::shared_ptr.15", ptr %238, i64 6
  br label %240

240:                                              ; preds = %240, %237
  %241 = phi ptr [ %239, %237 ], [ %242, %240 ]
  %242 = getelementptr inbounds %"class.std::shared_ptr.15", ptr %241, i64 -1
  call void @_ZNSt12__shared_ptrIN3imp12RenderTargetELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %242) #7
  %243 = icmp eq ptr %242, %238
  br i1 %243, label %244, label %240

244:                                              ; preds = %240
  %245 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %45, i32 0, i32 0
  %246 = getelementptr inbounds %"class.imp::Vec3", ptr %245, i64 6
  br label %247

247:                                              ; preds = %247, %244
  %248 = phi ptr [ %246, %244 ], [ %249, %247 ]
  %249 = getelementptr inbounds %"class.imp::Vec3", ptr %248, i64 -1
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %249) #7
  %250 = icmp eq ptr %249, %245
  br i1 %250, label %251, label %247

251:                                              ; preds = %247
  br label %252

252:                                              ; preds = %251, %158
  %253 = getelementptr inbounds [6 x %"class.imp::Vec3"], ptr %36, i32 0, i32 0
  %254 = getelementptr inbounds %"class.imp::Vec3", ptr %253, i64 6
  br label %255

255:                                              ; preds = %255, %252
  %256 = phi ptr [ %254, %252 ], [ %257, %255 ]
  %257 = getelementptr inbounds %"class.imp::Vec3", ptr %256, i64 -1
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %257) #7
  %258 = icmp eq ptr %257, %253
  br i1 %258, label %259, label %255

259:                                              ; preds = %255
  br label %260

260:                                              ; preds = %259, %148
  call void @_ZNSt12__shared_ptrIN3imp5StateELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %35) #7
  call void @_ZNSt12__shared_ptrIN3imp6CameraELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %34) #7
  call void @_ZN3imp7Matrix4D1Ev(ptr noundef nonnull align 8 dereferenceable(88) %32) #7
  br label %261

261:                                              ; preds = %260, %135
  call void @_ZNSt12__shared_ptrIN3imp14CubeMapSamplerELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %31) #7
  call void @_ZNSt12__shared_ptrIN3imp11RenderQueueELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %30) #7
  call void @_ZNSt12__shared_ptrIN3imp5GraphELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %29) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(24) %26) #7
  br label %262

262:                                              ; preds = %261
  %263 = load ptr, ptr %7, align 8
  %264 = load i32, ptr %8, align 4
  %265 = insertvalue { ptr, i32 } poison, ptr %263, 0
  %266 = insertvalue { ptr, i32 } %265, i32 %264, 1
  resume { ptr, i32 } %266
}

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3imp6ObjectC2Ev(ptr noundef nonnull align 8 dereferenceable(24)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp5GraphEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp11RenderQueueEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp14CubeMapSamplerEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

declare void @_ZN3imp7Matrix4C1Ev(ptr noundef nonnull align 8 dereferenceable(88)) unnamed_addr #2

declare i32 @__gxx_personality_v0(...)

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp6CameraEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp5StateEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36)) unnamed_addr #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp12RenderTargetEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp4Vec2C2Eff(ptr noundef nonnull align 8 dereferenceable(32), float noundef, float noundef) unnamed_addr #0 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp5Graph6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind noalias writable sret(%"class.std::shared_ptr.3") align 8) #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp5GraphEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(16)) #1 align 2

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

declare void @_ZN3imp7Matrix415perspectiveProjEffff(ptr dead_on_unwind writable sret(%"class.imp::Matrix4") align 8, float noundef, float noundef, float noundef, float noundef) #2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZN3imp3VecILi2EfEixEj(ptr noundef nonnull align 8 dereferenceable(32), i32 noundef) #1 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(88) ptr @_ZN3imp7Matrix4aSERKS0_(ptr noundef nonnull align 8 dereferenceable(88), ptr noundef nonnull align 8 dereferenceable(88)) #4 align 2

; Function Attrs: nounwind
declare void @_ZN3imp7Matrix4D1Ev(ptr noundef nonnull align 8 dereferenceable(88)) unnamed_addr #5

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp6Camera6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind noalias writable sret(%"class.std::shared_ptr.9") align 8) #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp6CameraEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(16)) #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36), float noundef, float noundef, float noundef) unnamed_addr #0 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36), ptr noundef nonnull align 8 dereferenceable(36)) #6 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp15RenderToCubeMap10setCubeMapESt10shared_ptrINS_14CubeMapSamplerEE(ptr noundef nonnull align 8 dereferenceable(812), ptr noundef) #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp14CubeMapSamplerEEC2ERKS2_(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp14CubeMapSamplerELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp5State6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind noalias writable sret(%"class.std::shared_ptr.12") align 8) #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp5StateEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(16)) #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(24)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp5GraphELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp6CameraELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp5StateELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp12RenderTargetELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp11RenderQueueELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

attributes #0 = { 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 #1 = { 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 #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { 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 #5 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { 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 #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 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"vtable pointer", !8, i64 0}
!11 = !{!12, !6, i64 24}
!12 = !{!"_ZTSN3imp15RenderToCubeMapE", !13, i64 0, !6, i64 24, !17, i64 32, !19, i64 48, !21, i64 64, !23, i64 80, !25, i64 168, !27, i64 184, !7, i64 200, !7, i64 440, !7, i64 680, !29, i64 776, !31, i64 808}
!13 = !{!"_ZTSN3imp6ObjectE", !14, i64 8}
!14 = !{!"_ZTSSt10shared_ptrIN3imp6ObjectEE", !15, i64 0}
!15 = !{!"_ZTSSt12__shared_ptrIN3imp6ObjectELN9__gnu_cxx12_Lock_policyE2EE", !6, i64 0, !16, i64 8}
!16 = !{!"_ZTSSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EE", !6, i64 0}
!17 = !{!"_ZTSSt10shared_ptrIN3imp5GraphEE", !18, i64 0}
!18 = !{!"_ZTSSt12__shared_ptrIN3imp5GraphELN9__gnu_cxx12_Lock_policyE2EE", !6, i64 0, !16, i64 8}
!19 = !{!"_ZTSSt10shared_ptrIN3imp11RenderQueueEE", !20, i64 0}
!20 = !{!"_ZTSSt12__shared_ptrIN3imp11RenderQueueELN9__gnu_cxx12_Lock_policyE2EE", !6, i64 0, !16, i64 8}
!21 = !{!"_ZTSSt10shared_ptrIN3imp14CubeMapSamplerEE", !22, i64 0}
!22 = !{!"_ZTSSt12__shared_ptrIN3imp14CubeMapSamplerELN9__gnu_cxx12_Lock_policyE2EE", !6, i64 0, !16, i64 8}
!23 = !{!"_ZTSN3imp7Matrix4E", !24, i64 0}
!24 = !{!"_ZTSN3imp6MatrixILi4ELi4EfEE", !13, i64 0, !7, i64 24}
!25 = !{!"_ZTSSt10shared_ptrIN3imp6CameraEE", !26, i64 0}
!26 = !{!"_ZTSSt12__shared_ptrIN3imp6CameraELN9__gnu_cxx12_Lock_policyE2EE", !6, i64 0, !16, i64 8}
!27 = !{!"_ZTSSt10shared_ptrIN3imp5StateEE", !28, i64 0}
!28 = !{!"_ZTSSt12__shared_ptrIN3imp5StateELN9__gnu_cxx12_Lock_policyE2EE", !6, i64 0, !16, i64 8}
!29 = !{!"_ZTSN3imp4Vec2E", !30, i64 0}
!30 = !{!"_ZTSN3imp3VecILi2EfEE", !13, i64 0, !7, i64 24}
!31 = !{!"float", !7, i64 0}
!32 = !{!12, !31, i64 808}
!33 = !{!31, !31, i64 0}


; 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.std::shared_ptr.3" = type { %"class.std::__shared_ptr.4" }
%"class.std::__shared_ptr.4" = type { ptr, %"class.std::__shared_count" }
%"class.std::__shared_count" = type { ptr }
%"class.imp::Matrix4" = type { %"class.imp::Matrix" }
%"class.imp::Matrix" = type { %"class.imp::Object", [16 x float] }
%"class.imp::Object" = type { ptr, %"class.std::shared_ptr.0" }
%"class.std::shared_ptr.0" = type { %"class.std::__shared_ptr.1" }
%"class.std::__shared_ptr.1" = type { ptr, %"class.std::__shared_count" }
%"class.std::shared_ptr.9" = type { %"class.std::__shared_ptr.10" }
%"class.std::__shared_ptr.10" = type { ptr, %"class.std::__shared_count" }
%"class.imp::Vec3" = type { %"class.imp::Vec.base", [4 x i8] }
%"class.imp::Vec.base" = type <{ %"class.imp::Object", [3 x float] }>
%"class.std::shared_ptr" = type { %"class.std::__shared_ptr" }
%"class.std::__shared_ptr" = type { ptr, %"class.std::__shared_count" }
%"class.std::shared_ptr.12" = type { %"class.std::__shared_ptr.13" }
%"class.std::__shared_ptr.13" = type { ptr, %"class.std::__shared_count" }

@_ZTVN3imp15RenderToCubeMapE = external dso_local unnamed_addr constant { [5 x ptr] }, align 8

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3imp15RenderToCubeMapC2EPNS_10GlRendererESt10shared_ptrINS_14CubeMapSamplerEE(ptr noundef nonnull align 8 dereferenceable(812) %0, ptr noundef %1, ptr noundef %2) unnamed_addr #0 align 2 personality ptr @__gxx_personality_v0 {
  %4 = alloca %"class.std::shared_ptr.3", align 8
  %5 = alloca %"class.imp::Matrix4", align 8
  %6 = alloca %"class.std::shared_ptr.9", align 8
  %7 = alloca %"class.imp::Vec3", align 8
  %8 = alloca %"class.imp::Vec3", align 8
  %9 = alloca %"class.imp::Vec3", align 8
  %10 = alloca %"class.imp::Vec3", align 8
  %11 = alloca %"class.imp::Vec3", align 8
  %12 = alloca %"class.imp::Vec3", align 8
  %13 = alloca %"class.imp::Vec3", align 8
  %14 = alloca %"class.imp::Vec3", align 8
  %15 = alloca %"class.imp::Vec3", align 8
  %16 = alloca %"class.imp::Vec3", align 8
  %17 = alloca %"class.imp::Vec3", align 8
  %18 = alloca %"class.imp::Vec3", align 8
  %19 = alloca %"class.std::shared_ptr", align 8
  %20 = alloca %"class.std::shared_ptr.12", align 8
  tail call void @_ZN3imp6ObjectC2Ev(ptr noundef nonnull align 8 dereferenceable(24) %0)
  store ptr getelementptr inbounds inrange(-16, 24) (i8, ptr @_ZTVN3imp15RenderToCubeMapE, i64 16), ptr %0, align 8, !tbaa !5
  %21 = getelementptr inbounds i8, ptr %0, i64 24
  store ptr %1, ptr %21, align 8, !tbaa !8
  %22 = getelementptr inbounds i8, ptr %0, i64 32
  tail call void @_ZNSt10shared_ptrIN3imp5GraphEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %22) #7
  %23 = getelementptr inbounds i8, ptr %0, i64 48
  tail call void @_ZNSt10shared_ptrIN3imp11RenderQueueEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %23) #7
  %24 = getelementptr inbounds i8, ptr %0, i64 64
  tail call void @_ZNSt10shared_ptrIN3imp14CubeMapSamplerEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %24) #7
  %25 = getelementptr inbounds i8, ptr %0, i64 80
  invoke void @_ZN3imp7Matrix4C1Ev(ptr noundef nonnull align 8 dereferenceable(88) %25)
          to label %26 unwind label %81

26:                                               ; preds = %3
  %27 = getelementptr inbounds i8, ptr %0, i64 168
  tail call void @_ZNSt10shared_ptrIN3imp6CameraEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %27) #7
  %28 = getelementptr inbounds i8, ptr %0, i64 184
  tail call void @_ZNSt10shared_ptrIN3imp5StateEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %28) #7
  %.ptr17 = getelementptr inbounds i8, ptr %0, i64 200
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr17)
          to label %29 unwind label %83

29:                                               ; preds = %26
  %.ptr.ptr.1 = getelementptr inbounds i8, ptr %0, i64 240
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.1)
          to label %30 unwind label %.preheader61.preheader

30:                                               ; preds = %29
  %.ptr.ptr.2 = getelementptr inbounds i8, ptr %0, i64 280
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.2)
          to label %31 unwind label %.preheader61.preheader

31:                                               ; preds = %30
  %.ptr.ptr.3 = getelementptr inbounds i8, ptr %0, i64 320
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.3)
          to label %32 unwind label %.preheader61.preheader

32:                                               ; preds = %31
  %.ptr.ptr.4 = getelementptr inbounds i8, ptr %0, i64 360
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.4)
          to label %33 unwind label %.preheader61.preheader

33:                                               ; preds = %32
  %.ptr.ptr.5 = getelementptr inbounds i8, ptr %0, i64 400
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.5)
          to label %34 unwind label %.preheader61.preheader

34:                                               ; preds = %33
  %.ptr25 = getelementptr inbounds i8, ptr %0, i64 440
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr25)
          to label %35 unwind label %85

35:                                               ; preds = %34
  %.ptr.ptr30.1 = getelementptr inbounds i8, ptr %0, i64 480
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.1)
          to label %36 unwind label %.preheader59.preheader

36:                                               ; preds = %35
  %.ptr.ptr30.2 = getelementptr inbounds i8, ptr %0, i64 520
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.2)
          to label %37 unwind label %.preheader59.preheader

37:                                               ; preds = %36
  %.ptr.ptr30.3 = getelementptr inbounds i8, ptr %0, i64 560
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.3)
          to label %38 unwind label %.preheader59.preheader

38:                                               ; preds = %37
  %.ptr.ptr30.4 = getelementptr inbounds i8, ptr %0, i64 600
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.4)
          to label %39 unwind label %.preheader59.preheader

39:                                               ; preds = %38
  %.ptr.ptr30.5 = getelementptr inbounds i8, ptr %0, i64 640
  invoke void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.5)
          to label %.preheader58.preheader unwind label %.preheader59.preheader

.preheader58.preheader:                           ; preds = %39
  %.ptr = getelementptr inbounds i8, ptr %0, i64 680
  tail call void @_ZNSt10shared_ptrIN3imp12RenderTargetEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr) #7
  %.ptr.1 = getelementptr inbounds i8, ptr %0, i64 696
  tail call void @_ZNSt10shared_ptrIN3imp12RenderTargetEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr.1) #7
  %.ptr.2 = getelementptr inbounds i8, ptr %0, i64 712
  tail call void @_ZNSt10shared_ptrIN3imp12RenderTargetEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr.2) #7
  %.ptr.3 = getelementptr inbounds i8, ptr %0, i64 728
  tail call void @_ZNSt10shared_ptrIN3imp12RenderTargetEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr.3) #7
  %.ptr.4 = getelementptr inbounds i8, ptr %0, i64 744
  tail call void @_ZNSt10shared_ptrIN3imp12RenderTargetEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr.4) #7
  %.ptr.5 = getelementptr inbounds i8, ptr %0, i64 760
  tail call void @_ZNSt10shared_ptrIN3imp12RenderTargetEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr.5) #7
  %40 = getelementptr inbounds i8, ptr %0, i64 776
  invoke void @_ZN3imp4Vec2C2Eff(ptr noundef nonnull align 8 dereferenceable(32) %40, float noundef 0x3FB99999A0000000, float noundef 1.024000e+03)
          to label %41 unwind label %87

41:                                               ; preds = %.preheader58.preheader
  %42 = getelementptr inbounds i8, ptr %0, i64 808
  store float 1.024000e+03, ptr %42, align 8, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %4) #7
  invoke void @_ZN3imp5Graph6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind nonnull writable sret(%"class.std::shared_ptr.3") align 8 %4)
          to label %43 unwind label %89

43:                                               ; preds = %41
  %44 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp5GraphEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16) %22, ptr noundef nonnull align 8 dereferenceable(16) %4) #7
  call void @_ZNSt12__shared_ptrIN3imp5GraphELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %4) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %4) #7
  call void @llvm.lifetime.start.p0(i64 88, ptr nonnull %5) #7
  %45 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN3imp3VecILi2EfEixEj(ptr noundef nonnull align 8 dereferenceable(32) %40, i32 noundef 0)
  %46 = load float, ptr %45, align 4, !tbaa !32
  %47 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN3imp3VecILi2EfEixEj(ptr noundef nonnull align 8 dereferenceable(32) %40, i32 noundef 1)
  %48 = load float, ptr %47, align 4, !tbaa !32
  invoke void @_ZN3imp7Matrix415perspectiveProjEffff(ptr dead_on_unwind nonnull writable sret(%"class.imp::Matrix4") align 8 %5, float noundef 9.000000e+01, float noundef 1.000000e+00, float noundef %46, float noundef %48)
          to label %49 unwind label %91

49:                                               ; preds = %43
  %50 = invoke noundef nonnull align 8 dereferenceable(88) ptr @_ZN3imp7Matrix4aSERKS0_(ptr noundef nonnull align 8 dereferenceable(88) %25, ptr noundef nonnull align 8 dereferenceable(88) %5)
          to label %51 unwind label %93

51:                                               ; preds = %49
  call void @_ZN3imp7Matrix4D1Ev(ptr noundef nonnull align 8 dereferenceable(88) %5) #7
  call void @llvm.lifetime.end.p0(i64 88, ptr nonnull %5) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %6) #7
  invoke void @_ZN3imp6Camera6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind nonnull writable sret(%"class.std::shared_ptr.9") align 8 %6)
          to label %52 unwind label %96

52:                                               ; preds = %51
  %53 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp6CameraEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16) %27, ptr noundef nonnull align 8 dereferenceable(16) %6) #7
  call void @_ZNSt12__shared_ptrIN3imp6CameraELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %6) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %7) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %7, float noundef 1.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00)
          to label %54 unwind label %98

54:                                               ; preds = %52
  %55 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr17, ptr noundef nonnull align 8 dereferenceable(36) %7) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %7) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %7) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %8) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %8, float noundef -1.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00)
          to label %56 unwind label %100

56:                                               ; preds = %54
  %57 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.1, ptr noundef nonnull align 8 dereferenceable(36) %8) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %8) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %8) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %9) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %9, float noundef 0.000000e+00, float noundef 1.000000e+00, float noundef 0.000000e+00)
          to label %58 unwind label %102

58:                                               ; preds = %56
  %59 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.2, ptr noundef nonnull align 8 dereferenceable(36) %9) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %9) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %9) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %10) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %10, float noundef 0.000000e+00, float noundef -1.000000e+00, float noundef 0.000000e+00)
          to label %60 unwind label %104

60:                                               ; preds = %58
  %61 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.3, ptr noundef nonnull align 8 dereferenceable(36) %10) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %10) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %10) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %11) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %11, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 1.000000e+00)
          to label %62 unwind label %106

62:                                               ; preds = %60
  %63 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.4, ptr noundef nonnull align 8 dereferenceable(36) %11) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %11) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %11) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %12) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %12, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef -1.000000e+00)
          to label %64 unwind label %108

64:                                               ; preds = %62
  %65 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.5, ptr noundef nonnull align 8 dereferenceable(36) %12) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %12) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %12) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %13) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %13, float noundef 0.000000e+00, float noundef 1.000000e+00, float noundef 0.000000e+00)
          to label %66 unwind label %110

66:                                               ; preds = %64
  %67 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr25, ptr noundef nonnull align 8 dereferenceable(36) %13) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %13) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %13) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %14) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %14, float noundef 0.000000e+00, float noundef 1.000000e+00, float noundef 0.000000e+00)
          to label %68 unwind label %112

68:                                               ; preds = %66
  %69 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.1, ptr noundef nonnull align 8 dereferenceable(36) %14) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %14) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %14) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %15) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %15, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef -1.000000e+00)
          to label %70 unwind label %114

70:                                               ; preds = %68
  %71 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.2, ptr noundef nonnull align 8 dereferenceable(36) %15) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %15) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %15) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %16) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %16, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 1.000000e+00)
          to label %72 unwind label %116

72:                                               ; preds = %70
  %73 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.3, ptr noundef nonnull align 8 dereferenceable(36) %16) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %16) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %16) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %17) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %17, float noundef 0.000000e+00, float noundef 1.000000e+00, float noundef 0.000000e+00)
          to label %74 unwind label %118

74:                                               ; preds = %72
  %75 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.4, ptr noundef nonnull align 8 dereferenceable(36) %17) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %17) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %17) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %18) #7
  invoke void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36) %18, float noundef 0.000000e+00, float noundef 1.000000e+00, float noundef 0.000000e+00)
          to label %76 unwind label %120

76:                                               ; preds = %74
  %77 = call noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.5, ptr noundef nonnull align 8 dereferenceable(36) %18) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %18) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %18) #7
  call void @_ZNSt10shared_ptrIN3imp14CubeMapSamplerEEC2ERKS2_(ptr noundef nonnull align 8 dereferenceable(16) %19, ptr noundef nonnull align 8 dereferenceable(16) %2) #7
  invoke void @_ZN3imp15RenderToCubeMap10setCubeMapESt10shared_ptrINS_14CubeMapSamplerEE(ptr noundef nonnull align 8 dereferenceable(812) %0, ptr noundef nonnull %19)
          to label %78 unwind label %122

78:                                               ; preds = %76
  call void @_ZNSt12__shared_ptrIN3imp14CubeMapSamplerELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %19) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #7
  invoke void @_ZN3imp5State6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind nonnull writable sret(%"class.std::shared_ptr.12") align 8 %20)
          to label %79 unwind label %124

79:                                               ; preds = %78
  %80 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp5StateEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16) %28, ptr noundef nonnull align 8 dereferenceable(16) %20) #7
  call void @_ZNSt12__shared_ptrIN3imp5StateELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %20) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #7
  ret void

81:                                               ; preds = %3
  %82 = landingpad { ptr, i32 }
          cleanup
  br label %127

83:                                               ; preds = %26
  %lpad.thr_comm.split-lp = landingpad { ptr, i32 }
          cleanup
  br label %.loopexit

.preheader61.preheader:                           ; preds = %29, %30, %31, %32, %33
  %.idx.lcssa.ph = phi i64 [ 400, %33 ], [ 360, %32 ], [ 320, %31 ], [ 280, %30 ], [ 240, %29 ]
  %lpad.thr_comm = landingpad { ptr, i32 }
          cleanup
  br label %.preheader61

.preheader61:                                     ; preds = %.preheader61.preheader, %.preheader61
  %.idx18 = phi i64 [ %.add19, %.preheader61 ], [ %.idx.lcssa.ph, %.preheader61.preheader ]
  %.add19 = add nsw i64 %.idx18, -40
  %.ptr21 = getelementptr inbounds i8, ptr %0, i64 %.add19
  tail call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr21) #7
  %84 = icmp eq i64 %.add19, 200
  br i1 %84, label %.loopexit, label %.preheader61

85:                                               ; preds = %34
  %lpad.thr_comm.split-lp76 = landingpad { ptr, i32 }
          cleanup
  br label %.loopexit57

.preheader59.preheader:                           ; preds = %35, %36, %37, %38, %39
  %.idx22.lcssa.ph = phi i64 [ 640, %39 ], [ 600, %38 ], [ 560, %37 ], [ 520, %36 ], [ 480, %35 ]
  %lpad.thr_comm75 = landingpad { ptr, i32 }
          cleanup
  br label %.preheader59

.preheader59:                                     ; preds = %.preheader59.preheader, %.preheader59
  %.idx26 = phi i64 [ %.add27, %.preheader59 ], [ %.idx22.lcssa.ph, %.preheader59.preheader ]
  %.add27 = add nsw i64 %.idx26, -40
  %.ptr29 = getelementptr inbounds i8, ptr %0, i64 %.add27
  tail call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr29) #7
  %86 = icmp eq i64 %.add27, 440
  br i1 %86, label %.loopexit57, label %.preheader59

87:                                               ; preds = %.preheader58.preheader
  %88 = landingpad { ptr, i32 }
          cleanup
  br label %.preheader.preheader

89:                                               ; preds = %41
  %90 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %4) #7
  br label %126

91:                                               ; preds = %43
  %92 = landingpad { ptr, i32 }
          cleanup
  br label %95

93:                                               ; preds = %49
  %94 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN3imp7Matrix4D1Ev(ptr noundef nonnull align 8 dereferenceable(88) %5) #7
  br label %95

95:                                               ; preds = %93, %91
  %.pn = phi { ptr, i32 } [ %94, %93 ], [ %92, %91 ]
  call void @llvm.lifetime.end.p0(i64 88, ptr nonnull %5) #7
  br label %126

96:                                               ; preds = %51
  %97 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #7
  br label %126

98:                                               ; preds = %52
  %99 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %7) #7
  br label %126

100:                                              ; preds = %54
  %101 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %8) #7
  br label %126

102:                                              ; preds = %56
  %103 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %9) #7
  br label %126

104:                                              ; preds = %58
  %105 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %10) #7
  br label %126

106:                                              ; preds = %60
  %107 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %11) #7
  br label %126

108:                                              ; preds = %62
  %109 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %12) #7
  br label %126

110:                                              ; preds = %64
  %111 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %13) #7
  br label %126

112:                                              ; preds = %66
  %113 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %14) #7
  br label %126

114:                                              ; preds = %68
  %115 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %15) #7
  br label %126

116:                                              ; preds = %70
  %117 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %16) #7
  br label %126

118:                                              ; preds = %72
  %119 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %17) #7
  br label %126

120:                                              ; preds = %74
  %121 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %18) #7
  br label %126

122:                                              ; preds = %76
  %123 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt12__shared_ptrIN3imp14CubeMapSamplerELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %19) #7
  br label %126

124:                                              ; preds = %78
  %125 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #7
  br label %126

126:                                              ; preds = %124, %122, %120, %118, %116, %114, %112, %110, %108, %106, %104, %102, %100, %98, %96, %95, %89
  %.pn36 = phi { ptr, i32 } [ %125, %124 ], [ %123, %122 ], [ %121, %120 ], [ %119, %118 ], [ %117, %116 ], [ %115, %114 ], [ %113, %112 ], [ %111, %110 ], [ %109, %108 ], [ %107, %106 ], [ %105, %104 ], [ %103, %102 ], [ %101, %100 ], [ %99, %98 ], [ %97, %96 ], [ %.pn, %95 ], [ %90, %89 ]
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(32) %40) #7
  br label %.preheader.preheader

.preheader.preheader:                             ; preds = %126, %87
  %.pn36.pn = phi { ptr, i32 } [ %.pn36, %126 ], [ %88, %87 ]
  call void @_ZNSt12__shared_ptrIN3imp12RenderTargetELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr.5) #7
  call void @_ZNSt12__shared_ptrIN3imp12RenderTargetELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr.4) #7
  call void @_ZNSt12__shared_ptrIN3imp12RenderTargetELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr.3) #7
  call void @_ZNSt12__shared_ptrIN3imp12RenderTargetELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr.2) #7
  call void @_ZNSt12__shared_ptrIN3imp12RenderTargetELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr.1) #7
  call void @_ZNSt12__shared_ptrIN3imp12RenderTargetELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %.ptr) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.5) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.4) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.3) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.2) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr30.1) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr25) #7
  br label %.loopexit57

.loopexit57:                                      ; preds = %.preheader59, %85, %.preheader.preheader
  %.pn36.pn.pn = phi { ptr, i32 } [ %lpad.thr_comm.split-lp76, %85 ], [ %.pn36.pn, %.preheader.preheader ], [ %lpad.thr_comm75, %.preheader59 ]
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.5) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.4) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.3) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.2) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr.ptr.1) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(36) %.ptr17) #7
  br label %.loopexit

.loopexit:                                        ; preds = %.preheader61, %83, %.loopexit57
  %.pn36.pn.pn.pn = phi { ptr, i32 } [ %lpad.thr_comm.split-lp, %83 ], [ %.pn36.pn.pn, %.loopexit57 ], [ %lpad.thr_comm, %.preheader61 ]
  call void @_ZNSt12__shared_ptrIN3imp5StateELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %28) #7
  call void @_ZNSt12__shared_ptrIN3imp6CameraELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %27) #7
  call void @_ZN3imp7Matrix4D1Ev(ptr noundef nonnull align 8 dereferenceable(88) %25) #7
  br label %127

127:                                              ; preds = %.loopexit, %81
  %.pn36.pn.pn.pn.pn = phi { ptr, i32 } [ %.pn36.pn.pn.pn, %.loopexit ], [ %82, %81 ]
  call void @_ZNSt12__shared_ptrIN3imp14CubeMapSamplerELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %24) #7
  call void @_ZNSt12__shared_ptrIN3imp11RenderQueueELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %23) #7
  call void @_ZNSt12__shared_ptrIN3imp5GraphELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16) %22) #7
  call void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(24) %0) #7
  resume { ptr, i32 } %.pn36.pn.pn.pn.pn
}

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3imp6ObjectC2Ev(ptr noundef nonnull align 8 dereferenceable(24)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp5GraphEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp11RenderQueueEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp14CubeMapSamplerEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

declare void @_ZN3imp7Matrix4C1Ev(ptr noundef nonnull align 8 dereferenceable(88)) unnamed_addr #2

declare i32 @__gxx_personality_v0(...)

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp6CameraEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp5StateEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp4Vec3C2Ev(ptr noundef nonnull align 8 dereferenceable(36)) unnamed_addr #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp12RenderTargetEEC2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp4Vec2C2Eff(ptr noundef nonnull align 8 dereferenceable(32), float noundef, float noundef) unnamed_addr #0 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp5Graph6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind noalias writable sret(%"class.std::shared_ptr.3") align 8) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp5GraphEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(16)) local_unnamed_addr #1 align 2

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

declare void @_ZN3imp7Matrix415perspectiveProjEffff(ptr dead_on_unwind writable sret(%"class.imp::Matrix4") align 8, float noundef, float noundef, float noundef, float noundef) local_unnamed_addr #2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZN3imp3VecILi2EfEixEj(ptr noundef nonnull align 8 dereferenceable(32), i32 noundef) local_unnamed_addr #1 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(88) ptr @_ZN3imp7Matrix4aSERKS0_(ptr noundef nonnull align 8 dereferenceable(88), ptr noundef nonnull align 8 dereferenceable(88)) local_unnamed_addr #4 align 2

; Function Attrs: nounwind
declare void @_ZN3imp7Matrix4D1Ev(ptr noundef nonnull align 8 dereferenceable(88)) unnamed_addr #5

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp6Camera6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind noalias writable sret(%"class.std::shared_ptr.9") align 8) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp6CameraEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(16)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp4Vec3C2Efff(ptr noundef nonnull align 8 dereferenceable(36), float noundef, float noundef, float noundef) unnamed_addr #0 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(36) ptr @_ZN3imp4Vec3aSEOS0_(ptr noundef nonnull align 8 dereferenceable(36), ptr noundef nonnull align 8 dereferenceable(36)) local_unnamed_addr #6 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp15RenderToCubeMap10setCubeMapESt10shared_ptrINS_14CubeMapSamplerEE(ptr noundef nonnull align 8 dereferenceable(812), ptr noundef) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt10shared_ptrIN3imp14CubeMapSamplerEEC2ERKS2_(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp14CubeMapSamplerELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3imp5State6createIJEEESt10shared_ptrIS0_EDpOT_(ptr dead_on_unwind noalias writable sret(%"class.std::shared_ptr.12") align 8) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(16) ptr @_ZNSt10shared_ptrIN3imp5StateEEaSEOS2_(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(16)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3imp6ObjectD2Ev(ptr noundef nonnull align 8 dereferenceable(24)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp5GraphELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp6CameraELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp5StateELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp12RenderTargetELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt12__shared_ptrIN3imp11RenderQueueELN9__gnu_cxx12_Lock_policyE2EED2Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #1 align 2

attributes #0 = { 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 #1 = { 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 #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { 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 #5 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { 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 #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 = !{!"vtable pointer", !7, i64 0}
!7 = !{!"Simple C++ TBAA"}
!8 = !{!9, !13, i64 24}
!9 = !{!"_ZTSN3imp15RenderToCubeMapE", !10, i64 0, !13, i64 24, !16, i64 32, !18, i64 48, !20, i64 64, !22, i64 80, !24, i64 168, !26, i64 184, !14, i64 200, !14, i64 440, !14, i64 680, !28, i64 776, !30, i64 808}
!10 = !{!"_ZTSN3imp6ObjectE", !11, i64 8}
!11 = !{!"_ZTSSt10shared_ptrIN3imp6ObjectEE", !12, i64 0}
!12 = !{!"_ZTSSt12__shared_ptrIN3imp6ObjectELN9__gnu_cxx12_Lock_policyE2EE", !13, i64 0, !15, i64 8}
!13 = !{!"any pointer", !14, i64 0}
!14 = !{!"omnipotent char", !7, i64 0}
!15 = !{!"_ZTSSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EE", !13, i64 0}
!16 = !{!"_ZTSSt10shared_ptrIN3imp5GraphEE", !17, i64 0}
!17 = !{!"_ZTSSt12__shared_ptrIN3imp5GraphELN9__gnu_cxx12_Lock_policyE2EE", !13, i64 0, !15, i64 8}
!18 = !{!"_ZTSSt10shared_ptrIN3imp11RenderQueueEE", !19, i64 0}
!19 = !{!"_ZTSSt12__shared_ptrIN3imp11RenderQueueELN9__gnu_cxx12_Lock_policyE2EE", !13, i64 0, !15, i64 8}
!20 = !{!"_ZTSSt10shared_ptrIN3imp14CubeMapSamplerEE", !21, i64 0}
!21 = !{!"_ZTSSt12__shared_ptrIN3imp14CubeMapSamplerELN9__gnu_cxx12_Lock_policyE2EE", !13, i64 0, !15, i64 8}
!22 = !{!"_ZTSN3imp7Matrix4E", !23, i64 0}
!23 = !{!"_ZTSN3imp6MatrixILi4ELi4EfEE", !10, i64 0, !14, i64 24}
!24 = !{!"_ZTSSt10shared_ptrIN3imp6CameraEE", !25, i64 0}
!25 = !{!"_ZTSSt12__shared_ptrIN3imp6CameraELN9__gnu_cxx12_Lock_policyE2EE", !13, i64 0, !15, i64 8}
!26 = !{!"_ZTSSt10shared_ptrIN3imp5StateEE", !27, i64 0}
!27 = !{!"_ZTSSt12__shared_ptrIN3imp5StateELN9__gnu_cxx12_Lock_policyE2EE", !13, i64 0, !15, i64 8}
!28 = !{!"_ZTSN3imp4Vec2E", !29, i64 0}
!29 = !{!"_ZTSN3imp3VecILi2EfEE", !10, i64 0, !14, i64 24}
!30 = !{!"float", !14, i64 0}
!31 = !{!9, !30, i64 808}
!32 = !{!30, !30, i64 0}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LCSSAPass,LoopSimplifyPass,LoopUnrollPass,SROAPass,SimplifyCFGPass,TailCallElimPass