; LLVM IR from drohmer/cgp :: library/cgp/16_drawable/mesh_drawable (mesh_drawable)

; 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::__cxx11::basic_string" = type { %"struct.std::__cxx11::basic_string<char>::_Alloc_hider", i64, %union.anon }
%"struct.std::__cxx11::basic_string<char>::_Alloc_hider" = type { ptr }
%union.anon = type { i64, [8 x i8] }
%"class.std::allocator" = type { i8 }
%"struct.std::_Rb_tree_const_iterator" = type { ptr }
%"struct.cgp::mesh_drawable" = type <{ %"struct.cgp::opengl_shader_structure", %"struct.cgp::opengl_texture_image_structure", %"class.std::map", %"struct.cgp::opengl_vbo_structure", %"struct.cgp::opengl_vbo_structure", %"struct.cgp::opengl_vbo_structure", %"struct.cgp::opengl_vbo_structure", %"class.std::vector", %"struct.cgp::opengl_ebo_structure", i32, %"struct.cgp::affine", %"struct.cgp::affine_rts", %"struct.cgp::matrix_stack", %"struct.cgp::material_mesh_drawable_phong", [4 x i8] }>
%"struct.cgp::opengl_shader_structure" = type { i32 }
%"struct.cgp::opengl_texture_image_structure" = type { i32, i32, i32, i32, i32 }
%"class.std::map" = type { %"class.std::_Rb_tree" }
%"class.std::_Rb_tree" = type { %"struct.std::_Rb_tree<std::__cxx11::basic_string<char>, std::pair<const std::__cxx11::basic_string<char>, cgp::opengl_texture_image_structure>, std::_Select1st<std::pair<const std::__cxx11::basic_string<char>, cgp::opengl_texture_image_structure>>, std::less<std::__cxx11::basic_string<char>>>::_Rb_tree_impl" }
%"struct.std::_Rb_tree<std::__cxx11::basic_string<char>, std::pair<const std::__cxx11::basic_string<char>, cgp::opengl_texture_image_structure>, std::_Select1st<std::pair<const std::__cxx11::basic_string<char>, cgp::opengl_texture_image_structure>>, std::less<std::__cxx11::basic_string<char>>>::_Rb_tree_impl" = type { [8 x i8], %"struct.std::_Rb_tree_header" }
%"struct.std::_Rb_tree_header" = type { %"struct.std::_Rb_tree_node_base", i64 }
%"struct.std::_Rb_tree_node_base" = type { i32, ptr, ptr, ptr }
%"struct.cgp::opengl_vbo_structure" = type { %"struct.cgp::opengl_gpu_buffer", i32 }
%"struct.cgp::opengl_gpu_buffer" = type { i32, i32, i32, %"struct.cgp::opengl_gpu_buffer_details" }
%"struct.cgp::opengl_gpu_buffer_details" = type { i32, i32, i32 }
%"class.std::vector" = type { %"struct.std::_Vector_base" }
%"struct.std::_Vector_base" = type { %"struct.std::_Vector_base<cgp::opengl_vbo_structure, std::allocator<cgp::opengl_vbo_structure>>::_Vector_impl" }
%"struct.std::_Vector_base<cgp::opengl_vbo_structure, std::allocator<cgp::opengl_vbo_structure>>::_Vector_impl" = type { %"struct.std::_Vector_base<cgp::opengl_vbo_structure, std::allocator<cgp::opengl_vbo_structure>>::_Vector_impl_data" }
%"struct.std::_Vector_base<cgp::opengl_vbo_structure, std::allocator<cgp::opengl_vbo_structure>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%"struct.cgp::opengl_ebo_structure" = type { %"struct.cgp::opengl_gpu_buffer" }
%"struct.cgp::affine" = type { %"struct.cgp::rotation_transform", %"struct.cgp::numarray_stack.6", float, %"struct.cgp::numarray_stack.6" }
%"struct.cgp::rotation_transform" = type { %"struct.cgp::quaternion" }
%"struct.cgp::quaternion" = type { %"struct.cgp::numarray_stack" }
%"struct.cgp::numarray_stack" = type { float, float, float, float }
%"struct.cgp::numarray_stack.6" = type { float, float, float }
%"struct.cgp::affine_rts" = type { %"struct.cgp::rotation_transform", %"struct.cgp::numarray_stack.6", float }
%"struct.cgp::matrix_stack" = type { %"struct.cgp::numarray_stack.7" }
%"struct.cgp::numarray_stack.7" = type { %"struct.cgp::numarray_stack", %"struct.cgp::numarray_stack", %"struct.cgp::numarray_stack", %"struct.cgp::numarray_stack" }
%"struct.cgp::material_mesh_drawable_phong" = type <{ %"struct.cgp::numarray_stack.6", float, %"struct.cgp::phong_parameters", %"struct.cgp::texture_settings_parameters", i8 }>
%"struct.cgp::phong_parameters" = type { float, float, float, float }
%"struct.cgp::texture_settings_parameters" = type { i8, i8, i8 }
%"struct.std::pair" = type <{ %"class.std::__cxx11::basic_string", %"struct.cgp::opengl_texture_image_structure", [4 x i8] }>

@.str.2 = external hidden unnamed_addr constant [101 x i8], align 1
@glad_glBindVertexArray = external global ptr, align 8
@__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj = external hidden unnamed_addr constant [5 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [42 x i8], align 1
@glad_glIsShader = external global ptr, align 8
@.str.12 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [43 x i8], align 1
@glad_glUseProgram = external global ptr, align 8
@_ZN3cgp29environment_generic_structure24default_expected_uniformE = external global i8, align 1
@glad_glActiveTexture = external global ptr, align 8
@.str.16 = external hidden unnamed_addr constant [14 x i8], align 1
@glad_glBindBuffer = external global ptr, align 8
@glad_glDrawElements = external global ptr, align 8
@glad_glDrawElementsInstanced = external global ptr, align 8

; Function Attrs: noreturn
declare void @_ZN3cgp10call_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_S7_S7_i(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(32), i32 noundef) #0

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef, ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #3 align 2

declare i32 @__gxx_personality_v0(...)

; Function Attrs: mustprogress nounwind uwtable
declare void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #2 align 2

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

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

declare void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(32), i32 noundef) #4

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj(ptr noundef nonnull align 8 dereferenceable(412) %0, ptr noundef nonnull align 8 dereferenceable(8) %1, i32 noundef %2, i1 noundef zeroext %3, ptr noundef nonnull align 8 dereferenceable(384) %4, i32 noundef %5) #3 personality ptr @__gxx_personality_v0 {
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca i8, align 1
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca %"class.std::__cxx11::basic_string", align 8
  %14 = alloca %"class.std::allocator", align 1
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca %"class.std::__cxx11::basic_string", align 8
  %18 = alloca %"class.std::allocator", align 1
  %19 = alloca %"class.std::__cxx11::basic_string", align 8
  %20 = alloca %"class.std::allocator", align 1
  %21 = alloca %"class.std::__cxx11::basic_string", align 8
  %22 = alloca %"class.std::allocator", align 1
  %23 = alloca %"class.std::__cxx11::basic_string", align 8
  %24 = alloca %"class.std::allocator", align 1
  %25 = alloca %"class.std::__cxx11::basic_string", align 8
  %26 = alloca %"class.std::allocator", align 1
  %27 = alloca %"class.std::__cxx11::basic_string", align 8
  %28 = alloca %"class.std::allocator", align 1
  %29 = alloca %"class.std::__cxx11::basic_string", align 8
  %30 = alloca %"class.std::allocator", align 1
  %31 = alloca %"class.std::__cxx11::basic_string", align 8
  %32 = alloca %"class.std::allocator", align 1
  %33 = alloca %"class.std::__cxx11::basic_string", align 8
  %34 = alloca %"class.std::allocator", align 1
  %35 = alloca %"class.std::__cxx11::basic_string", align 8
  %36 = alloca %"class.std::allocator", align 1
  %37 = alloca %"class.std::__cxx11::basic_string", align 8
  %38 = alloca %"class.std::allocator", align 1
  %39 = alloca %"class.std::__cxx11::basic_string", align 8
  %40 = alloca %"class.std::allocator", align 1
  %41 = alloca %"class.std::__cxx11::basic_string", align 8
  %42 = alloca %"class.std::allocator", align 1
  %43 = alloca %"class.std::__cxx11::basic_string", align 8
  %44 = alloca %"class.std::allocator", align 1
  %45 = alloca %"class.std::__cxx11::basic_string", align 8
  %46 = alloca %"class.std::allocator", align 1
  %47 = alloca %"class.std::__cxx11::basic_string", align 8
  %48 = alloca %"class.std::allocator", align 1
  %49 = alloca %"class.std::__cxx11::basic_string", align 8
  %50 = alloca %"class.std::allocator", align 1
  %51 = alloca %"class.std::__cxx11::basic_string", align 8
  %52 = alloca %"class.std::allocator", align 1
  %53 = alloca %"class.std::__cxx11::basic_string", align 8
  %54 = alloca %"class.std::allocator", align 1
  %55 = alloca %"class.std::__cxx11::basic_string", align 8
  %56 = alloca %"class.std::allocator", align 1
  %57 = alloca i32, align 4
  %58 = alloca ptr, align 8
  %59 = alloca %"struct.std::_Rb_tree_const_iterator", align 8
  %60 = alloca %"struct.std::_Rb_tree_const_iterator", align 8
  %61 = alloca ptr, align 8
  %62 = alloca ptr, align 8
  %63 = alloca ptr, align 8
  %64 = alloca %"class.std::__cxx11::basic_string", align 8
  %65 = alloca %"class.std::allocator", align 1
  %66 = alloca %"class.std::__cxx11::basic_string", align 8
  %67 = alloca %"class.std::allocator", align 1
  %68 = alloca %"class.std::__cxx11::basic_string", align 8
  %69 = alloca %"class.std::allocator", align 1
  %70 = alloca %"class.std::__cxx11::basic_string", align 8
  %71 = alloca %"class.std::allocator", align 1
  %72 = alloca %"class.std::__cxx11::basic_string", align 8
  %73 = alloca %"class.std::allocator", align 1
  %74 = alloca %"class.std::__cxx11::basic_string", align 8
  %75 = alloca %"class.std::allocator", align 1
  %76 = alloca %"class.std::__cxx11::basic_string", align 8
  %77 = alloca %"class.std::allocator", align 1
  %78 = alloca %"class.std::__cxx11::basic_string", align 8
  %79 = alloca %"class.std::allocator", align 1
  %80 = alloca %"class.std::__cxx11::basic_string", align 8
  %81 = alloca %"class.std::allocator", align 1
  %82 = alloca %"class.std::__cxx11::basic_string", align 8
  %83 = alloca %"class.std::allocator", align 1
  store ptr %0, ptr %7, align 8, !tbaa !5
  store ptr %1, ptr %8, align 8, !tbaa !5
  store i32 %2, ptr %9, align 4, !tbaa !9
  %84 = zext i1 %3 to i8
  store i8 %84, ptr %10, align 1, !tbaa !11
  store ptr %4, ptr %11, align 8, !tbaa !5
  store i32 %5, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr %13) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %14) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %14) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %13, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %14)
          to label %85 unwind label %100

85:                                               ; preds = %6
  call void @llvm.lifetime.start.p0(i64 32, ptr %17) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %18) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %18) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %17, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %18)
          to label %86 unwind label %104

86:                                               ; preds = %85
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %13, ptr noundef nonnull align 8 dereferenceable(32) %17, i32 noundef 152)
          to label %87 unwind label %108

87:                                               ; preds = %86
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %17) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %18) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %17) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %13) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %14) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %13) #5
  %88 = load ptr, ptr %7, align 8, !tbaa !5
  %89 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %88, i32 0, i32 3
  %90 = getelementptr inbounds %"struct.cgp::opengl_gpu_buffer", ptr %89, i32 0, i32 1
  %91 = load i32, ptr %90, align 4, !tbaa !13
  %92 = icmp eq i32 %91, 0
  br i1 %92, label %99, label %93

93:                                               ; preds = %87
  %94 = load ptr, ptr %7, align 8, !tbaa !5
  %95 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %94, i32 0, i32 8
  %96 = getelementptr inbounds %"struct.cgp::opengl_gpu_buffer", ptr %95, i32 0, i32 1
  %97 = load i32, ptr %96, align 4, !tbaa !13
  %98 = icmp eq i32 %97, 0
  br i1 %98, label %99, label %114

99:                                               ; preds = %93, %87
  br label %478

100:                                              ; preds = %6
  %101 = landingpad { ptr, i32 }
          cleanup
  %102 = extractvalue { ptr, i32 } %101, 0
  store ptr %102, ptr %15, align 8
  %103 = extractvalue { ptr, i32 } %101, 1
  store i32 %103, ptr %16, align 4
  br label %113

104:                                              ; preds = %85
  %105 = landingpad { ptr, i32 }
          cleanup
  %106 = extractvalue { ptr, i32 } %105, 0
  store ptr %106, ptr %15, align 8
  %107 = extractvalue { ptr, i32 } %105, 1
  store i32 %107, ptr %16, align 4
  br label %112

108:                                              ; preds = %86
  %109 = landingpad { ptr, i32 }
          cleanup
  %110 = extractvalue { ptr, i32 } %109, 0
  store ptr %110, ptr %15, align 8
  %111 = extractvalue { ptr, i32 } %109, 1
  store i32 %111, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %17) #5
  br label %112

112:                                              ; preds = %108, %104
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %18) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %17) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %13) #5
  br label %113

113:                                              ; preds = %112, %100
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %14) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %13) #5
  br label %480

114:                                              ; preds = %93
  %115 = load ptr, ptr %7, align 8, !tbaa !5
  %116 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %115, i32 0, i32 0
  %117 = getelementptr inbounds %"struct.cgp::opengl_shader_structure", ptr %116, i32 0, i32 0
  %118 = load i32, ptr %117, align 8, !tbaa !16
  %119 = icmp ne i32 %118, 0
  %120 = zext i1 %119 to i32
  %121 = icmp eq i32 %120, 0
  br i1 %121, label %122, label %152

122:                                              ; preds = %114
  call void @llvm.lifetime.start.p0(i64 32, ptr %19) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %20) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %20) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %19, ptr noundef @.str.10, ptr noundef nonnull align 1 dereferenceable(1) %20)
          to label %123 unwind label %128

123:                                              ; preds = %122
  call void @llvm.lifetime.start.p0(i64 32, ptr %21) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %22) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %22) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %21, ptr noundef @.str.11, ptr noundef nonnull align 1 dereferenceable(1) %22)
          to label %124 unwind label %132

124:                                              ; preds = %123
  call void @llvm.lifetime.start.p0(i64 32, ptr %23) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %24) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %24) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %23, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %24)
          to label %125 unwind label %136

125:                                              ; preds = %124
  call void @llvm.lifetime.start.p0(i64 32, ptr %25) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %26) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %26) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %25, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %26)
          to label %126 unwind label %140

126:                                              ; preds = %125
  invoke void @_ZN3cgp10call_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_S7_S7_i(ptr noundef nonnull align 8 dereferenceable(32) %19, ptr noundef nonnull align 8 dereferenceable(32) %21, ptr noundef nonnull align 8 dereferenceable(32) %23, ptr noundef nonnull align 8 dereferenceable(32) %25, i32 noundef 160) #6
          to label %127 unwind label %144

127:                                              ; preds = %126
  unreachable

128:                                              ; preds = %122
  %129 = landingpad { ptr, i32 }
          cleanup
  %130 = extractvalue { ptr, i32 } %129, 0
  store ptr %130, ptr %15, align 8
  %131 = extractvalue { ptr, i32 } %129, 1
  store i32 %131, ptr %16, align 4
  br label %151

132:                                              ; preds = %123
  %133 = landingpad { ptr, i32 }
          cleanup
  %134 = extractvalue { ptr, i32 } %133, 0
  store ptr %134, ptr %15, align 8
  %135 = extractvalue { ptr, i32 } %133, 1
  store i32 %135, ptr %16, align 4
  br label %150

136:                                              ; preds = %124
  %137 = landingpad { ptr, i32 }
          cleanup
  %138 = extractvalue { ptr, i32 } %137, 0
  store ptr %138, ptr %15, align 8
  %139 = extractvalue { ptr, i32 } %137, 1
  store i32 %139, ptr %16, align 4
  br label %149

140:                                              ; preds = %125
  %141 = landingpad { ptr, i32 }
          cleanup
  %142 = extractvalue { ptr, i32 } %141, 0
  store ptr %142, ptr %15, align 8
  %143 = extractvalue { ptr, i32 } %141, 1
  store i32 %143, ptr %16, align 4
  br label %148

144:                                              ; preds = %126
  %145 = landingpad { ptr, i32 }
          cleanup
  %146 = extractvalue { ptr, i32 } %145, 0
  store ptr %146, ptr %15, align 8
  %147 = extractvalue { ptr, i32 } %145, 1
  store i32 %147, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %25) #5
  br label %148

148:                                              ; preds = %144, %140
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %26) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %26) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %25) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %23) #5
  br label %149

149:                                              ; preds = %148, %136
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %24) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %24) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %23) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %21) #5
  br label %150

150:                                              ; preds = %149, %132
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %22) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %21) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %19) #5
  br label %151

151:                                              ; preds = %150, %128
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %20) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %19) #5
  br label %480

152:                                              ; preds = %114
  %153 = load ptr, ptr @glad_glIsShader, align 8, !tbaa !5
  %154 = load ptr, ptr %7, align 8, !tbaa !5
  %155 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %154, i32 0, i32 0
  %156 = getelementptr inbounds %"struct.cgp::opengl_shader_structure", ptr %155, i32 0, i32 0
  %157 = load i32, ptr %156, align 8, !tbaa !16
  %158 = call zeroext i8 %153(i32 noundef %157)
  %159 = icmp ne i8 %158, 0
  %160 = xor i1 %159, true
  %161 = zext i1 %160 to i32
  %162 = icmp eq i32 %161, 0
  br i1 %162, label %163, label %193

163:                                              ; preds = %152
  call void @llvm.lifetime.start.p0(i64 32, ptr %27) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %28) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %28) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %27, ptr noundef @.str.12, ptr noundef nonnull align 1 dereferenceable(1) %28)
          to label %164 unwind label %169

164:                                              ; preds = %163
  call void @llvm.lifetime.start.p0(i64 32, ptr %29) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %30) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %30) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %29, ptr noundef @.str.13, ptr noundef nonnull align 1 dereferenceable(1) %30)
          to label %165 unwind label %173

165:                                              ; preds = %164
  call void @llvm.lifetime.start.p0(i64 32, ptr %31) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %32) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %32) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %31, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %32)
          to label %166 unwind label %177

166:                                              ; preds = %165
  call void @llvm.lifetime.start.p0(i64 32, ptr %33) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %34) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %34) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %33, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %34)
          to label %167 unwind label %181

167:                                              ; preds = %166
  invoke void @_ZN3cgp10call_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_S7_S7_i(ptr noundef nonnull align 8 dereferenceable(32) %27, ptr noundef nonnull align 8 dereferenceable(32) %29, ptr noundef nonnull align 8 dereferenceable(32) %31, ptr noundef nonnull align 8 dereferenceable(32) %33, i32 noundef 161) #6
          to label %168 unwind label %185

168:                                              ; preds = %167
  unreachable

169:                                              ; preds = %163
  %170 = landingpad { ptr, i32 }
          cleanup
  %171 = extractvalue { ptr, i32 } %170, 0
  store ptr %171, ptr %15, align 8
  %172 = extractvalue { ptr, i32 } %170, 1
  store i32 %172, ptr %16, align 4
  br label %192

173:                                              ; preds = %164
  %174 = landingpad { ptr, i32 }
          cleanup
  %175 = extractvalue { ptr, i32 } %174, 0
  store ptr %175, ptr %15, align 8
  %176 = extractvalue { ptr, i32 } %174, 1
  store i32 %176, ptr %16, align 4
  br label %191

177:                                              ; preds = %165
  %178 = landingpad { ptr, i32 }
          cleanup
  %179 = extractvalue { ptr, i32 } %178, 0
  store ptr %179, ptr %15, align 8
  %180 = extractvalue { ptr, i32 } %178, 1
  store i32 %180, ptr %16, align 4
  br label %190

181:                                              ; preds = %166
  %182 = landingpad { ptr, i32 }
          cleanup
  %183 = extractvalue { ptr, i32 } %182, 0
  store ptr %183, ptr %15, align 8
  %184 = extractvalue { ptr, i32 } %182, 1
  store i32 %184, ptr %16, align 4
  br label %189

185:                                              ; preds = %167
  %186 = landingpad { ptr, i32 }
          cleanup
  %187 = extractvalue { ptr, i32 } %186, 0
  store ptr %187, ptr %15, align 8
  %188 = extractvalue { ptr, i32 } %186, 1
  store i32 %188, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %33) #5
  br label %189

189:                                              ; preds = %185, %181
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %34) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %34) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %33) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %31) #5
  br label %190

190:                                              ; preds = %189, %177
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %32) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %32) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %31) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %29) #5
  br label %191

191:                                              ; preds = %190, %173
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %30) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %29) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %27) #5
  br label %192

192:                                              ; preds = %191, %169
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %28) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %27) #5
  br label %480

193:                                              ; preds = %152
  %194 = load ptr, ptr %7, align 8, !tbaa !5
  %195 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %194, i32 0, i32 1
  %196 = getelementptr inbounds %"struct.cgp::opengl_texture_image_structure", ptr %195, i32 0, i32 0
  %197 = load i32, ptr %196, align 4, !tbaa !47
  %198 = icmp ne i32 %197, 0
  %199 = zext i1 %198 to i32
  %200 = icmp eq i32 %199, 0
  br i1 %200, label %201, label %231

201:                                              ; preds = %193
  call void @llvm.lifetime.start.p0(i64 32, ptr %35) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %36) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %36) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %35, ptr noundef @.str.14, ptr noundef nonnull align 1 dereferenceable(1) %36)
          to label %202 unwind label %207

202:                                              ; preds = %201
  call void @llvm.lifetime.start.p0(i64 32, ptr %37) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %38) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %38) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %37, ptr noundef @.str.15, ptr noundef nonnull align 1 dereferenceable(1) %38)
          to label %203 unwind label %211

203:                                              ; preds = %202
  call void @llvm.lifetime.start.p0(i64 32, ptr %39) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %40) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %40) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %39, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %40)
          to label %204 unwind label %215

204:                                              ; preds = %203
  call void @llvm.lifetime.start.p0(i64 32, ptr %41) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %42) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %42) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %41, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %42)
          to label %205 unwind label %219

205:                                              ; preds = %204
  invoke void @_ZN3cgp10call_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_S7_S7_i(ptr noundef nonnull align 8 dereferenceable(32) %35, ptr noundef nonnull align 8 dereferenceable(32) %37, ptr noundef nonnull align 8 dereferenceable(32) %39, ptr noundef nonnull align 8 dereferenceable(32) %41, i32 noundef 162) #6
          to label %206 unwind label %223

206:                                              ; preds = %205
  unreachable

207:                                              ; preds = %201
  %208 = landingpad { ptr, i32 }
          cleanup
  %209 = extractvalue { ptr, i32 } %208, 0
  store ptr %209, ptr %15, align 8
  %210 = extractvalue { ptr, i32 } %208, 1
  store i32 %210, ptr %16, align 4
  br label %230

211:                                              ; preds = %202
  %212 = landingpad { ptr, i32 }
          cleanup
  %213 = extractvalue { ptr, i32 } %212, 0
  store ptr %213, ptr %15, align 8
  %214 = extractvalue { ptr, i32 } %212, 1
  store i32 %214, ptr %16, align 4
  br label %229

215:                                              ; preds = %203
  %216 = landingpad { ptr, i32 }
          cleanup
  %217 = extractvalue { ptr, i32 } %216, 0
  store ptr %217, ptr %15, align 8
  %218 = extractvalue { ptr, i32 } %216, 1
  store i32 %218, ptr %16, align 4
  br label %228

219:                                              ; preds = %204
  %220 = landingpad { ptr, i32 }
          cleanup
  %221 = extractvalue { ptr, i32 } %220, 0
  store ptr %221, ptr %15, align 8
  %222 = extractvalue { ptr, i32 } %220, 1
  store i32 %222, ptr %16, align 4
  br label %227

223:                                              ; preds = %205
  %224 = landingpad { ptr, i32 }
          cleanup
  %225 = extractvalue { ptr, i32 } %224, 0
  store ptr %225, ptr %15, align 8
  %226 = extractvalue { ptr, i32 } %224, 1
  store i32 %226, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %41) #5
  br label %227

227:                                              ; preds = %223, %219
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %42) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %42) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %41) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %39) #5
  br label %228

228:                                              ; preds = %227, %215
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %40) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %40) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %39) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %37) #5
  br label %229

229:                                              ; preds = %228, %211
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %38) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %38) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %37) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %35) #5
  br label %230

230:                                              ; preds = %229, %207
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %36) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %36) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %35) #5
  br label %480

231:                                              ; preds = %193
  %232 = load ptr, ptr @glad_glUseProgram, align 8, !tbaa !5
  %233 = load ptr, ptr %7, align 8, !tbaa !5
  %234 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %233, i32 0, i32 0
  %235 = getelementptr inbounds %"struct.cgp::opengl_shader_structure", ptr %234, i32 0, i32 0
  %236 = load i32, ptr %235, align 8, !tbaa !16
  call void %232(i32 noundef %236)
  call void @llvm.lifetime.start.p0(i64 32, ptr %43) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %44) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %44) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %43, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %44)
          to label %237 unwind label %288

237:                                              ; preds = %231
  call void @llvm.lifetime.start.p0(i64 32, ptr %45) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %46) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %46) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %45, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %46)
          to label %238 unwind label %292

238:                                              ; preds = %237
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %43, ptr noundef nonnull align 8 dereferenceable(32) %45, i32 noundef 166)
          to label %239 unwind label %296

239:                                              ; preds = %238
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %45) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %46) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %46) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %45) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %43) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %44) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %44) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %43) #5
  %240 = load ptr, ptr %7, align 8, !tbaa !5
  %241 = load i8, ptr %10, align 1, !tbaa !11, !range !48, !noundef !49
  %242 = trunc i8 %241 to i1
  call void @_ZNK3cgp13mesh_drawable19send_opengl_uniformEb(ptr noundef nonnull align 8 dereferenceable(412) %240, i1 noundef zeroext %242)
  %243 = load ptr, ptr %8, align 8, !tbaa !5
  %244 = load ptr, ptr %7, align 8, !tbaa !5
  %245 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %244, i32 0, i32 0
  %246 = load i8, ptr %10, align 1, !tbaa !11, !range !48, !noundef !49
  %247 = trunc i8 %246 to i1
  br i1 %247, label %248, label %252

248:                                              ; preds = %239
  %249 = load ptr, ptr %8, align 8, !tbaa !5
  %250 = load i8, ptr @_ZN3cgp29environment_generic_structure24default_expected_uniformE, align 1, !tbaa !11, !range !48, !noundef !49
  %251 = trunc i8 %250 to i1
  br label %252

252:                                              ; preds = %248, %239
  %253 = phi i1 [ false, %239 ], [ %251, %248 ]
  %254 = load ptr, ptr %243, align 8, !tbaa !50
  %255 = getelementptr inbounds ptr, ptr %254, i64 0
  %256 = load ptr, ptr %255, align 8
  call void %256(ptr noundef nonnull align 8 dereferenceable(8) %243, ptr noundef nonnull align 4 dereferenceable(4) %245, i1 noundef zeroext %253)
  %257 = load ptr, ptr %11, align 8, !tbaa !5
  %258 = load ptr, ptr %7, align 8, !tbaa !5
  %259 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %258, i32 0, i32 0
  %260 = load i8, ptr %10, align 1, !tbaa !11, !range !48, !noundef !49
  %261 = trunc i8 %260 to i1
  call void @_ZNK3cgp25uniform_generic_structure19send_opengl_uniformERKNS_23opengl_shader_structureEb(ptr noundef nonnull align 8 dereferenceable(384) %257, ptr noundef nonnull align 4 dereferenceable(4) %259, i1 noundef zeroext %261)
  %262 = load ptr, ptr @glad_glActiveTexture, align 8, !tbaa !5
  call void %262(i32 noundef 33984)
  call void @llvm.lifetime.start.p0(i64 32, ptr %47) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %48) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %48) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %47, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %48)
          to label %263 unwind label %302

263:                                              ; preds = %252
  call void @llvm.lifetime.start.p0(i64 32, ptr %49) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %50) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %50) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %49, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %50)
          to label %264 unwind label %306

264:                                              ; preds = %263
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %47, ptr noundef nonnull align 8 dereferenceable(32) %49, i32 noundef 183)
          to label %265 unwind label %310

265:                                              ; preds = %264
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %49) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %50) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %50) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %49) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %47) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %48) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %48) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %47) #5
  %266 = load ptr, ptr %7, align 8, !tbaa !5
  %267 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %266, i32 0, i32 1
  call void @_ZNK3cgp30opengl_texture_image_structure4bindEv(ptr noundef nonnull align 4 dereferenceable(20) %267)
  %268 = load ptr, ptr %7, align 8, !tbaa !5
  %269 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %268, i32 0, i32 0
  call void @llvm.lifetime.start.p0(i64 32, ptr %51) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %52) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %52) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %51, ptr noundef @.str.16, ptr noundef nonnull align 1 dereferenceable(1) %52)
          to label %270 unwind label %316

270:                                              ; preds = %265
  %271 = load i8, ptr %10, align 1, !tbaa !11, !range !48, !noundef !49
  %272 = trunc i8 %271 to i1
  invoke void @_ZN3cgp14opengl_uniformERKNS_23opengl_shader_structureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEib(ptr noundef nonnull align 4 dereferenceable(4) %269, ptr noundef nonnull align 8 dereferenceable(32) %51, i32 noundef 0, i1 noundef zeroext %272)
          to label %273 unwind label %320

273:                                              ; preds = %270
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %51) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %52) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %52) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %51) #5
  call void @llvm.lifetime.start.p0(i64 32, ptr %53) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %54) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %54) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %53, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %54)
          to label %274 unwind label %325

274:                                              ; preds = %273
  call void @llvm.lifetime.start.p0(i64 32, ptr %55) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %56) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %56) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %55, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %56)
          to label %275 unwind label %329

275:                                              ; preds = %274
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %53, ptr noundef nonnull align 8 dereferenceable(32) %55, i32 noundef 185)
          to label %276 unwind label %333

276:                                              ; preds = %275
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %55) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %56) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %56) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %55) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %53) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %54) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %54) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %53) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #5
  store i32 1, ptr %57, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #5
  %277 = load ptr, ptr %7, align 8, !tbaa !5
  %278 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %277, i32 0, i32 2
  store ptr %278, ptr %58, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #5
  %279 = load ptr, ptr %58, align 8, !tbaa !5
  %280 = call ptr @_ZNKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureESt4lessIS5_ESaISt4pairIKS5_S7_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(48) %279) #5
  %281 = getelementptr inbounds %"struct.std::_Rb_tree_const_iterator", ptr %59, i32 0, i32 0
  store ptr %280, ptr %281, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #5
  %282 = load ptr, ptr %58, align 8, !tbaa !5
  %283 = call ptr @_ZNKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureESt4lessIS5_ESaISt4pairIKS5_S7_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(48) %282) #5
  %284 = getelementptr inbounds %"struct.std::_Rb_tree_const_iterator", ptr %60, i32 0, i32 0
  store ptr %283, ptr %284, align 8
  br label %285

285:                                              ; preds = %360, %276
  %286 = call noundef zeroext i1 @_ZStneRKSt23_Rb_tree_const_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureEEESD_(ptr noundef nonnull align 8 dereferenceable(8) %59, ptr noundef nonnull align 8 dereferenceable(8) %60) #5
  br i1 %286, label %339, label %287

287:                                              ; preds = %285
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #5
  br label %376

288:                                              ; preds = %231
  %289 = landingpad { ptr, i32 }
          cleanup
  %290 = extractvalue { ptr, i32 } %289, 0
  store ptr %290, ptr %15, align 8
  %291 = extractvalue { ptr, i32 } %289, 1
  store i32 %291, ptr %16, align 4
  br label %301

292:                                              ; preds = %237
  %293 = landingpad { ptr, i32 }
          cleanup
  %294 = extractvalue { ptr, i32 } %293, 0
  store ptr %294, ptr %15, align 8
  %295 = extractvalue { ptr, i32 } %293, 1
  store i32 %295, ptr %16, align 4
  br label %300

296:                                              ; preds = %238
  %297 = landingpad { ptr, i32 }
          cleanup
  %298 = extractvalue { ptr, i32 } %297, 0
  store ptr %298, ptr %15, align 8
  %299 = extractvalue { ptr, i32 } %297, 1
  store i32 %299, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %45) #5
  br label %300

300:                                              ; preds = %296, %292
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %46) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %46) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %45) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %43) #5
  br label %301

301:                                              ; preds = %300, %288
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %44) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %44) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %43) #5
  br label %480

302:                                              ; preds = %252
  %303 = landingpad { ptr, i32 }
          cleanup
  %304 = extractvalue { ptr, i32 } %303, 0
  store ptr %304, ptr %15, align 8
  %305 = extractvalue { ptr, i32 } %303, 1
  store i32 %305, ptr %16, align 4
  br label %315

306:                                              ; preds = %263
  %307 = landingpad { ptr, i32 }
          cleanup
  %308 = extractvalue { ptr, i32 } %307, 0
  store ptr %308, ptr %15, align 8
  %309 = extractvalue { ptr, i32 } %307, 1
  store i32 %309, ptr %16, align 4
  br label %314

310:                                              ; preds = %264
  %311 = landingpad { ptr, i32 }
          cleanup
  %312 = extractvalue { ptr, i32 } %311, 0
  store ptr %312, ptr %15, align 8
  %313 = extractvalue { ptr, i32 } %311, 1
  store i32 %313, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %49) #5
  br label %314

314:                                              ; preds = %310, %306
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %50) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %50) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %49) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %47) #5
  br label %315

315:                                              ; preds = %314, %302
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %48) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %48) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %47) #5
  br label %480

316:                                              ; preds = %265
  %317 = landingpad { ptr, i32 }
          cleanup
  %318 = extractvalue { ptr, i32 } %317, 0
  store ptr %318, ptr %15, align 8
  %319 = extractvalue { ptr, i32 } %317, 1
  store i32 %319, ptr %16, align 4
  br label %324

320:                                              ; preds = %270
  %321 = landingpad { ptr, i32 }
          cleanup
  %322 = extractvalue { ptr, i32 } %321, 0
  store ptr %322, ptr %15, align 8
  %323 = extractvalue { ptr, i32 } %321, 1
  store i32 %323, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %51) #5
  br label %324

324:                                              ; preds = %320, %316
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %52) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %52) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %51) #5
  br label %480

325:                                              ; preds = %273
  %326 = landingpad { ptr, i32 }
          cleanup
  %327 = extractvalue { ptr, i32 } %326, 0
  store ptr %327, ptr %15, align 8
  %328 = extractvalue { ptr, i32 } %326, 1
  store i32 %328, ptr %16, align 4
  br label %338

329:                                              ; preds = %274
  %330 = landingpad { ptr, i32 }
          cleanup
  %331 = extractvalue { ptr, i32 } %330, 0
  store ptr %331, ptr %15, align 8
  %332 = extractvalue { ptr, i32 } %330, 1
  store i32 %332, ptr %16, align 4
  br label %337

333:                                              ; preds = %275
  %334 = landingpad { ptr, i32 }
          cleanup
  %335 = extractvalue { ptr, i32 } %334, 0
  store ptr %335, ptr %15, align 8
  %336 = extractvalue { ptr, i32 } %334, 1
  store i32 %336, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %55) #5
  br label %337

337:                                              ; preds = %333, %329
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %56) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %56) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %55) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %53) #5
  br label %338

338:                                              ; preds = %337, %325
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %54) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %54) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %53) #5
  br label %480

339:                                              ; preds = %285
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #5
  %340 = call noundef nonnull align 8 dereferenceable(52) ptr @_ZNKSt23_Rb_tree_const_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureEEEdeEv(ptr noundef nonnull align 8 dereferenceable(8) %59) #5
  store ptr %340, ptr %61, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #5
  %341 = load ptr, ptr %61, align 8, !tbaa !5
  %342 = getelementptr inbounds %"struct.std::pair", ptr %341, i32 0, i32 0
  store ptr %342, ptr %62, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #5
  %343 = load ptr, ptr %61, align 8, !tbaa !5
  %344 = getelementptr inbounds %"struct.std::pair", ptr %343, i32 0, i32 1
  store ptr %344, ptr %63, align 8, !tbaa !5
  %345 = load ptr, ptr @glad_glActiveTexture, align 8, !tbaa !5
  %346 = load i32, ptr %57, align 4, !tbaa !9
  %347 = add nsw i32 33984, %346
  call void %345(i32 noundef %347)
  call void @llvm.lifetime.start.p0(i64 32, ptr %64) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %65) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %65) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %64, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %65)
          to label %348 unwind label %362

348:                                              ; preds = %339
  call void @llvm.lifetime.start.p0(i64 32, ptr %66) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %67) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %67) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %66, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %67)
          to label %349 unwind label %366

349:                                              ; preds = %348
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %64, ptr noundef nonnull align 8 dereferenceable(32) %66, i32 noundef 194)
          to label %350 unwind label %370

350:                                              ; preds = %349
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %66) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %67) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %67) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %66) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %64) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %65) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %65) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %64) #5
  %351 = load ptr, ptr %63, align 8, !tbaa !5
  call void @_ZNK3cgp30opengl_texture_image_structure4bindEv(ptr noundef nonnull align 4 dereferenceable(20) %351)
  %352 = load ptr, ptr %7, align 8, !tbaa !5
  %353 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %352, i32 0, i32 0
  %354 = load ptr, ptr %62, align 8, !tbaa !5
  %355 = load i32, ptr %57, align 4, !tbaa !9
  %356 = load i8, ptr %10, align 1, !tbaa !11, !range !48, !noundef !49
  %357 = trunc i8 %356 to i1
  call void @_ZN3cgp14opengl_uniformERKNS_23opengl_shader_structureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEib(ptr noundef nonnull align 4 dereferenceable(4) %353, ptr noundef nonnull align 8 dereferenceable(32) %354, i32 noundef %355, i1 noundef zeroext %357)
  %358 = load i32, ptr %57, align 4, !tbaa !9
  %359 = add nsw i32 %358, 1
  store i32 %359, ptr %57, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #5
  br label %360

360:                                              ; preds = %350
  %361 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZNSt23_Rb_tree_const_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureEEEppEv(ptr noundef nonnull align 8 dereferenceable(8) %59) #5
  br label %285

362:                                              ; preds = %339
  %363 = landingpad { ptr, i32 }
          cleanup
  %364 = extractvalue { ptr, i32 } %363, 0
  store ptr %364, ptr %15, align 8
  %365 = extractvalue { ptr, i32 } %363, 1
  store i32 %365, ptr %16, align 4
  br label %375

366:                                              ; preds = %348
  %367 = landingpad { ptr, i32 }
          cleanup
  %368 = extractvalue { ptr, i32 } %367, 0
  store ptr %368, ptr %15, align 8
  %369 = extractvalue { ptr, i32 } %367, 1
  store i32 %369, ptr %16, align 4
  br label %374

370:                                              ; preds = %349
  %371 = landingpad { ptr, i32 }
          cleanup
  %372 = extractvalue { ptr, i32 } %371, 0
  store ptr %372, ptr %15, align 8
  %373 = extractvalue { ptr, i32 } %371, 1
  store i32 %373, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %66) #5
  br label %374

374:                                              ; preds = %370, %366
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %67) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %67) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %66) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %64) #5
  br label %375

375:                                              ; preds = %374, %362
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %65) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %65) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %64) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #5
  br label %479

376:                                              ; preds = %287
  %377 = load ptr, ptr @glad_glBindVertexArray, align 8, !tbaa !5
  %378 = load ptr, ptr %7, align 8, !tbaa !5
  %379 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %378, i32 0, i32 9
  %380 = load i32, ptr %379, align 8, !tbaa !52
  call void %377(i32 noundef %380)
  call void @llvm.lifetime.start.p0(i64 32, ptr %68) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %69) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %69) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %68, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %69)
          to label %381 unwind label %405

381:                                              ; preds = %376
  call void @llvm.lifetime.start.p0(i64 32, ptr %70) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %71) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %71) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %70, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %71)
          to label %382 unwind label %409

382:                                              ; preds = %381
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %68, ptr noundef nonnull align 8 dereferenceable(32) %70, i32 noundef 205)
          to label %383 unwind label %413

383:                                              ; preds = %382
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %70) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %71) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %71) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %70) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %68) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %69) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %69) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %68) #5
  %384 = load ptr, ptr @glad_glBindBuffer, align 8, !tbaa !5
  %385 = load ptr, ptr %7, align 8, !tbaa !5
  %386 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %385, i32 0, i32 8
  %387 = getelementptr inbounds %"struct.cgp::opengl_gpu_buffer", ptr %386, i32 0, i32 0
  %388 = load i32, ptr %387, align 8, !tbaa !53
  call void %384(i32 noundef 34963, i32 noundef %388)
  call void @llvm.lifetime.start.p0(i64 32, ptr %72) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %73) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %73) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %72, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %73)
          to label %389 unwind label %419

389:                                              ; preds = %383
  call void @llvm.lifetime.start.p0(i64 32, ptr %74) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %75) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %75) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %74, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %75)
          to label %390 unwind label %423

390:                                              ; preds = %389
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %72, ptr noundef nonnull align 8 dereferenceable(32) %74, i32 noundef 206)
          to label %391 unwind label %427

391:                                              ; preds = %390
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %74) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %75) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %75) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %74) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %72) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %73) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %73) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %72) #5
  %392 = load i32, ptr %9, align 4, !tbaa !9
  %393 = icmp sle i32 %392, 1
  br i1 %393, label %394, label %447

394:                                              ; preds = %391
  %395 = load ptr, ptr @glad_glDrawElements, align 8, !tbaa !5
  %396 = load i32, ptr %12, align 4, !tbaa !9
  %397 = load ptr, ptr %7, align 8, !tbaa !5
  %398 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %397, i32 0, i32 8
  %399 = getelementptr inbounds %"struct.cgp::opengl_gpu_buffer", ptr %398, i32 0, i32 1
  %400 = load i32, ptr %399, align 4, !tbaa !13
  %401 = mul i32 %400, 3
  call void %395(i32 noundef %396, i32 noundef %401, i32 noundef 5125, ptr noundef null)
  call void @llvm.lifetime.start.p0(i64 32, ptr %76) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %77) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %77) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %76, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %77)
          to label %402 unwind label %433

402:                                              ; preds = %394
  call void @llvm.lifetime.start.p0(i64 32, ptr %78) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %79) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %79) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %78, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %79)
          to label %403 unwind label %437

403:                                              ; preds = %402
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %76, ptr noundef nonnull align 8 dereferenceable(32) %78, i32 noundef 212)
          to label %404 unwind label %441

404:                                              ; preds = %403
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %78) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %79) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %79) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %78) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %76) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %77) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %77) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %76) #5
  br label %473

405:                                              ; preds = %376
  %406 = landingpad { ptr, i32 }
          cleanup
  %407 = extractvalue { ptr, i32 } %406, 0
  store ptr %407, ptr %15, align 8
  %408 = extractvalue { ptr, i32 } %406, 1
  store i32 %408, ptr %16, align 4
  br label %418

409:                                              ; preds = %381
  %410 = landingpad { ptr, i32 }
          cleanup
  %411 = extractvalue { ptr, i32 } %410, 0
  store ptr %411, ptr %15, align 8
  %412 = extractvalue { ptr, i32 } %410, 1
  store i32 %412, ptr %16, align 4
  br label %417

413:                                              ; preds = %382
  %414 = landingpad { ptr, i32 }
          cleanup
  %415 = extractvalue { ptr, i32 } %414, 0
  store ptr %415, ptr %15, align 8
  %416 = extractvalue { ptr, i32 } %414, 1
  store i32 %416, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %70) #5
  br label %417

417:                                              ; preds = %413, %409
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %71) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %71) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %70) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %68) #5
  br label %418

418:                                              ; preds = %417, %405
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %69) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %69) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %68) #5
  br label %479

419:                                              ; preds = %383
  %420 = landingpad { ptr, i32 }
          cleanup
  %421 = extractvalue { ptr, i32 } %420, 0
  store ptr %421, ptr %15, align 8
  %422 = extractvalue { ptr, i32 } %420, 1
  store i32 %422, ptr %16, align 4
  br label %432

423:                                              ; preds = %389
  %424 = landingpad { ptr, i32 }
          cleanup
  %425 = extractvalue { ptr, i32 } %424, 0
  store ptr %425, ptr %15, align 8
  %426 = extractvalue { ptr, i32 } %424, 1
  store i32 %426, ptr %16, align 4
  br label %431

427:                                              ; preds = %390
  %428 = landingpad { ptr, i32 }
          cleanup
  %429 = extractvalue { ptr, i32 } %428, 0
  store ptr %429, ptr %15, align 8
  %430 = extractvalue { ptr, i32 } %428, 1
  store i32 %430, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %74) #5
  br label %431

431:                                              ; preds = %427, %423
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %75) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %75) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %74) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %72) #5
  br label %432

432:                                              ; preds = %431, %419
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %73) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %73) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %72) #5
  br label %479

433:                                              ; preds = %394
  %434 = landingpad { ptr, i32 }
          cleanup
  %435 = extractvalue { ptr, i32 } %434, 0
  store ptr %435, ptr %15, align 8
  %436 = extractvalue { ptr, i32 } %434, 1
  store i32 %436, ptr %16, align 4
  br label %446

437:                                              ; preds = %402
  %438 = landingpad { ptr, i32 }
          cleanup
  %439 = extractvalue { ptr, i32 } %438, 0
  store ptr %439, ptr %15, align 8
  %440 = extractvalue { ptr, i32 } %438, 1
  store i32 %440, ptr %16, align 4
  br label %445

441:                                              ; preds = %403
  %442 = landingpad { ptr, i32 }
          cleanup
  %443 = extractvalue { ptr, i32 } %442, 0
  store ptr %443, ptr %15, align 8
  %444 = extractvalue { ptr, i32 } %442, 1
  store i32 %444, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %78) #5
  br label %445

445:                                              ; preds = %441, %437
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %79) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %79) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %78) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %76) #5
  br label %446

446:                                              ; preds = %445, %433
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %77) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %77) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %76) #5
  br label %479

447:                                              ; preds = %391
  %448 = load ptr, ptr @glad_glDrawElementsInstanced, align 8, !tbaa !5
  %449 = load i32, ptr %12, align 4, !tbaa !9
  %450 = load ptr, ptr %7, align 8, !tbaa !5
  %451 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %450, i32 0, i32 8
  %452 = getelementptr inbounds %"struct.cgp::opengl_gpu_buffer", ptr %451, i32 0, i32 1
  %453 = load i32, ptr %452, align 4, !tbaa !13
  %454 = mul i32 %453, 3
  %455 = load i32, ptr %9, align 4, !tbaa !9
  call void %448(i32 noundef %449, i32 noundef %454, i32 noundef 5125, ptr noundef null, i32 noundef %455)
  call void @llvm.lifetime.start.p0(i64 32, ptr %80) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %81) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %81) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %80, ptr noundef @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %81)
          to label %456 unwind label %459

456:                                              ; preds = %447
  call void @llvm.lifetime.start.p0(i64 32, ptr %82) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr %83) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %83) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %82, ptr noundef @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %83)
          to label %457 unwind label %463

457:                                              ; preds = %456
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %80, ptr noundef nonnull align 8 dereferenceable(32) %82, i32 noundef 215)
          to label %458 unwind label %467

458:                                              ; preds = %457
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %82) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %83) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %83) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %82) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %80) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %81) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %81) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %80) #5
  br label %473

459:                                              ; preds = %447
  %460 = landingpad { ptr, i32 }
          cleanup
  %461 = extractvalue { ptr, i32 } %460, 0
  store ptr %461, ptr %15, align 8
  %462 = extractvalue { ptr, i32 } %460, 1
  store i32 %462, ptr %16, align 4
  br label %472

463:                                              ; preds = %456
  %464 = landingpad { ptr, i32 }
          cleanup
  %465 = extractvalue { ptr, i32 } %464, 0
  store ptr %465, ptr %15, align 8
  %466 = extractvalue { ptr, i32 } %464, 1
  store i32 %466, ptr %16, align 4
  br label %471

467:                                              ; preds = %457
  %468 = landingpad { ptr, i32 }
          cleanup
  %469 = extractvalue { ptr, i32 } %468, 0
  store ptr %469, ptr %15, align 8
  %470 = extractvalue { ptr, i32 } %468, 1
  store i32 %470, ptr %16, align 4
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %82) #5
  br label %471

471:                                              ; preds = %467, %463
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %83) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %83) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %82) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %80) #5
  br label %472

472:                                              ; preds = %471, %459
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %81) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %81) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %80) #5
  br label %479

473:                                              ; preds = %458, %404
  %474 = load ptr, ptr @glad_glBindVertexArray, align 8, !tbaa !5
  call void %474(i32 noundef 0)
  %475 = load ptr, ptr %7, align 8, !tbaa !5
  %476 = getelementptr inbounds %"struct.cgp::mesh_drawable", ptr %475, i32 0, i32 1
  call void @_ZNK3cgp30opengl_texture_image_structure6unbindEv(ptr noundef nonnull align 4 dereferenceable(20) %476)
  %477 = load ptr, ptr @glad_glUseProgram, align 8, !tbaa !5
  call void %477(i32 noundef 0)
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #5
  br label %478

478:                                              ; preds = %473, %99
  ret void

479:                                              ; preds = %472, %446, %432, %418, %375
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #5
  br label %480

480:                                              ; preds = %479, %338, %324, %315, %301, %230, %192, %151, %113
  %481 = load ptr, ptr %15, align 8
  %482 = load i32, ptr %16, align 4
  %483 = insertvalue { ptr, i32 } poison, ptr %481, 0
  %484 = insertvalue { ptr, i32 } %483, i32 %482, 1
  resume { ptr, i32 } %484
}

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK3cgp13mesh_drawable19send_opengl_uniformEb(ptr noundef nonnull align 8 dereferenceable(412), i1 noundef zeroext) #3 align 2

declare void @_ZNK3cgp25uniform_generic_structure19send_opengl_uniformERKNS_23opengl_shader_structureEb(ptr noundef nonnull align 8 dereferenceable(384), ptr noundef nonnull align 4 dereferenceable(4), i1 noundef zeroext) #4

declare void @_ZNK3cgp30opengl_texture_image_structure4bindEv(ptr noundef nonnull align 4 dereferenceable(20)) #4

declare void @_ZN3cgp14opengl_uniformERKNS_23opengl_shader_structureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEib(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 8 dereferenceable(32), i32 noundef, i1 noundef zeroext) #4

; Function Attrs: mustprogress nounwind uwtable
declare dso_local ptr @_ZNKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureESt4lessIS5_ESaISt4pairIKS5_S7_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(48)) #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local ptr @_ZNKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureESt4lessIS5_ESaISt4pairIKS5_S7_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(48)) #2 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(52) ptr @_ZNKSt23_Rb_tree_const_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureEEEdeEv(ptr noundef nonnull align 8 dereferenceable(8)) #2 align 2

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

declare void @_ZNK3cgp30opengl_texture_image_structure6unbindEv(ptr noundef nonnull align 4 dereferenceable(20)) #4

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

!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 4}
!14 = !{!"_ZTSN3cgp17opengl_gpu_bufferE", !10, i64 0, !10, i64 4, !10, i64 8, !15, i64 12}
!15 = !{!"_ZTSN3cgp25opengl_gpu_buffer_detailsE", !10, i64 0, !10, i64 4, !10, i64 8}
!16 = !{!17, !10, i64 0}
!17 = !{!"_ZTSN3cgp13mesh_drawableE", !18, i64 0, !19, i64 4, !20, i64 24, !29, i64 72, !29, i64 100, !29, i64 128, !29, i64 156, !30, i64 184, !34, i64 208, !10, i64 232, !35, i64 236, !41, i64 280, !42, i64 312, !44, i64 376}
!18 = !{!"_ZTSN3cgp23opengl_shader_structureE", !10, i64 0}
!19 = !{!"_ZTSN3cgp30opengl_texture_image_structureE", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16}
!20 = !{!"_ZTSSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureESt4lessIS5_ESaISt4pairIKS5_S7_EEE", !21, i64 0}
!21 = !{!"_ZTSSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_N3cgp30opengl_texture_image_structureEESt10_Select1stISA_ESt4lessIS5_ESaISA_EE", !22, i64 0}
!22 = !{!"_ZTSNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_N3cgp30opengl_texture_image_structureEESt10_Select1stISA_ESt4lessIS5_ESaISA_EE13_Rb_tree_implISE_Lb1EEE", !23, i64 0, !25, i64 8}
!23 = !{!"_ZTSSt20_Rb_tree_key_compareISt4lessINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE", !24, i64 0}
!24 = !{!"_ZTSSt4lessINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE"}
!25 = !{!"_ZTSSt15_Rb_tree_header", !26, i64 0, !28, i64 32}
!26 = !{!"_ZTSSt18_Rb_tree_node_base", !27, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!27 = !{!"_ZTSSt14_Rb_tree_color", !7, i64 0}
!28 = !{!"long", !7, i64 0}
!29 = !{!"_ZTSN3cgp20opengl_vbo_structureE", !14, i64 0, !10, i64 24}
!30 = !{!"_ZTSSt6vectorIN3cgp20opengl_vbo_structureESaIS1_EE", !31, i64 0}
!31 = !{!"_ZTSSt12_Vector_baseIN3cgp20opengl_vbo_structureESaIS1_EE", !32, i64 0}
!32 = !{!"_ZTSNSt12_Vector_baseIN3cgp20opengl_vbo_structureESaIS1_EE12_Vector_implE", !33, i64 0}
!33 = !{!"_ZTSNSt12_Vector_baseIN3cgp20opengl_vbo_structureESaIS1_EE17_Vector_impl_dataE", !6, i64 0, !6, i64 8, !6, i64 16}
!34 = !{!"_ZTSN3cgp20opengl_ebo_structureE", !14, i64 0}
!35 = !{!"_ZTSN3cgp6affineE", !36, i64 0, !40, i64 16, !39, i64 28, !40, i64 32}
!36 = !{!"_ZTSN3cgp18rotation_transformE", !37, i64 0}
!37 = !{!"_ZTSN3cgp10quaternionE", !38, i64 0}
!38 = !{!"_ZTSN3cgp14numarray_stackIfLi4EEE", !39, i64 0, !39, i64 4, !39, i64 8, !39, i64 12}
!39 = !{!"float", !7, i64 0}
!40 = !{!"_ZTSN3cgp14numarray_stackIfLi3EEE", !39, i64 0, !39, i64 4, !39, i64 8}
!41 = !{!"_ZTSN3cgp10affine_rtsE", !36, i64 0, !40, i64 16, !39, i64 28}
!42 = !{!"_ZTSN3cgp12matrix_stackIfLi4ELi4EEE", !43, i64 0}
!43 = !{!"_ZTSN3cgp14numarray_stackINS0_IfLi4EEELi4EEE", !38, i64 0, !38, i64 16, !38, i64 32, !38, i64 48}
!44 = !{!"_ZTSN3cgp28material_mesh_drawable_phongE", !40, i64 0, !39, i64 12, !45, i64 16, !46, i64 32}
!45 = !{!"_ZTSN3cgp16phong_parametersE", !39, i64 0, !39, i64 4, !39, i64 8, !39, i64 12}
!46 = !{!"_ZTSN3cgp27texture_settings_parametersE", !12, i64 0, !12, i64 1, !12, i64 2}
!47 = !{!17, !10, i64 4}
!48 = !{i8 0, i8 2}
!49 = !{}
!50 = !{!51, !51, i64 0}
!51 = !{!"vtable pointer", !8, i64 0}
!52 = !{!17, !10, i64 232}
!53 = !{!14, !10, 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::__cxx11::basic_string" = type { %"struct.std::__cxx11::basic_string<char>::_Alloc_hider", i64, %union.anon }
%"struct.std::__cxx11::basic_string<char>::_Alloc_hider" = type { ptr }
%union.anon = type { i64, [8 x i8] }
%"class.std::allocator" = type { i8 }
%"struct.std::_Rb_tree_const_iterator" = type { ptr }

@.str.2 = external hidden unnamed_addr constant [101 x i8], align 1
@glad_glBindVertexArray = external local_unnamed_addr global ptr, align 8
@__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj = external hidden unnamed_addr constant [5 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [42 x i8], align 1
@glad_glIsShader = external local_unnamed_addr global ptr, align 8
@.str.12 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [43 x i8], align 1
@glad_glUseProgram = external local_unnamed_addr global ptr, align 8
@_ZN3cgp29environment_generic_structure24default_expected_uniformE = external local_unnamed_addr global i8, align 1
@glad_glActiveTexture = external local_unnamed_addr global ptr, align 8
@.str.16 = external hidden unnamed_addr constant [14 x i8], align 1
@glad_glBindBuffer = external local_unnamed_addr global ptr, align 8
@glad_glDrawElements = external local_unnamed_addr global ptr, align 8
@glad_glDrawElementsInstanced = external local_unnamed_addr global ptr, align 8

; Function Attrs: noreturn
declare void @_ZN3cgp10call_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_S7_S7_i(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(32), i32 noundef) local_unnamed_addr #0

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef, ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #3 align 2

declare i32 @__gxx_personality_v0(...)

; Function Attrs: mustprogress nounwind uwtable
declare void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #2 align 2

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

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

declare void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(32), i32 noundef) local_unnamed_addr #4

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj(ptr noundef nonnull align 8 dereferenceable(412) %0, ptr noundef nonnull align 8 dereferenceable(8) %1, i32 noundef %2, i1 noundef zeroext %3, ptr noundef nonnull align 8 dereferenceable(384) %4, i32 noundef %5) local_unnamed_addr #3 personality ptr @__gxx_personality_v0 {
  %7 = alloca %"class.std::__cxx11::basic_string", align 8
  %8 = alloca %"class.std::allocator", align 1
  %9 = alloca %"class.std::__cxx11::basic_string", align 8
  %10 = alloca %"class.std::allocator", align 1
  %11 = alloca %"class.std::__cxx11::basic_string", align 8
  %12 = alloca %"class.std::allocator", align 1
  %13 = alloca %"class.std::__cxx11::basic_string", align 8
  %14 = alloca %"class.std::allocator", align 1
  %15 = alloca %"class.std::__cxx11::basic_string", align 8
  %16 = alloca %"class.std::allocator", align 1
  %17 = alloca %"class.std::__cxx11::basic_string", align 8
  %18 = alloca %"class.std::allocator", align 1
  %19 = alloca %"class.std::__cxx11::basic_string", align 8
  %20 = alloca %"class.std::allocator", align 1
  %21 = alloca %"class.std::__cxx11::basic_string", align 8
  %22 = alloca %"class.std::allocator", align 1
  %23 = alloca %"class.std::__cxx11::basic_string", align 8
  %24 = alloca %"class.std::allocator", align 1
  %25 = alloca %"class.std::__cxx11::basic_string", align 8
  %26 = alloca %"class.std::allocator", align 1
  %27 = alloca %"class.std::__cxx11::basic_string", align 8
  %28 = alloca %"class.std::allocator", align 1
  %29 = alloca %"class.std::__cxx11::basic_string", align 8
  %30 = alloca %"class.std::allocator", align 1
  %31 = alloca %"class.std::__cxx11::basic_string", align 8
  %32 = alloca %"class.std::allocator", align 1
  %33 = alloca %"class.std::__cxx11::basic_string", align 8
  %34 = alloca %"class.std::allocator", align 1
  %35 = alloca %"class.std::__cxx11::basic_string", align 8
  %36 = alloca %"class.std::allocator", align 1
  %37 = alloca %"class.std::__cxx11::basic_string", align 8
  %38 = alloca %"class.std::allocator", align 1
  %39 = alloca %"class.std::__cxx11::basic_string", align 8
  %40 = alloca %"class.std::allocator", align 1
  %41 = alloca %"class.std::__cxx11::basic_string", align 8
  %42 = alloca %"class.std::allocator", align 1
  %43 = alloca %"class.std::__cxx11::basic_string", align 8
  %44 = alloca %"class.std::allocator", align 1
  %45 = alloca %"class.std::__cxx11::basic_string", align 8
  %46 = alloca %"class.std::allocator", align 1
  %47 = alloca %"class.std::__cxx11::basic_string", align 8
  %48 = alloca %"class.std::allocator", align 1
  %49 = alloca %"struct.std::_Rb_tree_const_iterator", align 8
  %50 = alloca %"struct.std::_Rb_tree_const_iterator", align 8
  %51 = alloca %"class.std::__cxx11::basic_string", align 8
  %52 = alloca %"class.std::allocator", align 1
  %53 = alloca %"class.std::__cxx11::basic_string", align 8
  %54 = alloca %"class.std::allocator", align 1
  %55 = alloca %"class.std::__cxx11::basic_string", align 8
  %56 = alloca %"class.std::allocator", align 1
  %57 = alloca %"class.std::__cxx11::basic_string", align 8
  %58 = alloca %"class.std::allocator", align 1
  %59 = alloca %"class.std::__cxx11::basic_string", align 8
  %60 = alloca %"class.std::allocator", align 1
  %61 = alloca %"class.std::__cxx11::basic_string", align 8
  %62 = alloca %"class.std::allocator", align 1
  %63 = alloca %"class.std::__cxx11::basic_string", align 8
  %64 = alloca %"class.std::allocator", align 1
  %65 = alloca %"class.std::__cxx11::basic_string", align 8
  %66 = alloca %"class.std::allocator", align 1
  %67 = alloca %"class.std::__cxx11::basic_string", align 8
  %68 = alloca %"class.std::allocator", align 1
  %69 = alloca %"class.std::__cxx11::basic_string", align 8
  %70 = alloca %"class.std::allocator", align 1
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %7) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %8) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %8) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %7, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %8)
          to label %71 unwind label %82

71:                                               ; preds = %6
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %9) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %10) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %10) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %9, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %10)
          to label %72 unwind label %84

72:                                               ; preds = %71
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %7, ptr noundef nonnull align 8 dereferenceable(32) %9, i32 noundef 152)
          to label %73 unwind label %86

73:                                               ; preds = %72
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %9) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %10) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %10) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %9) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %7) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %8) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %8) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %7) #5
  %74 = getelementptr inbounds i8, ptr %0, i64 76
  %75 = load i32, ptr %74, align 4, !tbaa !5
  %76 = icmp eq i32 %75, 0
  br i1 %76, label %288, label %77

77:                                               ; preds = %73
  %78 = getelementptr inbounds i8, ptr %0, i64 208
  %79 = getelementptr inbounds i8, ptr %0, i64 212
  %80 = load i32, ptr %79, align 4, !tbaa !5
  %81 = icmp eq i32 %80, 0
  br i1 %81, label %288, label %90

82:                                               ; preds = %6
  %83 = landingpad { ptr, i32 }
          cleanup
  br label %89

84:                                               ; preds = %71
  %85 = landingpad { ptr, i32 }
          cleanup
  br label %88

86:                                               ; preds = %72
  %87 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %9) #5
  br label %88

88:                                               ; preds = %86, %84
  %.pn = phi { ptr, i32 } [ %87, %86 ], [ %85, %84 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %10) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %10) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %9) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %7) #5
  br label %89

89:                                               ; preds = %88, %82
  %.pn.pn = phi { ptr, i32 } [ %.pn, %88 ], [ %83, %82 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %8) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %8) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %7) #5
  br label %289

90:                                               ; preds = %77
  %91 = load i32, ptr %0, align 8, !tbaa !11
  %.not = icmp eq i32 %91, 0
  br i1 %.not, label %92, label %112

92:                                               ; preds = %90
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %11) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %12) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %12) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %11, ptr noundef nonnull @.str.10, ptr noundef nonnull align 1 dereferenceable(1) %12)
          to label %93 unwind label %98

93:                                               ; preds = %92
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %13) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %14) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %14) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %13, ptr noundef nonnull @.str.11, ptr noundef nonnull align 1 dereferenceable(1) %14)
          to label %94 unwind label %100

94:                                               ; preds = %93
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %15) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %16) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %16) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %15, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %16)
          to label %95 unwind label %102

95:                                               ; preds = %94
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %17) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %18) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %18) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %17, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %18)
          to label %96 unwind label %104

96:                                               ; preds = %95
  invoke void @_ZN3cgp10call_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_S7_S7_i(ptr noundef nonnull align 8 dereferenceable(32) %11, ptr noundef nonnull align 8 dereferenceable(32) %13, ptr noundef nonnull align 8 dereferenceable(32) %15, ptr noundef nonnull align 8 dereferenceable(32) %17, i32 noundef 160) #6
          to label %97 unwind label %106

97:                                               ; preds = %96
  unreachable

98:                                               ; preds = %92
  %99 = landingpad { ptr, i32 }
          cleanup
  br label %111

100:                                              ; preds = %93
  %101 = landingpad { ptr, i32 }
          cleanup
  br label %110

102:                                              ; preds = %94
  %103 = landingpad { ptr, i32 }
          cleanup
  br label %109

104:                                              ; preds = %95
  %105 = landingpad { ptr, i32 }
          cleanup
  br label %108

106:                                              ; preds = %96
  %107 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %17) #5
  br label %108

108:                                              ; preds = %106, %104
  %.pn116 = phi { ptr, i32 } [ %107, %106 ], [ %105, %104 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %18) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %18) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %17) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %15) #5
  br label %109

109:                                              ; preds = %108, %102
  %.pn116.pn = phi { ptr, i32 } [ %.pn116, %108 ], [ %103, %102 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %16) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %16) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %15) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %13) #5
  br label %110

110:                                              ; preds = %109, %100
  %.pn116.pn.pn = phi { ptr, i32 } [ %.pn116.pn, %109 ], [ %101, %100 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %14) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %14) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %13) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %11) #5
  br label %111

111:                                              ; preds = %110, %98
  %.pn116.pn.pn.pn = phi { ptr, i32 } [ %.pn116.pn.pn, %110 ], [ %99, %98 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %12) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %12) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %11) #5
  br label %289

112:                                              ; preds = %90
  %113 = load ptr, ptr @glad_glIsShader, align 8, !tbaa !44
  %114 = call zeroext i8 %113(i32 noundef %91)
  %.not77 = icmp eq i8 %114, 0
  br i1 %.not77, label %135, label %115

115:                                              ; preds = %112
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %19) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %20) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %20) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %19, ptr noundef nonnull @.str.12, ptr noundef nonnull align 1 dereferenceable(1) %20)
          to label %116 unwind label %121

116:                                              ; preds = %115
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %21) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %22) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %22) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %21, ptr noundef nonnull @.str.13, ptr noundef nonnull align 1 dereferenceable(1) %22)
          to label %117 unwind label %123

117:                                              ; preds = %116
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %23) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %24) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %24) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %23, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %24)
          to label %118 unwind label %125

118:                                              ; preds = %117
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %25) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %26) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %26) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %25, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %26)
          to label %119 unwind label %127

119:                                              ; preds = %118
  invoke void @_ZN3cgp10call_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_S7_S7_i(ptr noundef nonnull align 8 dereferenceable(32) %19, ptr noundef nonnull align 8 dereferenceable(32) %21, ptr noundef nonnull align 8 dereferenceable(32) %23, ptr noundef nonnull align 8 dereferenceable(32) %25, i32 noundef 161) #6
          to label %120 unwind label %129

120:                                              ; preds = %119
  unreachable

121:                                              ; preds = %115
  %122 = landingpad { ptr, i32 }
          cleanup
  br label %134

123:                                              ; preds = %116
  %124 = landingpad { ptr, i32 }
          cleanup
  br label %133

125:                                              ; preds = %117
  %126 = landingpad { ptr, i32 }
          cleanup
  br label %132

127:                                              ; preds = %118
  %128 = landingpad { ptr, i32 }
          cleanup
  br label %131

129:                                              ; preds = %119
  %130 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %25) #5
  br label %131

131:                                              ; preds = %129, %127
  %.pn111 = phi { ptr, i32 } [ %130, %129 ], [ %128, %127 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %26) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %26) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %25) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %23) #5
  br label %132

132:                                              ; preds = %131, %125
  %.pn111.pn = phi { ptr, i32 } [ %.pn111, %131 ], [ %126, %125 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %24) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %24) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %23) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %21) #5
  br label %133

133:                                              ; preds = %132, %123
  %.pn111.pn.pn = phi { ptr, i32 } [ %.pn111.pn, %132 ], [ %124, %123 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %22) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %22) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %21) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %19) #5
  br label %134

134:                                              ; preds = %133, %121
  %.pn111.pn.pn.pn = phi { ptr, i32 } [ %.pn111.pn.pn, %133 ], [ %122, %121 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %20) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %20) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %19) #5
  br label %289

135:                                              ; preds = %112
  %136 = getelementptr inbounds i8, ptr %0, i64 4
  %137 = load i32, ptr %136, align 4, !tbaa !45
  %.not78 = icmp eq i32 %137, 0
  br i1 %.not78, label %138, label %158

138:                                              ; preds = %135
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %27) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %28) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %28) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %27, ptr noundef nonnull @.str.14, ptr noundef nonnull align 1 dereferenceable(1) %28)
          to label %139 unwind label %144

139:                                              ; preds = %138
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %29) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %30) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %30) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %29, ptr noundef nonnull @.str.15, ptr noundef nonnull align 1 dereferenceable(1) %30)
          to label %140 unwind label %146

140:                                              ; preds = %139
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %31) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %32) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %32) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %31, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %32)
          to label %141 unwind label %148

141:                                              ; preds = %140
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %33) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %34) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %34) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %33, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %34)
          to label %142 unwind label %150

142:                                              ; preds = %141
  invoke void @_ZN3cgp10call_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_S7_S7_i(ptr noundef nonnull align 8 dereferenceable(32) %27, ptr noundef nonnull align 8 dereferenceable(32) %29, ptr noundef nonnull align 8 dereferenceable(32) %31, ptr noundef nonnull align 8 dereferenceable(32) %33, i32 noundef 162) #6
          to label %143 unwind label %152

143:                                              ; preds = %142
  unreachable

144:                                              ; preds = %138
  %145 = landingpad { ptr, i32 }
          cleanup
  br label %157

146:                                              ; preds = %139
  %147 = landingpad { ptr, i32 }
          cleanup
  br label %156

148:                                              ; preds = %140
  %149 = landingpad { ptr, i32 }
          cleanup
  br label %155

150:                                              ; preds = %141
  %151 = landingpad { ptr, i32 }
          cleanup
  br label %154

152:                                              ; preds = %142
  %153 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %33) #5
  br label %154

154:                                              ; preds = %152, %150
  %.pn106 = phi { ptr, i32 } [ %153, %152 ], [ %151, %150 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %34) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %34) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %33) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %31) #5
  br label %155

155:                                              ; preds = %154, %148
  %.pn106.pn = phi { ptr, i32 } [ %.pn106, %154 ], [ %149, %148 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %32) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %32) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %31) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %29) #5
  br label %156

156:                                              ; preds = %155, %146
  %.pn106.pn.pn = phi { ptr, i32 } [ %.pn106.pn, %155 ], [ %147, %146 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %30) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %30) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %29) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %27) #5
  br label %157

157:                                              ; preds = %156, %144
  %.pn106.pn.pn.pn = phi { ptr, i32 } [ %.pn106.pn.pn, %156 ], [ %145, %144 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %28) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %28) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %27) #5
  br label %289

158:                                              ; preds = %135
  %159 = load ptr, ptr @glad_glUseProgram, align 8, !tbaa !44
  %160 = load i32, ptr %0, align 8, !tbaa !11
  call void %159(i32 noundef %160)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %35) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %36) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %36) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %35, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %36)
          to label %161 unwind label %185

161:                                              ; preds = %158
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %37) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %38) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %38) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %37, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %38)
          to label %162 unwind label %187

162:                                              ; preds = %161
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %35, ptr noundef nonnull align 8 dereferenceable(32) %37, i32 noundef 166)
          to label %163 unwind label %189

163:                                              ; preds = %162
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %37) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %38) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %38) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %37) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %35) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %36) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %36) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %35) #5
  call void @_ZNK3cgp13mesh_drawable19send_opengl_uniformEb(ptr noundef nonnull align 8 dereferenceable(412) %0, i1 noundef zeroext %3)
  %164 = load i8, ptr @_ZN3cgp29environment_generic_structure24default_expected_uniformE, align 1, !range !46
  %165 = trunc nuw i8 %164 to i1
  %166 = select i1 %3, i1 %165, i1 false
  %167 = load ptr, ptr %1, align 8, !tbaa !47
  %168 = load ptr, ptr %167, align 8
  call void %168(ptr noundef nonnull align 8 dereferenceable(8) %1, ptr noundef nonnull align 4 dereferenceable(4) %0, i1 noundef zeroext %166)
  call void @_ZNK3cgp25uniform_generic_structure19send_opengl_uniformERKNS_23opengl_shader_structureEb(ptr noundef nonnull align 8 dereferenceable(384) %4, ptr noundef nonnull align 4 dereferenceable(4) %0, i1 noundef zeroext %3)
  %169 = load ptr, ptr @glad_glActiveTexture, align 8, !tbaa !44
  call void %169(i32 noundef 33984)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %39) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %40) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %40) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %39, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %40)
          to label %170 unwind label %193

170:                                              ; preds = %163
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %41) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %42) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %42) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %41, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %42)
          to label %171 unwind label %195

171:                                              ; preds = %170
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %39, ptr noundef nonnull align 8 dereferenceable(32) %41, i32 noundef 183)
          to label %172 unwind label %197

172:                                              ; preds = %171
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %41) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %42) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %42) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %41) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %39) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %40) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %40) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %39) #5
  call void @_ZNK3cgp30opengl_texture_image_structure4bindEv(ptr noundef nonnull align 4 dereferenceable(20) %136)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %43) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %44) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %44) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %43, ptr noundef nonnull @.str.16, ptr noundef nonnull align 1 dereferenceable(1) %44)
          to label %173 unwind label %201

173:                                              ; preds = %172
  invoke void @_ZN3cgp14opengl_uniformERKNS_23opengl_shader_structureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEib(ptr noundef nonnull align 4 dereferenceable(4) %0, ptr noundef nonnull align 8 dereferenceable(32) %43, i32 noundef 0, i1 noundef zeroext %3)
          to label %174 unwind label %203

174:                                              ; preds = %173
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %43) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %44) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %44) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %43) #5
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %45) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %46) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %46) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %45, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %46)
          to label %175 unwind label %206

175:                                              ; preds = %174
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %47) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %48) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %48) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %47, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %48)
          to label %176 unwind label %208

176:                                              ; preds = %175
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %45, ptr noundef nonnull align 8 dereferenceable(32) %47, i32 noundef 185)
          to label %177 unwind label %210

177:                                              ; preds = %176
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %47) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %48) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %48) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %47) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %45) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %46) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %46) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %45) #5
  %178 = getelementptr inbounds i8, ptr %0, i64 24
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %49) #5
  %179 = call ptr @_ZNKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureESt4lessIS5_ESaISt4pairIKS5_S7_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(48) %178) #5
  store ptr %179, ptr %49, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %50) #5
  %180 = call ptr @_ZNKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureESt4lessIS5_ESaISt4pairIKS5_S7_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(48) %178) #5
  store ptr %180, ptr %50, align 8
  %181 = call noundef zeroext i1 @_ZStneRKSt23_Rb_tree_const_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureEEESD_(ptr noundef nonnull align 8 dereferenceable(8) %49, ptr noundef nonnull align 8 dereferenceable(8) %50) #5
  br i1 %181, label %.lr.ph, label %._crit_edge

._crit_edge:                                      ; preds = %220, %177
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %50) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %49) #5
  %182 = load ptr, ptr @glad_glBindVertexArray, align 8, !tbaa !44
  %183 = getelementptr inbounds i8, ptr %0, i64 232
  %184 = load i32, ptr %183, align 8, !tbaa !49
  call void %182(i32 noundef %184)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %55) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %56) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %56) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %55, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %56)
          to label %232 unwind label %248

185:                                              ; preds = %158
  %186 = landingpad { ptr, i32 }
          cleanup
  br label %192

187:                                              ; preds = %161
  %188 = landingpad { ptr, i32 }
          cleanup
  br label %191

189:                                              ; preds = %162
  %190 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %37) #5
  br label %191

191:                                              ; preds = %189, %187
  %.pn79 = phi { ptr, i32 } [ %190, %189 ], [ %188, %187 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %38) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %38) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %37) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %35) #5
  br label %192

192:                                              ; preds = %191, %185
  %.pn79.pn = phi { ptr, i32 } [ %.pn79, %191 ], [ %186, %185 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %36) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %36) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %35) #5
  br label %289

193:                                              ; preds = %163
  %194 = landingpad { ptr, i32 }
          cleanup
  br label %200

195:                                              ; preds = %170
  %196 = landingpad { ptr, i32 }
          cleanup
  br label %199

197:                                              ; preds = %171
  %198 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %41) #5
  br label %199

199:                                              ; preds = %197, %195
  %.pn82 = phi { ptr, i32 } [ %198, %197 ], [ %196, %195 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %42) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %42) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %41) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %39) #5
  br label %200

200:                                              ; preds = %199, %193
  %.pn82.pn = phi { ptr, i32 } [ %.pn82, %199 ], [ %194, %193 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %40) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %40) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %39) #5
  br label %289

201:                                              ; preds = %172
  %202 = landingpad { ptr, i32 }
          cleanup
  br label %205

203:                                              ; preds = %173
  %204 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %43) #5
  br label %205

205:                                              ; preds = %203, %201
  %.pn85 = phi { ptr, i32 } [ %204, %203 ], [ %202, %201 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %44) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %44) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %43) #5
  br label %289

206:                                              ; preds = %174
  %207 = landingpad { ptr, i32 }
          cleanup
  br label %213

208:                                              ; preds = %175
  %209 = landingpad { ptr, i32 }
          cleanup
  br label %212

210:                                              ; preds = %176
  %211 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %47) #5
  br label %212

212:                                              ; preds = %210, %208
  %.pn87 = phi { ptr, i32 } [ %211, %210 ], [ %209, %208 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %48) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %48) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %47) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %45) #5
  br label %213

213:                                              ; preds = %212, %206
  %.pn87.pn = phi { ptr, i32 } [ %.pn87, %212 ], [ %207, %206 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %46) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %46) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %45) #5
  br label %289

.lr.ph:                                           ; preds = %177, %220
  %.073122 = phi i32 [ %221, %220 ], [ 1, %177 ]
  %214 = call noundef nonnull align 8 dereferenceable(52) ptr @_ZNKSt23_Rb_tree_const_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureEEEdeEv(ptr noundef nonnull align 8 dereferenceable(8) %49) #5
  %215 = getelementptr inbounds i8, ptr %214, i64 32
  %216 = load ptr, ptr @glad_glActiveTexture, align 8, !tbaa !44
  %217 = add nuw nsw i32 %.073122, 33984
  call void %216(i32 noundef %217)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %51) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %52) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %52) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %51, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %52)
          to label %218 unwind label %224

218:                                              ; preds = %.lr.ph
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %53) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %54) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %54) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %53, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %54)
          to label %219 unwind label %226

219:                                              ; preds = %218
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %51, ptr noundef nonnull align 8 dereferenceable(32) %53, i32 noundef 194)
          to label %220 unwind label %228

220:                                              ; preds = %219
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %53) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %54) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %54) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %53) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %51) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %52) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %52) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %51) #5
  call void @_ZNK3cgp30opengl_texture_image_structure4bindEv(ptr noundef nonnull align 4 dereferenceable(20) %215)
  call void @_ZN3cgp14opengl_uniformERKNS_23opengl_shader_structureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEib(ptr noundef nonnull align 4 dereferenceable(4) %0, ptr noundef nonnull align 8 dereferenceable(32) %214, i32 noundef %.073122, i1 noundef zeroext %3)
  %221 = add nuw nsw i32 %.073122, 1
  %222 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZNSt23_Rb_tree_const_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureEEEppEv(ptr noundef nonnull align 8 dereferenceable(8) %49) #5
  %223 = call noundef zeroext i1 @_ZStneRKSt23_Rb_tree_const_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureEEESD_(ptr noundef nonnull align 8 dereferenceable(8) %49, ptr noundef nonnull align 8 dereferenceable(8) %50) #5
  br i1 %223, label %.lr.ph, label %._crit_edge

224:                                              ; preds = %.lr.ph
  %225 = landingpad { ptr, i32 }
          cleanup
  br label %231

226:                                              ; preds = %218
  %227 = landingpad { ptr, i32 }
          cleanup
  br label %230

228:                                              ; preds = %219
  %229 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %53) #5
  br label %230

230:                                              ; preds = %228, %226
  %.pn102 = phi { ptr, i32 } [ %229, %228 ], [ %227, %226 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %54) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %54) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %53) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %51) #5
  br label %231

231:                                              ; preds = %230, %224
  %.pn102.pn = phi { ptr, i32 } [ %.pn102, %230 ], [ %225, %224 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %52) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %52) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %51) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %50) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %49) #5
  br label %289

232:                                              ; preds = %._crit_edge
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %57) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %58) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %58) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %57, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %58)
          to label %233 unwind label %250

233:                                              ; preds = %232
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %55, ptr noundef nonnull align 8 dereferenceable(32) %57, i32 noundef 205)
          to label %234 unwind label %252

234:                                              ; preds = %233
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %57) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %58) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %58) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %57) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %55) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %56) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %56) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %55) #5
  %235 = load ptr, ptr @glad_glBindBuffer, align 8, !tbaa !44
  %236 = load i32, ptr %78, align 8, !tbaa !50
  call void %235(i32 noundef 34963, i32 noundef %236)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %59) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %60) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %60) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %59, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %60)
          to label %237 unwind label %256

237:                                              ; preds = %234
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %61) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %62) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %62) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %61, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %62)
          to label %238 unwind label %258

238:                                              ; preds = %237
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %59, ptr noundef nonnull align 8 dereferenceable(32) %61, i32 noundef 206)
          to label %239 unwind label %260

239:                                              ; preds = %238
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %61) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %62) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %62) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %61) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %59) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %60) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %60) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %59) #5
  %240 = icmp slt i32 %2, 2
  %241 = load i32, ptr %79, align 4, !tbaa !5
  %242 = mul i32 %241, 3
  br i1 %240, label %243, label %272

243:                                              ; preds = %239
  %244 = load ptr, ptr @glad_glDrawElements, align 8, !tbaa !44
  call void %244(i32 noundef %5, i32 noundef %242, i32 noundef 5125, ptr noundef null)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %63) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %64) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %64) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %63, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %64)
          to label %245 unwind label %264

245:                                              ; preds = %243
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %65) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %66) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %66) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %65, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %66)
          to label %246 unwind label %266

246:                                              ; preds = %245
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %63, ptr noundef nonnull align 8 dereferenceable(32) %65, i32 noundef 212)
          to label %247 unwind label %268

247:                                              ; preds = %246
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %65) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %66) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %66) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %65) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %63) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %64) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %64) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %63) #5
  br label %285

248:                                              ; preds = %._crit_edge
  %249 = landingpad { ptr, i32 }
          cleanup
  br label %255

250:                                              ; preds = %232
  %251 = landingpad { ptr, i32 }
          cleanup
  br label %254

252:                                              ; preds = %233
  %253 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %57) #5
  br label %254

254:                                              ; preds = %252, %250
  %.pn90 = phi { ptr, i32 } [ %253, %252 ], [ %251, %250 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %58) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %58) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %57) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %55) #5
  br label %255

255:                                              ; preds = %254, %248
  %.pn90.pn = phi { ptr, i32 } [ %.pn90, %254 ], [ %249, %248 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %56) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %56) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %55) #5
  br label %289

256:                                              ; preds = %234
  %257 = landingpad { ptr, i32 }
          cleanup
  br label %263

258:                                              ; preds = %237
  %259 = landingpad { ptr, i32 }
          cleanup
  br label %262

260:                                              ; preds = %238
  %261 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %61) #5
  br label %262

262:                                              ; preds = %260, %258
  %.pn93 = phi { ptr, i32 } [ %261, %260 ], [ %259, %258 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %62) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %62) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %61) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %59) #5
  br label %263

263:                                              ; preds = %262, %256
  %.pn93.pn = phi { ptr, i32 } [ %.pn93, %262 ], [ %257, %256 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %60) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %60) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %59) #5
  br label %289

264:                                              ; preds = %243
  %265 = landingpad { ptr, i32 }
          cleanup
  br label %271

266:                                              ; preds = %245
  %267 = landingpad { ptr, i32 }
          cleanup
  br label %270

268:                                              ; preds = %246
  %269 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %65) #5
  br label %270

270:                                              ; preds = %268, %266
  %.pn99 = phi { ptr, i32 } [ %269, %268 ], [ %267, %266 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %66) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %66) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %65) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %63) #5
  br label %271

271:                                              ; preds = %270, %264
  %.pn99.pn = phi { ptr, i32 } [ %.pn99, %270 ], [ %265, %264 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %64) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %64) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %63) #5
  br label %289

272:                                              ; preds = %239
  %273 = load ptr, ptr @glad_glDrawElementsInstanced, align 8, !tbaa !44
  call void %273(i32 noundef %5, i32 noundef %242, i32 noundef 5125, ptr noundef null, i32 noundef %2)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %67) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %68) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %68) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %67, ptr noundef nonnull @.str.2, ptr noundef nonnull align 1 dereferenceable(1) %68)
          to label %274 unwind label %277

274:                                              ; preds = %272
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %69) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %70) #5
  call void @_ZNSaIcEC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %70) #5
  invoke void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IS3_EEPKcRKS3_(ptr noundef nonnull align 8 dereferenceable(32) %69, ptr noundef nonnull @__func__._ZN3cgp4drawERKNS_13mesh_drawableERKNS_29environment_generic_structureEibRKNS_25uniform_generic_structureEj, ptr noundef nonnull align 1 dereferenceable(1) %70)
          to label %275 unwind label %279

275:                                              ; preds = %274
  invoke void @_ZN3cgp18check_opengl_errorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_i(ptr noundef nonnull align 8 dereferenceable(32) %67, ptr noundef nonnull align 8 dereferenceable(32) %69, i32 noundef 215)
          to label %276 unwind label %281

276:                                              ; preds = %275
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %69) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %70) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %70) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %69) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %67) #5
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %68) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %68) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %67) #5
  br label %285

277:                                              ; preds = %272
  %278 = landingpad { ptr, i32 }
          cleanup
  br label %284

279:                                              ; preds = %274
  %280 = landingpad { ptr, i32 }
          cleanup
  br label %283

281:                                              ; preds = %275
  %282 = landingpad { ptr, i32 }
          cleanup
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %69) #5
  br label %283

283:                                              ; preds = %281, %279
  %.pn96 = phi { ptr, i32 } [ %282, %281 ], [ %280, %279 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %70) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %70) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %69) #5
  call void @_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %67) #5
  br label %284

284:                                              ; preds = %283, %277
  %.pn96.pn = phi { ptr, i32 } [ %.pn96, %283 ], [ %278, %277 ]
  call void @_ZNSt15__new_allocatorIcED2Ev(ptr noundef nonnull align 1 dereferenceable(1) %68) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %68) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %67) #5
  br label %289

285:                                              ; preds = %276, %247
  %286 = load ptr, ptr @glad_glBindVertexArray, align 8, !tbaa !44
  call void %286(i32 noundef 0)
  call void @_ZNK3cgp30opengl_texture_image_structure6unbindEv(ptr noundef nonnull align 4 dereferenceable(20) %136)
  %287 = load ptr, ptr @glad_glUseProgram, align 8, !tbaa !44
  call void %287(i32 noundef 0)
  br label %288

288:                                              ; preds = %73, %77, %285
  ret void

289:                                              ; preds = %231, %255, %263, %271, %284, %213, %205, %200, %192, %157, %134, %111, %89
  %.pn116.pn.pn.pn.pn = phi { ptr, i32 } [ %.pn116.pn.pn.pn, %111 ], [ %.pn111.pn.pn.pn, %134 ], [ %.pn106.pn.pn.pn, %157 ], [ %.pn87.pn, %213 ], [ %.pn85, %205 ], [ %.pn82.pn, %200 ], [ %.pn79.pn, %192 ], [ %.pn.pn, %89 ], [ %.pn102.pn, %231 ], [ %.pn99.pn, %271 ], [ %.pn96.pn, %284 ], [ %.pn93.pn, %263 ], [ %.pn90.pn, %255 ]
  resume { ptr, i32 } %.pn116.pn.pn.pn.pn
}

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK3cgp13mesh_drawable19send_opengl_uniformEb(ptr noundef nonnull align 8 dereferenceable(412), i1 noundef zeroext) local_unnamed_addr #3 align 2

declare void @_ZNK3cgp25uniform_generic_structure19send_opengl_uniformERKNS_23opengl_shader_structureEb(ptr noundef nonnull align 8 dereferenceable(384), ptr noundef nonnull align 4 dereferenceable(4), i1 noundef zeroext) local_unnamed_addr #4

declare void @_ZNK3cgp30opengl_texture_image_structure4bindEv(ptr noundef nonnull align 4 dereferenceable(20)) local_unnamed_addr #4

declare void @_ZN3cgp14opengl_uniformERKNS_23opengl_shader_structureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEib(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 8 dereferenceable(32), i32 noundef, i1 noundef zeroext) local_unnamed_addr #4

; Function Attrs: mustprogress nounwind uwtable
declare dso_local ptr @_ZNKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureESt4lessIS5_ESaISt4pairIKS5_S7_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(48)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local ptr @_ZNKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureESt4lessIS5_ESaISt4pairIKS5_S7_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(48)) local_unnamed_addr #2 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(52) ptr @_ZNKSt23_Rb_tree_const_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureEEEdeEv(ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #2 align 2

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

declare void @_ZNK3cgp30opengl_texture_image_structure6unbindEv(ptr noundef nonnull align 4 dereferenceable(20)) local_unnamed_addr #4

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 4}
!6 = !{!"_ZTSN3cgp17opengl_gpu_bufferE", !7, i64 0, !7, i64 4, !7, i64 8, !10, i64 12}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"_ZTSN3cgp25opengl_gpu_buffer_detailsE", !7, i64 0, !7, i64 4, !7, i64 8}
!11 = !{!12, !7, i64 0}
!12 = !{!"_ZTSN3cgp13mesh_drawableE", !13, i64 0, !14, i64 4, !15, i64 24, !25, i64 72, !25, i64 100, !25, i64 128, !25, i64 156, !26, i64 184, !30, i64 208, !7, i64 232, !31, i64 236, !37, i64 280, !38, i64 312, !40, i64 376}
!13 = !{!"_ZTSN3cgp23opengl_shader_structureE", !7, i64 0}
!14 = !{!"_ZTSN3cgp30opengl_texture_image_structureE", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16}
!15 = !{!"_ZTSSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN3cgp30opengl_texture_image_structureESt4lessIS5_ESaISt4pairIKS5_S7_EEE", !16, i64 0}
!16 = !{!"_ZTSSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_N3cgp30opengl_texture_image_structureEESt10_Select1stISA_ESt4lessIS5_ESaISA_EE", !17, i64 0}
!17 = !{!"_ZTSNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_N3cgp30opengl_texture_image_structureEESt10_Select1stISA_ESt4lessIS5_ESaISA_EE13_Rb_tree_implISE_Lb1EEE", !18, i64 0, !20, i64 8}
!18 = !{!"_ZTSSt20_Rb_tree_key_compareISt4lessINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE", !19, i64 0}
!19 = !{!"_ZTSSt4lessINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE"}
!20 = !{!"_ZTSSt15_Rb_tree_header", !21, i64 0, !24, i64 32}
!21 = !{!"_ZTSSt18_Rb_tree_node_base", !22, i64 0, !23, i64 8, !23, i64 16, !23, i64 24}
!22 = !{!"_ZTSSt14_Rb_tree_color", !8, i64 0}
!23 = !{!"any pointer", !8, i64 0}
!24 = !{!"long", !8, i64 0}
!25 = !{!"_ZTSN3cgp20opengl_vbo_structureE", !6, i64 0, !7, i64 24}
!26 = !{!"_ZTSSt6vectorIN3cgp20opengl_vbo_structureESaIS1_EE", !27, i64 0}
!27 = !{!"_ZTSSt12_Vector_baseIN3cgp20opengl_vbo_structureESaIS1_EE", !28, i64 0}
!28 = !{!"_ZTSNSt12_Vector_baseIN3cgp20opengl_vbo_structureESaIS1_EE12_Vector_implE", !29, i64 0}
!29 = !{!"_ZTSNSt12_Vector_baseIN3cgp20opengl_vbo_structureESaIS1_EE17_Vector_impl_dataE", !23, i64 0, !23, i64 8, !23, i64 16}
!30 = !{!"_ZTSN3cgp20opengl_ebo_structureE", !6, i64 0}
!31 = !{!"_ZTSN3cgp6affineE", !32, i64 0, !36, i64 16, !35, i64 28, !36, i64 32}
!32 = !{!"_ZTSN3cgp18rotation_transformE", !33, i64 0}
!33 = !{!"_ZTSN3cgp10quaternionE", !34, i64 0}
!34 = !{!"_ZTSN3cgp14numarray_stackIfLi4EEE", !35, i64 0, !35, i64 4, !35, i64 8, !35, i64 12}
!35 = !{!"float", !8, i64 0}
!36 = !{!"_ZTSN3cgp14numarray_stackIfLi3EEE", !35, i64 0, !35, i64 4, !35, i64 8}
!37 = !{!"_ZTSN3cgp10affine_rtsE", !32, i64 0, !36, i64 16, !35, i64 28}
!38 = !{!"_ZTSN3cgp12matrix_stackIfLi4ELi4EEE", !39, i64 0}
!39 = !{!"_ZTSN3cgp14numarray_stackINS0_IfLi4EEELi4EEE", !34, i64 0, !34, i64 16, !34, i64 32, !34, i64 48}
!40 = !{!"_ZTSN3cgp28material_mesh_drawable_phongE", !36, i64 0, !35, i64 12, !41, i64 16, !42, i64 32}
!41 = !{!"_ZTSN3cgp16phong_parametersE", !35, i64 0, !35, i64 4, !35, i64 8, !35, i64 12}
!42 = !{!"_ZTSN3cgp27texture_settings_parametersE", !43, i64 0, !43, i64 1, !43, i64 2}
!43 = !{!"bool", !8, i64 0}
!44 = !{!23, !23, i64 0}
!45 = !{!12, !7, i64 4}
!46 = !{i8 0, i8 2}
!47 = !{!48, !48, i64 0}
!48 = !{!"vtable pointer", !9, i64 0}
!49 = !{!12, !7, i64 232}
!50 = !{!6, !7, i64 0}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,SROAPass,SimplifyCFGPass