; LLVM IR from erwincoumans/tiny-differentiable-simulator :: src/visualizer/opengl/tiny_opengl3_app.ll (ZN14TinyOpenGL3App12draw_text_3dEPKcPfS2_S2_fi)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.PrimVertex = type { %struct.PrimVec4, %struct.PrimVec4, %struct.PrimVec2 }
%struct.PrimVec4 = type { [4 x float] }
%struct.PrimVec2 = type { [2 x float] }
%struct.TinyOpenGL3App = type { %struct.TinyCommonGraphicsApp.base, ptr, ptr, ptr }
%struct.TinyCommonGraphicsApp.base = type <{ ptr, ptr, ptr, ptr, ptr, i8, i8, i8, i8, float, float, float, float, i8, [3 x i8], [3 x float] }>
%struct.TinyOpenGL3AppInternalData = type { i32, i32, ptr, ptr, ptr, ptr, i32, i32, i32, ptr, ptr, ptr, ptr, i32, i32, i32, i32 }
%struct.TinyCommonGraphicsApp = type <{ ptr, ptr, ptr, ptr, ptr, i8, i8, i8, i8, float, float, float, float, i8, [3 x i8], [3 x float], [4 x i8] }>
%struct.CTexFont = type { ptr, i32, i32, [256 x float], [256 x float], [256 x float], [256 x float], [256 x i32], i32, i32 }

@g_DefaultLargeFont = external global ptr, align 8
@glad_glEnable = external global ptr, align 8
@glad_glBlendFunc = external global ptr, align 8
@glad_glDisable = external global ptr, align 8
@glad_glActiveTexture = external global ptr, align 8
@glad_glBindTexture = external global ptr, align 8

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN14TinyOpenGL3App12draw_text_3dEPKcPfS2_S2_fi(ptr noundef nonnull align 8 dereferenceable(104) %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, float noundef %5, i32 noundef %6) unnamed_addr #1 align 2 {
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca float, align 4
  %14 = alloca i32, align 4
  %15 = alloca [16 x float], align 16
  %16 = alloca [16 x float], align 16
  %17 = alloca ptr, align 8
  %18 = alloca float, align 4
  %19 = alloca [4 x i32], align 16
  %20 = alloca float, align 4
  %21 = alloca float, align 4
  %22 = alloca float, align 4
  %23 = alloca float, align 4
  %24 = alloca float, align 4
  %25 = alloca float, align 4
  %26 = alloca i32, align 4
  %27 = alloca i8, align 1
  %28 = alloca float, align 4
  %29 = alloca i32, align 4
  %30 = alloca float, align 4
  %31 = alloca float, align 4
  %32 = alloca float, align 4
  %33 = alloca i32, align 4
  %34 = alloca float, align 4
  %35 = alloca float, align 4
  %36 = alloca float, align 4
  %37 = alloca float, align 4
  %38 = alloca float, align 4
  %39 = alloca float, align 4
  %40 = alloca float, align 4
  %41 = alloca float, align 4
  %42 = alloca float, align 4
  %43 = alloca float, align 4
  %44 = alloca i32, align 4
  %45 = alloca i32, align 4
  %46 = alloca [16 x float], align 16
  %47 = alloca [4 x %struct.PrimVertex], align 16
  %48 = alloca %struct.PrimVec4, align 4
  %49 = alloca %struct.PrimVec4, align 4
  %50 = alloca %struct.PrimVec2, align 4
  %51 = alloca %struct.PrimVec4, align 4
  %52 = alloca %struct.PrimVec4, align 4
  %53 = alloca %struct.PrimVec2, align 4
  %54 = alloca %struct.PrimVec4, align 4
  %55 = alloca %struct.PrimVec4, align 4
  %56 = alloca %struct.PrimVec2, align 4
  %57 = alloca %struct.PrimVec4, align 4
  %58 = alloca %struct.PrimVec4, align 4
  %59 = alloca %struct.PrimVec2, align 4
  %60 = alloca [4 x %struct.PrimVertex], align 16
  %61 = alloca %struct.PrimVec4, align 4
  %62 = alloca %struct.PrimVec4, align 4
  %63 = alloca %struct.PrimVec2, align 4
  %64 = alloca %struct.PrimVec4, align 4
  %65 = alloca %struct.PrimVec4, align 4
  %66 = alloca %struct.PrimVec2, align 4
  %67 = alloca %struct.PrimVec4, align 4
  %68 = alloca %struct.PrimVec4, align 4
  %69 = alloca %struct.PrimVec2, align 4
  %70 = alloca %struct.PrimVec4, align 4
  %71 = alloca %struct.PrimVec4, align 4
  %72 = alloca %struct.PrimVec2, align 4
  store ptr %0, ptr %8, align 8, !tbaa !5
  store ptr %1, ptr %9, align 8, !tbaa !5
  store ptr %2, ptr %10, align 8, !tbaa !5
  store ptr %3, ptr %11, align 8, !tbaa !5
  store ptr %4, ptr %12, align 8, !tbaa !5
  store float %5, ptr %13, align 4, !tbaa !9
  store i32 %6, ptr %14, align 4, !tbaa !11
  %73 = load ptr, ptr %8, align 8
  call void @llvm.lifetime.start.p0(i64 64, ptr %15) #7
  call void @llvm.lifetime.start.p0(i64 64, ptr %16) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #7
  %74 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %75 = load ptr, ptr %74, align 8, !tbaa !13
  %76 = load ptr, ptr %75, align 8, !tbaa !17
  %77 = getelementptr inbounds ptr, ptr %76, i64 38
  %78 = load ptr, ptr %77, align 8
  %79 = call noundef ptr %78(ptr noundef nonnull align 8 dereferenceable(60) %75)
  store ptr %79, ptr %17, align 8, !tbaa !5
  %80 = load ptr, ptr %17, align 8, !tbaa !5
  %81 = getelementptr inbounds [16 x float], ptr %15, i64 0, i64 0
  %82 = load ptr, ptr %80, align 8, !tbaa !17
  %83 = getelementptr inbounds ptr, ptr %82, i64 3
  %84 = load ptr, ptr %83, align 8
  call void %84(ptr noundef nonnull align 8 dereferenceable(16) %80, ptr noundef %81)
  %85 = load ptr, ptr %17, align 8, !tbaa !5
  %86 = getelementptr inbounds [16 x float], ptr %16, i64 0, i64 0
  %87 = load ptr, ptr %85, align 8, !tbaa !17
  %88 = getelementptr inbounds ptr, ptr %87, i64 2
  %89 = load ptr, ptr %88, align 8
  call void %89(ptr noundef nonnull align 8 dereferenceable(16) %85, ptr noundef %86)
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #7
  store float 0.000000e+00, ptr %18, align 4, !tbaa !9
  %90 = load ptr, ptr @glad_glEnable, align 8, !tbaa !5
  call void %90(i32 noundef 3042)
  %91 = load ptr, ptr @glad_glBlendFunc, align 8, !tbaa !5
  call void %91(i32 noundef 770, i32 noundef 771)
  call void @llvm.lifetime.start.p0(i64 16, ptr %19) #7
  store i32 0, ptr %19, align 4, !tbaa !11
  %92 = getelementptr inbounds i32, ptr %19, i64 1
  store i32 0, ptr %92, align 4, !tbaa !11
  %93 = getelementptr inbounds i32, ptr %19, i64 2
  %94 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %95 = load ptr, ptr %94, align 8, !tbaa !13
  %96 = load ptr, ptr %95, align 8, !tbaa !17
  %97 = getelementptr inbounds ptr, ptr %96, i64 47
  %98 = load ptr, ptr %97, align 8
  %99 = call noundef i32 %98(ptr noundef nonnull align 8 dereferenceable(60) %95)
  store i32 %99, ptr %93, align 4, !tbaa !11
  %100 = getelementptr inbounds i32, ptr %19, i64 3
  %101 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %102 = load ptr, ptr %101, align 8, !tbaa !13
  %103 = load ptr, ptr %102, align 8, !tbaa !17
  %104 = getelementptr inbounds ptr, ptr %103, i64 48
  %105 = load ptr, ptr %104, align 8
  %106 = call noundef i32 %105(ptr noundef nonnull align 8 dereferenceable(60) %102)
  store i32 %106, ptr %100, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #7
  %107 = load ptr, ptr %10, align 8, !tbaa !5
  %108 = getelementptr inbounds float, ptr %107, i64 0
  %109 = load float, ptr %108, align 4, !tbaa !9
  store float %109, ptr %20, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #7
  %110 = load ptr, ptr %10, align 8, !tbaa !5
  %111 = getelementptr inbounds float, ptr %110, i64 1
  %112 = load float, ptr %111, align 4, !tbaa !9
  store float %112, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #7
  %113 = load ptr, ptr %10, align 8, !tbaa !5
  %114 = getelementptr inbounds float, ptr %113, i64 2
  %115 = load float, ptr %114, align 4, !tbaa !9
  store float %115, ptr %22, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #7
  %116 = load i32, ptr %14, align 4, !tbaa !11
  %117 = and i32 %116, 1
  %118 = icmp ne i32 %117, 0
  br i1 %118, label %119, label %155

119:                                              ; preds = %7
  %120 = load ptr, ptr %10, align 8, !tbaa !5
  %121 = getelementptr inbounds float, ptr %120, i64 0
  %122 = load float, ptr %121, align 4, !tbaa !9
  %123 = load ptr, ptr %10, align 8, !tbaa !5
  %124 = getelementptr inbounds float, ptr %123, i64 1
  %125 = load float, ptr %124, align 4, !tbaa !9
  %126 = load ptr, ptr %10, align 8, !tbaa !5
  %127 = getelementptr inbounds float, ptr %126, i64 2
  %128 = load float, ptr %127, align 4, !tbaa !9
  %129 = getelementptr inbounds [16 x float], ptr %15, i64 0, i64 0
  %130 = getelementptr inbounds [16 x float], ptr %16, i64 0, i64 0
  %131 = getelementptr inbounds [4 x i32], ptr %19, i64 0, i64 0
  %132 = call noundef i32 @_Z25projectWorldCoordToScreenIfEiT_S0_S0_PKS0_S2_PKiPS0_S5_S5_(float noundef %122, float noundef %125, float noundef %128, ptr noundef %129, ptr noundef %130, ptr noundef %131, ptr noundef %23, ptr noundef %24, ptr noundef %25)
  %133 = icmp ne i32 %132, 0
  br i1 %133, label %135, label %134

134:                                              ; preds = %119
  store i32 1, ptr %26, align 4
  br label %602

135:                                              ; preds = %119
  %136 = load float, ptr %23, align 4, !tbaa !9
  store float %136, ptr %20, align 4, !tbaa !9
  %137 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %138 = load ptr, ptr %137, align 8, !tbaa !13
  %139 = load ptr, ptr %138, align 8, !tbaa !17
  %140 = getelementptr inbounds ptr, ptr %139, i64 48
  %141 = load ptr, ptr %140, align 8
  %142 = call noundef i32 %141(ptr noundef nonnull align 8 dereferenceable(60) %138)
  %143 = sdiv i32 %142, 2
  %144 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %145 = load ptr, ptr %144, align 8, !tbaa !13
  %146 = load ptr, ptr %145, align 8, !tbaa !17
  %147 = getelementptr inbounds ptr, ptr %146, i64 48
  %148 = load ptr, ptr %147, align 8
  %149 = call noundef i32 %148(ptr noundef nonnull align 8 dereferenceable(60) %145)
  %150 = sdiv i32 %149, 2
  %151 = add nsw i32 %143, %150
  %152 = sitofp i32 %151 to float
  %153 = load float, ptr %24, align 4, !tbaa !9
  %154 = fsub float %152, %153
  store float %154, ptr %21, align 4, !tbaa !9
  store float 0.000000e+00, ptr %22, align 4, !tbaa !9
  br label %155

155:                                              ; preds = %135, %7
  %156 = load i32, ptr %14, align 4, !tbaa !11
  %157 = and i32 %156, 2
  %158 = icmp ne i32 %157, 0
  br i1 %158, label %159, label %255

159:                                              ; preds = %155
  call void @llvm.lifetime.start.p0(i64 1, ptr %27) #7
  store i8 0, ptr %27, align 1, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #7
  store float 6.400000e+01, ptr %28, align 4, !tbaa !9
  %160 = load i32, ptr %14, align 4, !tbaa !11
  %161 = and i32 %160, 1
  %162 = icmp ne i32 %161, 0
  br i1 %162, label %163, label %206

163:                                              ; preds = %159
  %164 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %165 = load ptr, ptr %164, align 8, !tbaa !20
  %166 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %165, i32 0, i32 2
  %167 = load ptr, ptr %166, align 8, !tbaa !21
  %168 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %169 = load ptr, ptr %168, align 8, !tbaa !20
  %170 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %169, i32 0, i32 6
  %171 = load i32, ptr %170, align 8, !tbaa !23
  %172 = load float, ptr %28, align 4, !tbaa !9
  %173 = load float, ptr %20, align 4, !tbaa !9
  %174 = load float, ptr %21, align 4, !tbaa !9
  %175 = load ptr, ptr %9, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %177 = load ptr, ptr %176, align 8, !tbaa !13
  %178 = load ptr, ptr %177, align 8, !tbaa !17
  %179 = getelementptr inbounds ptr, ptr %178, i64 47
  %180 = load ptr, ptr %179, align 8
  %181 = call noundef i32 %180(ptr noundef nonnull align 8 dereferenceable(60) %177)
  %182 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %183 = load ptr, ptr %182, align 8, !tbaa !13
  %184 = load ptr, ptr %183, align 8, !tbaa !17
  %185 = getelementptr inbounds ptr, ptr %184, i64 48
  %186 = load ptr, ptr %185, align 8
  %187 = call noundef i32 %186(ptr noundef nonnull align 8 dereferenceable(60) %183)
  %188 = load i8, ptr %27, align 1, !tbaa !19, !range !24, !noundef !25
  %189 = trunc i8 %188 to i1
  %190 = zext i1 %189 to i32
  %191 = getelementptr inbounds %struct.TinyCommonGraphicsApp, ptr %73, i32 0, i32 1
  %192 = load ptr, ptr %191, align 8, !tbaa !26
  %193 = load ptr, ptr %192, align 8, !tbaa !17
  %194 = getelementptr inbounds ptr, ptr %193, i64 24
  %195 = load ptr, ptr %194, align 8
  %196 = call noundef float %195(ptr noundef nonnull align 8 dereferenceable(8) %192)
  %197 = load ptr, ptr %12, align 8, !tbaa !5
  call void @_Z13sth_draw_textP9sth_stashifffPKcPfiiifS3_(ptr noundef %167, i32 noundef %171, float noundef %172, float noundef %173, float noundef %174, ptr noundef %175, ptr noundef %18, i32 noundef %181, i32 noundef %187, i32 noundef %190, float noundef %196, ptr noundef %197)
  %198 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %199 = load ptr, ptr %198, align 8, !tbaa !20
  %200 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %199, i32 0, i32 2
  %201 = load ptr, ptr %200, align 8, !tbaa !21
  call void @_Z12sth_end_drawP9sth_stash(ptr noundef %201)
  %202 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %203 = load ptr, ptr %202, align 8, !tbaa !20
  %204 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %203, i32 0, i32 2
  %205 = load ptr, ptr %204, align 8, !tbaa !21
  call void @_Z14sth_flush_drawP9sth_stash(ptr noundef %205)
  br label %254

206:                                              ; preds = %159
  %207 = load ptr, ptr @glad_glEnable, align 8, !tbaa !5
  call void %207(i32 noundef 3042)
  %208 = load ptr, ptr @glad_glBlendFunc, align 8, !tbaa !5
  call void %208(i32 noundef 770, i32 noundef 771)
  %209 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %210 = load ptr, ptr %209, align 8, !tbaa !20
  %211 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %210, i32 0, i32 5
  %212 = load ptr, ptr %211, align 8, !tbaa !27
  %213 = load ptr, ptr %12, align 8, !tbaa !5
  %214 = load ptr, ptr %212, align 8, !tbaa !17
  %215 = getelementptr inbounds ptr, ptr %214, i64 2
  %216 = load ptr, ptr %215, align 8
  call void %216(ptr noundef nonnull align 8 dereferenceable(8) %212, ptr noundef %213)
  %217 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %218 = load ptr, ptr %217, align 8, !tbaa !20
  %219 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %218, i32 0, i32 5
  %220 = load ptr, ptr %219, align 8, !tbaa !27
  %221 = load ptr, ptr %10, align 8, !tbaa !5
  %222 = load ptr, ptr %220, align 8, !tbaa !17
  %223 = getelementptr inbounds ptr, ptr %222, i64 3
  %224 = load ptr, ptr %223, align 8
  call void %224(ptr noundef nonnull align 8 dereferenceable(8) %220, ptr noundef %221)
  %225 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %226 = load ptr, ptr %225, align 8, !tbaa !20
  %227 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %226, i32 0, i32 5
  %228 = load ptr, ptr %227, align 8, !tbaa !27
  %229 = load ptr, ptr %11, align 8, !tbaa !5
  %230 = load ptr, ptr %228, align 8, !tbaa !17
  %231 = getelementptr inbounds ptr, ptr %230, i64 4
  %232 = load ptr, ptr %231, align 8
  call void %232(ptr noundef nonnull align 8 dereferenceable(8) %228, ptr noundef %229)
  %233 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %234 = load ptr, ptr %233, align 8, !tbaa !20
  %235 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %234, i32 0, i32 3
  %236 = load ptr, ptr %235, align 8, !tbaa !28
  %237 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %238 = load ptr, ptr %237, align 8, !tbaa !20
  %239 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %238, i32 0, i32 7
  %240 = load i32, ptr %239, align 4, !tbaa !29
  %241 = load float, ptr %28, align 4, !tbaa !9
  %242 = load ptr, ptr %9, align 8, !tbaa !5
  %243 = load float, ptr %13, align 4, !tbaa !9
  %244 = load ptr, ptr %12, align 8, !tbaa !5
  call void @_Z15sth_draw_text3DP9sth_stashiffffPKcPffS3_i(ptr noundef %236, i32 noundef %240, float noundef %241, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, ptr noundef %242, ptr noundef %18, float noundef %243, ptr noundef %244, i32 noundef 0)
  %245 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %246 = load ptr, ptr %245, align 8, !tbaa !20
  %247 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %246, i32 0, i32 3
  %248 = load ptr, ptr %247, align 8, !tbaa !28
  call void @_Z12sth_end_drawP9sth_stash(ptr noundef %248)
  %249 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %250 = load ptr, ptr %249, align 8, !tbaa !20
  %251 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %250, i32 0, i32 3
  %252 = load ptr, ptr %251, align 8, !tbaa !28
  call void @_Z14sth_flush_drawP9sth_stash(ptr noundef %252)
  %253 = load ptr, ptr @glad_glDisable, align 8, !tbaa !5
  call void %253(i32 noundef 3042)
  br label %254

254:                                              ; preds = %206, %163
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %27) #7
  br label %600

255:                                              ; preds = %155
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #7
  store i32 0, ptr %29, align 4, !tbaa !11
  %256 = load ptr, ptr @glad_glActiveTexture, align 8, !tbaa !5
  call void %256(i32 noundef 33984)
  %257 = load ptr, ptr @glad_glBindTexture, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 1
  %259 = load ptr, ptr %258, align 8, !tbaa !20
  %260 = getelementptr inbounds %struct.TinyOpenGL3AppInternalData, ptr %259, i32 0, i32 1
  %261 = load i32, ptr %260, align 4, !tbaa !30
  call void %257(i32 noundef 3553, i32 noundef %261)
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #7
  %262 = load float, ptr %20, align 4, !tbaa !9
  store float %262, ptr %30, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #7
  %263 = load float, ptr %21, align 4, !tbaa !9
  %264 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.CTexFont, ptr %264, i32 0, i32 8
  %266 = load i32, ptr %265, align 8, !tbaa !31
  %267 = sitofp i32 %266 to float
  %268 = load float, ptr %13, align 4, !tbaa !9
  %269 = call float @llvm.fmuladd.f32(float %267, float %268, float %263)
  store float %269, ptr %31, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #7
  %270 = load ptr, ptr %10, align 8, !tbaa !5
  %271 = getelementptr inbounds float, ptr %270, i64 2
  %272 = load float, ptr %271, align 4, !tbaa !9
  store float %272, ptr %32, align 4, !tbaa !9
  %273 = load i32, ptr %14, align 4, !tbaa !11
  %274 = and i32 %273, 1
  %275 = icmp ne i32 %274, 0
  br i1 %275, label %276, label %306

276:                                              ; preds = %255
  %277 = load float, ptr %23, align 4, !tbaa !9
  store float %277, ptr %20, align 4, !tbaa !9
  %278 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %279 = load ptr, ptr %278, align 8, !tbaa !13
  %280 = load ptr, ptr %279, align 8, !tbaa !17
  %281 = getelementptr inbounds ptr, ptr %280, i64 48
  %282 = load ptr, ptr %281, align 8
  %283 = call noundef i32 %282(ptr noundef nonnull align 8 dereferenceable(60) %279)
  %284 = sdiv i32 %283, 2
  %285 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %286 = load ptr, ptr %285, align 8, !tbaa !13
  %287 = load ptr, ptr %286, align 8, !tbaa !17
  %288 = getelementptr inbounds ptr, ptr %287, i64 48
  %289 = load ptr, ptr %288, align 8
  %290 = call noundef i32 %289(ptr noundef nonnull align 8 dereferenceable(60) %286)
  %291 = sdiv i32 %290, 2
  %292 = add nsw i32 %284, %291
  %293 = sitofp i32 %292 to float
  %294 = load float, ptr %24, align 4, !tbaa !9
  %295 = fsub float %293, %294
  store float %295, ptr %21, align 4, !tbaa !9
  %296 = load float, ptr %25, align 4, !tbaa !9
  %297 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %296, float -1.000000e+00)
  store float %297, ptr %32, align 4, !tbaa !9
  %298 = load float, ptr %21, align 4, !tbaa !9
  %299 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !5
  %300 = getelementptr inbounds %struct.CTexFont, ptr %299, i32 0, i32 8
  %301 = load i32, ptr %300, align 8, !tbaa !31
  %302 = sitofp i32 %301 to float
  %303 = load float, ptr %13, align 4, !tbaa !9
  %304 = fneg float %302
  %305 = call float @llvm.fmuladd.f32(float %304, float %303, float %298)
  store float %305, ptr %31, align 4, !tbaa !9
  br label %306

306:                                              ; preds = %276, %255
  br label %307

307:                                              ; preds = %594, %306
  %308 = load ptr, ptr %9, align 8, !tbaa !5
  %309 = load i32, ptr %29, align 4, !tbaa !11
  %310 = sext i32 %309 to i64
  %311 = getelementptr inbounds i8, ptr %308, i64 %310
  %312 = load i8, ptr %311, align 1, !tbaa !33
  %313 = icmp ne i8 %312, 0
  br i1 %313, label %314, label %598

314:                                              ; preds = %307
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #7
  %315 = load ptr, ptr %9, align 8, !tbaa !5
  %316 = load i32, ptr %29, align 4, !tbaa !11
  %317 = sext i32 %316 to i64
  %318 = getelementptr inbounds i8, ptr %315, i64 %317
  %319 = load i8, ptr %318, align 1, !tbaa !33
  %320 = sext i8 %319 to i32
  store i32 %320, ptr %33, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #7
  %321 = load float, ptr %30, align 4, !tbaa !9
  %322 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !5
  %323 = getelementptr inbounds %struct.CTexFont, ptr %322, i32 0, i32 7
  %324 = load i32, ptr %33, align 4, !tbaa !11
  %325 = sext i32 %324 to i64
  %326 = getelementptr inbounds [256 x i32], ptr %323, i64 0, i64 %325
  %327 = load i32, ptr %326, align 4, !tbaa !11
  %328 = sitofp i32 %327 to float
  %329 = load float, ptr %13, align 4, !tbaa !9
  %330 = call float @llvm.fmuladd.f32(float %328, float %329, float %321)
  store float %330, ptr %34, align 4, !tbaa !9
  %331 = load i32, ptr %14, align 4, !tbaa !11
  %332 = and i32 %331, 1
  %333 = icmp ne i32 %332, 0
  br i1 %333, label %334, label %345

334:                                              ; preds = %314
  %335 = load float, ptr %30, align 4, !tbaa !9
  %336 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !5
  %337 = getelementptr inbounds %struct.CTexFont, ptr %336, i32 0, i32 7
  %338 = load i32, ptr %33, align 4, !tbaa !11
  %339 = sext i32 %338 to i64
  %340 = getelementptr inbounds [256 x i32], ptr %337, i64 0, i64 %339
  %341 = load i32, ptr %340, align 4, !tbaa !11
  %342 = sitofp i32 %341 to float
  %343 = load float, ptr %13, align 4, !tbaa !9
  %344 = call float @llvm.fmuladd.f32(float %342, float %343, float %335)
  store float %344, ptr %34, align 4, !tbaa !9
  br label %345

345:                                              ; preds = %334, %314
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #7
  %346 = load float, ptr %21, align 4, !tbaa !9
  store float %346, ptr %35, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #7
  %347 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !5
  %348 = getelementptr inbounds %struct.CTexFont, ptr %347, i32 0, i32 3
  %349 = load i32, ptr %33, align 4, !tbaa !11
  %350 = sext i32 %349 to i64
  %351 = getelementptr inbounds [256 x float], ptr %348, i64 0, i64 %350
  %352 = load float, ptr %351, align 4, !tbaa !9
  store float %352, ptr %36, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #7
  %353 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !5
  %354 = getelementptr inbounds %struct.CTexFont, ptr %353, i32 0, i32 5
  %355 = load i32, ptr %33, align 4, !tbaa !11
  %356 = sext i32 %355 to i64
  %357 = getelementptr inbounds [256 x float], ptr %354, i64 0, i64 %356
  %358 = load float, ptr %357, align 4, !tbaa !9
  store float %358, ptr %37, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #7
  %359 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !5
  %360 = getelementptr inbounds %struct.CTexFont, ptr %359, i32 0, i32 4
  %361 = load i32, ptr %33, align 4, !tbaa !11
  %362 = sext i32 %361 to i64
  %363 = getelementptr inbounds [256 x float], ptr %360, i64 0, i64 %362
  %364 = load float, ptr %363, align 4, !tbaa !9
  store float %364, ptr %38, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #7
  %365 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !5
  %366 = getelementptr inbounds %struct.CTexFont, ptr %365, i32 0, i32 6
  %367 = load i32, ptr %33, align 4, !tbaa !11
  %368 = sext i32 %367 to i64
  %369 = getelementptr inbounds [256 x float], ptr %366, i64 0, i64 %368
  %370 = load float, ptr %369, align 4, !tbaa !9
  store float %370, ptr %39, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #7
  %371 = load float, ptr %30, align 4, !tbaa !9
  store float %371, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #7
  %372 = load float, ptr %34, align 4, !tbaa !9
  store float %372, ptr %41, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #7
  %373 = load float, ptr %31, align 4, !tbaa !9
  store float %373, ptr %42, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #7
  %374 = load float, ptr %35, align 4, !tbaa !9
  store float %374, ptr %43, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #7
  %375 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %376 = load ptr, ptr %375, align 8, !tbaa !13
  %377 = load ptr, ptr %376, align 8, !tbaa !17
  %378 = getelementptr inbounds ptr, ptr %377, i64 47
  %379 = load ptr, ptr %378, align 8
  %380 = call noundef i32 %379(ptr noundef nonnull align 8 dereferenceable(60) %376)
  store i32 %380, ptr %44, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #7
  %381 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 3
  %382 = load ptr, ptr %381, align 8, !tbaa !13
  %383 = load ptr, ptr %382, align 8, !tbaa !17
  %384 = getelementptr inbounds ptr, ptr %383, i64 48
  %385 = load ptr, ptr %384, align 8
  %386 = call noundef i32 %385(ptr noundef nonnull align 8 dereferenceable(60) %382)
  store i32 %386, ptr %45, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 64, ptr %46) #7
  call void @llvm.memset.p0.i64(ptr align 16 %46, i8 0, i64 64, i1 false)
  %387 = getelementptr inbounds [16 x float], ptr %46, i32 0, i32 0
  store float 1.000000e+00, ptr %387, align 16
  %388 = getelementptr inbounds [16 x float], ptr %46, i32 0, i32 5
  store float 1.000000e+00, ptr %388, align 4
  %389 = getelementptr inbounds [16 x float], ptr %46, i32 0, i32 10
  store float 1.000000e+00, ptr %389, align 8
  %390 = getelementptr inbounds [16 x float], ptr %46, i32 0, i32 15
  store float 1.000000e+00, ptr %390, align 4
  %391 = load i32, ptr %14, align 4, !tbaa !11
  %392 = and i32 %391, 1
  %393 = icmp ne i32 %392, 0
  br i1 %393, label %394, label %514

394:                                              ; preds = %345
  call void @llvm.lifetime.start.p0(i64 160, ptr %47) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %48) #7
  %395 = load float, ptr %40, align 4, !tbaa !9
  %396 = fmul float 2.000000e+00, %395
  %397 = load i32, ptr %44, align 4, !tbaa !11
  %398 = sitofp i32 %397 to float
  %399 = fdiv float %396, %398
  %400 = fadd float -1.000000e+00, %399
  %401 = load float, ptr %42, align 4, !tbaa !9
  %402 = fmul float 2.000000e+00, %401
  %403 = load i32, ptr %45, align 4, !tbaa !11
  %404 = sitofp i32 %403 to float
  %405 = fdiv float %402, %404
  %406 = fsub float 1.000000e+00, %405
  %407 = load float, ptr %32, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %48, float noundef %400, float noundef %406, float noundef %407, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr %49) #7
  %408 = load ptr, ptr %12, align 8, !tbaa !5
  %409 = getelementptr inbounds float, ptr %408, i64 0
  %410 = load float, ptr %409, align 4, !tbaa !9
  %411 = load ptr, ptr %12, align 8, !tbaa !5
  %412 = getelementptr inbounds float, ptr %411, i64 1
  %413 = load float, ptr %412, align 4, !tbaa !9
  %414 = load ptr, ptr %12, align 8, !tbaa !5
  %415 = getelementptr inbounds float, ptr %414, i64 2
  %416 = load float, ptr %415, align 4, !tbaa !9
  %417 = load ptr, ptr %12, align 8, !tbaa !5
  %418 = getelementptr inbounds float, ptr %417, i64 3
  %419 = load float, ptr %418, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %49, float noundef %410, float noundef %413, float noundef %416, float noundef %419)
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #7
  %420 = load float, ptr %36, align 4, !tbaa !9
  %421 = load float, ptr %38, align 4, !tbaa !9
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %50, float noundef %420, float noundef %421)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %47, ptr noundef nonnull align 4 dereferenceable(16) %48, ptr noundef nonnull align 4 dereferenceable(16) %49, ptr noundef nonnull align 4 dereferenceable(8) %50)
  %422 = getelementptr inbounds %struct.PrimVertex, ptr %47, i64 1
  call void @llvm.lifetime.start.p0(i64 16, ptr %51) #7
  %423 = load float, ptr %40, align 4, !tbaa !9
  %424 = fmul float 2.000000e+00, %423
  %425 = load i32, ptr %44, align 4, !tbaa !11
  %426 = sitofp i32 %425 to float
  %427 = fdiv float %424, %426
  %428 = fadd float -1.000000e+00, %427
  %429 = load float, ptr %43, align 4, !tbaa !9
  %430 = fmul float 2.000000e+00, %429
  %431 = load i32, ptr %45, align 4, !tbaa !11
  %432 = sitofp i32 %431 to float
  %433 = fdiv float %430, %432
  %434 = fsub float 1.000000e+00, %433
  %435 = load float, ptr %32, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %51, float noundef %428, float noundef %434, float noundef %435, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr %52) #7
  %436 = load ptr, ptr %12, align 8, !tbaa !5
  %437 = getelementptr inbounds float, ptr %436, i64 0
  %438 = load float, ptr %437, align 4, !tbaa !9
  %439 = load ptr, ptr %12, align 8, !tbaa !5
  %440 = getelementptr inbounds float, ptr %439, i64 1
  %441 = load float, ptr %440, align 4, !tbaa !9
  %442 = load ptr, ptr %12, align 8, !tbaa !5
  %443 = getelementptr inbounds float, ptr %442, i64 2
  %444 = load float, ptr %443, align 4, !tbaa !9
  %445 = load ptr, ptr %12, align 8, !tbaa !5
  %446 = getelementptr inbounds float, ptr %445, i64 3
  %447 = load float, ptr %446, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %52, float noundef %438, float noundef %441, float noundef %444, float noundef %447)
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #7
  %448 = load float, ptr %36, align 4, !tbaa !9
  %449 = load float, ptr %39, align 4, !tbaa !9
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %53, float noundef %448, float noundef %449)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %422, ptr noundef nonnull align 4 dereferenceable(16) %51, ptr noundef nonnull align 4 dereferenceable(16) %52, ptr noundef nonnull align 4 dereferenceable(8) %53)
  %450 = getelementptr inbounds %struct.PrimVertex, ptr %47, i64 2
  call void @llvm.lifetime.start.p0(i64 16, ptr %54) #7
  %451 = load float, ptr %41, align 4, !tbaa !9
  %452 = fmul float 2.000000e+00, %451
  %453 = load i32, ptr %44, align 4, !tbaa !11
  %454 = sitofp i32 %453 to float
  %455 = fdiv float %452, %454
  %456 = fadd float -1.000000e+00, %455
  %457 = load float, ptr %43, align 4, !tbaa !9
  %458 = fmul float 2.000000e+00, %457
  %459 = load i32, ptr %45, align 4, !tbaa !11
  %460 = sitofp i32 %459 to float
  %461 = fdiv float %458, %460
  %462 = fsub float 1.000000e+00, %461
  %463 = load float, ptr %32, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %54, float noundef %456, float noundef %462, float noundef %463, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr %55) #7
  %464 = load ptr, ptr %12, align 8, !tbaa !5
  %465 = getelementptr inbounds float, ptr %464, i64 0
  %466 = load float, ptr %465, align 4, !tbaa !9
  %467 = load ptr, ptr %12, align 8, !tbaa !5
  %468 = getelementptr inbounds float, ptr %467, i64 1
  %469 = load float, ptr %468, align 4, !tbaa !9
  %470 = load ptr, ptr %12, align 8, !tbaa !5
  %471 = getelementptr inbounds float, ptr %470, i64 2
  %472 = load float, ptr %471, align 4, !tbaa !9
  %473 = load ptr, ptr %12, align 8, !tbaa !5
  %474 = getelementptr inbounds float, ptr %473, i64 3
  %475 = load float, ptr %474, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %55, float noundef %466, float noundef %469, float noundef %472, float noundef %475)
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #7
  %476 = load float, ptr %37, align 4, !tbaa !9
  %477 = load float, ptr %39, align 4, !tbaa !9
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %56, float noundef %476, float noundef %477)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %450, ptr noundef nonnull align 4 dereferenceable(16) %54, ptr noundef nonnull align 4 dereferenceable(16) %55, ptr noundef nonnull align 4 dereferenceable(8) %56)
  %478 = getelementptr inbounds %struct.PrimVertex, ptr %47, i64 3
  call void @llvm.lifetime.start.p0(i64 16, ptr %57) #7
  %479 = load float, ptr %41, align 4, !tbaa !9
  %480 = fmul float 2.000000e+00, %479
  %481 = load i32, ptr %44, align 4, !tbaa !11
  %482 = sitofp i32 %481 to float
  %483 = fdiv float %480, %482
  %484 = fadd float -1.000000e+00, %483
  %485 = load float, ptr %42, align 4, !tbaa !9
  %486 = fmul float 2.000000e+00, %485
  %487 = load i32, ptr %45, align 4, !tbaa !11
  %488 = sitofp i32 %487 to float
  %489 = fdiv float %486, %488
  %490 = fsub float 1.000000e+00, %489
  %491 = load float, ptr %32, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %57, float noundef %484, float noundef %490, float noundef %491, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr %58) #7
  %492 = load ptr, ptr %12, align 8, !tbaa !5
  %493 = getelementptr inbounds float, ptr %492, i64 0
  %494 = load float, ptr %493, align 4, !tbaa !9
  %495 = load ptr, ptr %12, align 8, !tbaa !5
  %496 = getelementptr inbounds float, ptr %495, i64 1
  %497 = load float, ptr %496, align 4, !tbaa !9
  %498 = load ptr, ptr %12, align 8, !tbaa !5
  %499 = getelementptr inbounds float, ptr %498, i64 2
  %500 = load float, ptr %499, align 4, !tbaa !9
  %501 = load ptr, ptr %12, align 8, !tbaa !5
  %502 = getelementptr inbounds float, ptr %501, i64 3
  %503 = load float, ptr %502, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %58, float noundef %494, float noundef %497, float noundef %500, float noundef %503)
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #7
  %504 = load float, ptr %37, align 4, !tbaa !9
  %505 = load float, ptr %38, align 4, !tbaa !9
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %59, float noundef %504, float noundef %505)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %478, ptr noundef nonnull align 4 dereferenceable(16) %57, ptr noundef nonnull align 4 dereferenceable(16) %58, ptr noundef nonnull align 4 dereferenceable(8) %59)
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %58) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %57) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %55) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %54) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %52) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %51) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %49) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %48) #7
  %506 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 2
  %507 = load ptr, ptr %506, align 8, !tbaa !34
  %508 = getelementptr inbounds [4 x %struct.PrimVertex], ptr %47, i64 0, i64 0
  %509 = getelementptr inbounds [4 x %struct.PrimVertex], ptr %47, i64 0, i64 1
  %510 = getelementptr inbounds [4 x %struct.PrimVertex], ptr %47, i64 0, i64 2
  %511 = getelementptr inbounds [4 x %struct.PrimVertex], ptr %47, i64 0, i64 3
  %512 = getelementptr inbounds [16 x float], ptr %46, i64 0, i64 0
  %513 = getelementptr inbounds [16 x float], ptr %46, i64 0, i64 0
  call void @_ZN23TinyGLPrimitiveRenderer21draw_textured_rect_3dERK10PrimVertexS2_S2_S2_PfS3_b(ptr noundef nonnull align 8 dereferenceable(32) %507, ptr noundef nonnull align 4 dereferenceable(40) %508, ptr noundef nonnull align 4 dereferenceable(40) %509, ptr noundef nonnull align 4 dereferenceable(40) %510, ptr noundef nonnull align 4 dereferenceable(40) %511, ptr noundef %512, ptr noundef %513, i1 noundef zeroext false)
  call void @llvm.lifetime.end.p0(i64 160, ptr %47) #7
  br label %594

514:                                              ; preds = %345
  call void @llvm.lifetime.start.p0(i64 160, ptr %60) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %61) #7
  %515 = load float, ptr %40, align 4, !tbaa !9
  %516 = load float, ptr %42, align 4, !tbaa !9
  %517 = load float, ptr %32, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %61, float noundef %515, float noundef %516, float noundef %517, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr %62) #7
  %518 = load ptr, ptr %12, align 8, !tbaa !5
  %519 = getelementptr inbounds float, ptr %518, i64 0
  %520 = load float, ptr %519, align 4, !tbaa !9
  %521 = load ptr, ptr %12, align 8, !tbaa !5
  %522 = getelementptr inbounds float, ptr %521, i64 1
  %523 = load float, ptr %522, align 4, !tbaa !9
  %524 = load ptr, ptr %12, align 8, !tbaa !5
  %525 = getelementptr inbounds float, ptr %524, i64 2
  %526 = load float, ptr %525, align 4, !tbaa !9
  %527 = load ptr, ptr %12, align 8, !tbaa !5
  %528 = getelementptr inbounds float, ptr %527, i64 3
  %529 = load float, ptr %528, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %62, float noundef %520, float noundef %523, float noundef %526, float noundef %529)
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #7
  %530 = load float, ptr %36, align 4, !tbaa !9
  %531 = load float, ptr %38, align 4, !tbaa !9
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %63, float noundef %530, float noundef %531)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %60, ptr noundef nonnull align 4 dereferenceable(16) %61, ptr noundef nonnull align 4 dereferenceable(16) %62, ptr noundef nonnull align 4 dereferenceable(8) %63)
  %532 = getelementptr inbounds %struct.PrimVertex, ptr %60, i64 1
  call void @llvm.lifetime.start.p0(i64 16, ptr %64) #7
  %533 = load float, ptr %40, align 4, !tbaa !9
  %534 = load float, ptr %43, align 4, !tbaa !9
  %535 = load float, ptr %32, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %64, float noundef %533, float noundef %534, float noundef %535, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr %65) #7
  %536 = load ptr, ptr %12, align 8, !tbaa !5
  %537 = getelementptr inbounds float, ptr %536, i64 0
  %538 = load float, ptr %537, align 4, !tbaa !9
  %539 = load ptr, ptr %12, align 8, !tbaa !5
  %540 = getelementptr inbounds float, ptr %539, i64 1
  %541 = load float, ptr %540, align 4, !tbaa !9
  %542 = load ptr, ptr %12, align 8, !tbaa !5
  %543 = getelementptr inbounds float, ptr %542, i64 2
  %544 = load float, ptr %543, align 4, !tbaa !9
  %545 = load ptr, ptr %12, align 8, !tbaa !5
  %546 = getelementptr inbounds float, ptr %545, i64 3
  %547 = load float, ptr %546, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %65, float noundef %538, float noundef %541, float noundef %544, float noundef %547)
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #7
  %548 = load float, ptr %36, align 4, !tbaa !9
  %549 = load float, ptr %39, align 4, !tbaa !9
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %66, float noundef %548, float noundef %549)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %532, ptr noundef nonnull align 4 dereferenceable(16) %64, ptr noundef nonnull align 4 dereferenceable(16) %65, ptr noundef nonnull align 4 dereferenceable(8) %66)
  %550 = getelementptr inbounds %struct.PrimVertex, ptr %60, i64 2
  call void @llvm.lifetime.start.p0(i64 16, ptr %67) #7
  %551 = load float, ptr %41, align 4, !tbaa !9
  %552 = load float, ptr %43, align 4, !tbaa !9
  %553 = load float, ptr %32, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %67, float noundef %551, float noundef %552, float noundef %553, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr %68) #7
  %554 = load ptr, ptr %12, align 8, !tbaa !5
  %555 = getelementptr inbounds float, ptr %554, i64 0
  %556 = load float, ptr %555, align 4, !tbaa !9
  %557 = load ptr, ptr %12, align 8, !tbaa !5
  %558 = getelementptr inbounds float, ptr %557, i64 1
  %559 = load float, ptr %558, align 4, !tbaa !9
  %560 = load ptr, ptr %12, align 8, !tbaa !5
  %561 = getelementptr inbounds float, ptr %560, i64 2
  %562 = load float, ptr %561, align 4, !tbaa !9
  %563 = load ptr, ptr %12, align 8, !tbaa !5
  %564 = getelementptr inbounds float, ptr %563, i64 3
  %565 = load float, ptr %564, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %68, float noundef %556, float noundef %559, float noundef %562, float noundef %565)
  call void @llvm.lifetime.start.p0(i64 8, ptr %69) #7
  %566 = load float, ptr %37, align 4, !tbaa !9
  %567 = load float, ptr %39, align 4, !tbaa !9
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %69, float noundef %566, float noundef %567)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %550, ptr noundef nonnull align 4 dereferenceable(16) %67, ptr noundef nonnull align 4 dereferenceable(16) %68, ptr noundef nonnull align 4 dereferenceable(8) %69)
  %568 = getelementptr inbounds %struct.PrimVertex, ptr %60, i64 3
  call void @llvm.lifetime.start.p0(i64 16, ptr %70) #7
  %569 = load float, ptr %41, align 4, !tbaa !9
  %570 = load float, ptr %42, align 4, !tbaa !9
  %571 = load float, ptr %32, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %70, float noundef %569, float noundef %570, float noundef %571, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr %71) #7
  %572 = load ptr, ptr %12, align 8, !tbaa !5
  %573 = getelementptr inbounds float, ptr %572, i64 0
  %574 = load float, ptr %573, align 4, !tbaa !9
  %575 = load ptr, ptr %12, align 8, !tbaa !5
  %576 = getelementptr inbounds float, ptr %575, i64 1
  %577 = load float, ptr %576, align 4, !tbaa !9
  %578 = load ptr, ptr %12, align 8, !tbaa !5
  %579 = getelementptr inbounds float, ptr %578, i64 2
  %580 = load float, ptr %579, align 4, !tbaa !9
  %581 = load ptr, ptr %12, align 8, !tbaa !5
  %582 = getelementptr inbounds float, ptr %581, i64 3
  %583 = load float, ptr %582, align 4, !tbaa !9
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %71, float noundef %574, float noundef %577, float noundef %580, float noundef %583)
  call void @llvm.lifetime.start.p0(i64 8, ptr %72) #7
  %584 = load float, ptr %37, align 4, !tbaa !9
  %585 = load float, ptr %38, align 4, !tbaa !9
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %72, float noundef %584, float noundef %585)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %568, ptr noundef nonnull align 4 dereferenceable(16) %70, ptr noundef nonnull align 4 dereferenceable(16) %71, ptr noundef nonnull align 4 dereferenceable(8) %72)
  call void @llvm.lifetime.end.p0(i64 8, ptr %72) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %71) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %70) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %69) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %68) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %67) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %65) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %64) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %62) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %61) #7
  %586 = getelementptr inbounds %struct.TinyOpenGL3App, ptr %73, i32 0, i32 2
  %587 = load ptr, ptr %586, align 8, !tbaa !34
  %588 = getelementptr inbounds [4 x %struct.PrimVertex], ptr %60, i64 0, i64 0
  %589 = getelementptr inbounds [4 x %struct.PrimVertex], ptr %60, i64 0, i64 1
  %590 = getelementptr inbounds [4 x %struct.PrimVertex], ptr %60, i64 0, i64 2
  %591 = getelementptr inbounds [4 x %struct.PrimVertex], ptr %60, i64 0, i64 3
  %592 = getelementptr inbounds [16 x float], ptr %15, i64 0, i64 0
  %593 = getelementptr inbounds [16 x float], ptr %16, i64 0, i64 0
  call void @_ZN23TinyGLPrimitiveRenderer21draw_textured_rect_3dERK10PrimVertexS2_S2_S2_PfS3_b(ptr noundef nonnull align 8 dereferenceable(32) %587, ptr noundef nonnull align 4 dereferenceable(40) %588, ptr noundef nonnull align 4 dereferenceable(40) %589, ptr noundef nonnull align 4 dereferenceable(40) %590, ptr noundef nonnull align 4 dereferenceable(40) %591, ptr noundef %592, ptr noundef %593, i1 noundef zeroext false)
  call void @llvm.lifetime.end.p0(i64 160, ptr %60) #7
  br label %594

594:                                              ; preds = %514, %394
  %595 = load float, ptr %34, align 4, !tbaa !9
  store float %595, ptr %30, align 4, !tbaa !9
  %596 = load i32, ptr %29, align 4, !tbaa !11
  %597 = add nsw i32 %596, 1
  store i32 %597, ptr %29, align 4, !tbaa !11
  call void @llvm.lifetime.end.p0(i64 64, ptr %46) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #7
  br label %307, !llvm.loop !35

598:                                              ; preds = %307
  %599 = load ptr, ptr @glad_glBindTexture, align 8, !tbaa !5
  call void %599(i32 noundef 3553, i32 noundef 0)
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #7
  br label %600

600:                                              ; preds = %598, %254
  %601 = load ptr, ptr @glad_glDisable, align 8, !tbaa !5
  call void %601(i32 noundef 3042)
  store i32 0, ptr %26, align 4
  br label %602

602:                                              ; preds = %600, %134
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #7
  call void @llvm.lifetime.end.p0(i64 64, ptr %16) #7
  call void @llvm.lifetime.end.p0(i64 64, ptr %15) #7
  %603 = load i32, ptr %26, align 4
  switch i32 %603, label %605 [
    i32 0, label %604
    i32 1, label %604
  ]

604:                                              ; preds = %602, %602
  ret void

605:                                              ; preds = %602
  unreachable
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef i32 @_Z25projectWorldCoordToScreenIfEiT_S0_S0_PKS0_S2_PKiPS0_S5_S5_(float noundef, float noundef, float noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #2

declare void @_Z13sth_draw_textP9sth_stashifffPKcPfiiifS3_(ptr noundef, i32 noundef, float noundef, float noundef, float noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, float noundef, ptr noundef) #3

declare void @_Z12sth_end_drawP9sth_stash(ptr noundef) #3

declare void @_Z14sth_flush_drawP9sth_stash(ptr noundef) #3

declare void @_Z15sth_draw_text3DP9sth_stashiffffPKcPffS3_i(ptr noundef, i32 noundef, float noundef, float noundef, float noundef, float noundef, ptr noundef, ptr noundef, float noundef, ptr noundef, i32 noundef) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #4

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

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

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

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

declare void @_ZN23TinyGLPrimitiveRenderer21draw_textured_rect_3dERK10PrimVertexS2_S2_S2_PfS3_b(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 4 dereferenceable(40), ptr noundef nonnull align 4 dereferenceable(40), ptr noundef nonnull align 4 dereferenceable(40), ptr noundef nonnull align 4 dereferenceable(40), ptr noundef, ptr noundef, i1 noundef zeroext) #3

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"float", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !6, i64 96}
!14 = !{!"_ZTS14TinyOpenGL3App", !15, i64 0, !6, i64 80, !6, i64 88, !6, i64 96}
!15 = !{!"_ZTS21TinyCommonGraphicsApp", !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !16, i64 40, !16, i64 41, !16, i64 42, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !16, i64 60, !7, i64 64}
!16 = !{!"bool", !7, i64 0}
!17 = !{!18, !18, i64 0}
!18 = !{!"vtable pointer", !8, i64 0}
!19 = !{!16, !16, i64 0}
!20 = !{!14, !6, i64 80}
!21 = !{!22, !6, i64 8}
!22 = !{!"_ZTS26TinyOpenGL3AppInternalData", !12, i64 0, !12, i64 4, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !12, i64 40, !12, i64 44, !12, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !12, i64 88, !12, i64 92, !12, i64 96, !12, i64 100}
!23 = !{!22, !12, i64 40}
!24 = !{i8 0, i8 2}
!25 = !{}
!26 = !{!15, !6, i64 8}
!27 = !{!22, !6, i64 32}
!28 = !{!22, !6, i64 16}
!29 = !{!22, !12, i64 44}
!30 = !{!22, !12, i64 4}
!31 = !{!32, !12, i64 5136}
!32 = !{!"_ZTS8CTexFont", !6, i64 0, !12, i64 8, !12, i64 12, !7, i64 16, !7, i64 1040, !7, i64 2064, !7, i64 3088, !7, i64 4112, !12, i64 5136, !12, i64 5140}
!33 = !{!7, !7, i64 0}
!34 = !{!14, !6, i64 88}
!35 = distinct !{!35, !36}
!36 = !{!"llvm.loop.mustprogress"}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.PrimVertex = type { %struct.PrimVec4, %struct.PrimVec4, %struct.PrimVec2 }
%struct.PrimVec4 = type { [4 x float] }
%struct.PrimVec2 = type { [2 x float] }

@g_DefaultLargeFont = external local_unnamed_addr global ptr, align 8
@glad_glEnable = external local_unnamed_addr global ptr, align 8
@glad_glBlendFunc = external local_unnamed_addr global ptr, align 8
@glad_glDisable = external local_unnamed_addr global ptr, align 8
@glad_glActiveTexture = external local_unnamed_addr global ptr, align 8
@glad_glBindTexture = external local_unnamed_addr global ptr, align 8

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN14TinyOpenGL3App12draw_text_3dEPKcPfS2_S2_fi(ptr nocapture noundef nonnull readonly align 8 dereferenceable(104) %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, float noundef %5, i32 noundef %6) unnamed_addr #1 align 2 {
  %8 = alloca [16 x float], align 16
  %9 = alloca [16 x float], align 16
  %10 = alloca float, align 4
  %11 = alloca [4 x i32], align 16
  %12 = alloca float, align 4
  %13 = alloca float, align 4
  %14 = alloca float, align 4
  %15 = alloca [16 x float], align 16
  %16 = alloca [4 x %struct.PrimVertex], align 16
  %17 = alloca %struct.PrimVec4, align 4
  %18 = alloca %struct.PrimVec4, align 4
  %19 = alloca %struct.PrimVec2, align 4
  %20 = alloca %struct.PrimVec4, align 4
  %21 = alloca %struct.PrimVec4, align 4
  %22 = alloca %struct.PrimVec2, align 4
  %23 = alloca %struct.PrimVec4, align 4
  %24 = alloca %struct.PrimVec4, align 4
  %25 = alloca %struct.PrimVec2, align 4
  %26 = alloca %struct.PrimVec4, align 4
  %27 = alloca %struct.PrimVec4, align 4
  %28 = alloca %struct.PrimVec2, align 4
  %29 = alloca [4 x %struct.PrimVertex], align 16
  %30 = alloca %struct.PrimVec4, align 4
  %31 = alloca %struct.PrimVec4, align 4
  %32 = alloca %struct.PrimVec2, align 4
  %33 = alloca %struct.PrimVec4, align 4
  %34 = alloca %struct.PrimVec4, align 4
  %35 = alloca %struct.PrimVec2, align 4
  %36 = alloca %struct.PrimVec4, align 4
  %37 = alloca %struct.PrimVec4, align 4
  %38 = alloca %struct.PrimVec2, align 4
  %39 = alloca %struct.PrimVec4, align 4
  %40 = alloca %struct.PrimVec4, align 4
  %41 = alloca %struct.PrimVec2, align 4
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %8) #7
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %9) #7
  %42 = getelementptr inbounds i8, ptr %0, i64 96
  %43 = load ptr, ptr %42, align 8, !tbaa !5
  %44 = load ptr, ptr %43, align 8, !tbaa !13
  %45 = getelementptr inbounds i8, ptr %44, i64 304
  %46 = load ptr, ptr %45, align 8
  %47 = tail call noundef ptr %46(ptr noundef nonnull align 8 dereferenceable(60) %43)
  %48 = load ptr, ptr %47, align 8, !tbaa !13
  %49 = getelementptr inbounds i8, ptr %48, i64 24
  %50 = load ptr, ptr %49, align 8
  call void %50(ptr noundef nonnull align 8 dereferenceable(16) %47, ptr noundef nonnull %8)
  %51 = load ptr, ptr %47, align 8, !tbaa !13
  %52 = getelementptr inbounds i8, ptr %51, i64 16
  %53 = load ptr, ptr %52, align 8
  call void %53(ptr noundef nonnull align 8 dereferenceable(16) %47, ptr noundef nonnull %9)
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %10) #7
  store float 0.000000e+00, ptr %10, align 4, !tbaa !15
  %54 = load ptr, ptr @glad_glEnable, align 8, !tbaa !16
  call void %54(i32 noundef 3042)
  %55 = load ptr, ptr @glad_glBlendFunc, align 8, !tbaa !16
  call void %55(i32 noundef 770, i32 noundef 771)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %11) #7
  store i32 0, ptr %11, align 16, !tbaa !17
  %56 = getelementptr inbounds i8, ptr %11, i64 4
  store i32 0, ptr %56, align 4, !tbaa !17
  %57 = getelementptr inbounds i8, ptr %11, i64 8
  %58 = load ptr, ptr %42, align 8, !tbaa !5
  %59 = load ptr, ptr %58, align 8, !tbaa !13
  %60 = getelementptr inbounds i8, ptr %59, i64 376
  %61 = load ptr, ptr %60, align 8
  %62 = call noundef i32 %61(ptr noundef nonnull align 8 dereferenceable(60) %58)
  store i32 %62, ptr %57, align 8, !tbaa !17
  %63 = getelementptr inbounds i8, ptr %11, i64 12
  %64 = load ptr, ptr %42, align 8, !tbaa !5
  %65 = load ptr, ptr %64, align 8, !tbaa !13
  %66 = getelementptr inbounds i8, ptr %65, i64 384
  %67 = load ptr, ptr %66, align 8
  %68 = call noundef i32 %67(ptr noundef nonnull align 8 dereferenceable(60) %64)
  store i32 %68, ptr %63, align 4, !tbaa !17
  %69 = load float, ptr %2, align 4, !tbaa !15
  %70 = getelementptr inbounds i8, ptr %2, i64 4
  %71 = load float, ptr %70, align 4, !tbaa !15
  %72 = getelementptr inbounds i8, ptr %2, i64 8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %12) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %13) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %14) #7
  %73 = and i32 %6, 1
  %.not = icmp eq i32 %73, 0
  br i1 %.not, label %77, label %74

74:                                               ; preds = %7
  %75 = load float, ptr %72, align 4, !tbaa !15
  %76 = call noundef i32 @_Z25projectWorldCoordToScreenIfEiT_S0_S0_PKS0_S2_PKiPS0_S5_S5_(float noundef %69, float noundef %71, float noundef %75, ptr noundef nonnull %8, ptr noundef nonnull %9, ptr noundef nonnull %11, ptr noundef nonnull %12, ptr noundef nonnull %13, ptr noundef nonnull %14)
  %.not141 = icmp eq i32 %76, 0
  br i1 %.not141, label %333, label %.thread

77:                                               ; preds = %7
  %78 = and i32 %6, 2
  %.not142 = icmp eq i32 %78, 0
  br i1 %.not142, label %160, label %126

.thread:                                          ; preds = %74
  %79 = load float, ptr %12, align 4, !tbaa !15
  %80 = load ptr, ptr %42, align 8, !tbaa !5
  %81 = load ptr, ptr %80, align 8, !tbaa !13
  %82 = getelementptr inbounds i8, ptr %81, i64 384
  %83 = load ptr, ptr %82, align 8
  %84 = call noundef i32 %83(ptr noundef nonnull align 8 dereferenceable(60) %80)
  %85 = sdiv i32 %84, 2
  %86 = load ptr, ptr %42, align 8, !tbaa !5
  %87 = load ptr, ptr %86, align 8, !tbaa !13
  %88 = getelementptr inbounds i8, ptr %87, i64 384
  %89 = load ptr, ptr %88, align 8
  %90 = call noundef i32 %89(ptr noundef nonnull align 8 dereferenceable(60) %86)
  %91 = sdiv i32 %90, 2
  %92 = add nsw i32 %91, %85
  %93 = sitofp i32 %92 to float
  %94 = load float, ptr %13, align 4, !tbaa !15
  %95 = fsub float %93, %94
  %96 = and i32 %6, 2
  %.not142146 = icmp eq i32 %96, 0
  br i1 %.not142146, label %160, label %97

97:                                               ; preds = %.thread
  %98 = getelementptr inbounds i8, ptr %0, i64 80
  %99 = load ptr, ptr %98, align 8, !tbaa !19
  %100 = getelementptr inbounds i8, ptr %99, i64 8
  %101 = load ptr, ptr %100, align 8, !tbaa !20
  %102 = getelementptr inbounds i8, ptr %99, i64 40
  %103 = load i32, ptr %102, align 8, !tbaa !22
  %104 = load ptr, ptr %42, align 8, !tbaa !5
  %105 = load ptr, ptr %104, align 8, !tbaa !13
  %106 = getelementptr inbounds i8, ptr %105, i64 376
  %107 = load ptr, ptr %106, align 8
  %108 = call noundef i32 %107(ptr noundef nonnull align 8 dereferenceable(60) %104)
  %109 = load ptr, ptr %42, align 8, !tbaa !5
  %110 = load ptr, ptr %109, align 8, !tbaa !13
  %111 = getelementptr inbounds i8, ptr %110, i64 384
  %112 = load ptr, ptr %111, align 8
  %113 = call noundef i32 %112(ptr noundef nonnull align 8 dereferenceable(60) %109)
  %114 = getelementptr inbounds i8, ptr %0, i64 8
  %115 = load ptr, ptr %114, align 8, !tbaa !23
  %116 = load ptr, ptr %115, align 8, !tbaa !13
  %117 = getelementptr inbounds i8, ptr %116, i64 192
  %118 = load ptr, ptr %117, align 8
  %119 = call noundef float %118(ptr noundef nonnull align 8 dereferenceable(8) %115)
  call void @_Z13sth_draw_textP9sth_stashifffPKcPfiiifS3_(ptr noundef %101, i32 noundef %103, float noundef 6.400000e+01, float noundef %79, float noundef %95, ptr noundef %1, ptr noundef nonnull %10, i32 noundef %108, i32 noundef %113, i32 noundef 0, float noundef %119, ptr noundef %4)
  %120 = load ptr, ptr %98, align 8, !tbaa !19
  %121 = getelementptr inbounds i8, ptr %120, i64 8
  %122 = load ptr, ptr %121, align 8, !tbaa !20
  call void @_Z12sth_end_drawP9sth_stash(ptr noundef %122)
  %123 = load ptr, ptr %98, align 8, !tbaa !19
  %124 = getelementptr inbounds i8, ptr %123, i64 8
  %125 = load ptr, ptr %124, align 8, !tbaa !20
  call void @_Z14sth_flush_drawP9sth_stash(ptr noundef %125)
  br label %331

126:                                              ; preds = %77
  %127 = load ptr, ptr @glad_glEnable, align 8, !tbaa !16
  call void %127(i32 noundef 3042)
  %128 = load ptr, ptr @glad_glBlendFunc, align 8, !tbaa !16
  call void %128(i32 noundef 770, i32 noundef 771)
  %129 = getelementptr inbounds i8, ptr %0, i64 80
  %130 = load ptr, ptr %129, align 8, !tbaa !19
  %131 = getelementptr inbounds i8, ptr %130, i64 32
  %132 = load ptr, ptr %131, align 8, !tbaa !24
  %133 = load ptr, ptr %132, align 8, !tbaa !13
  %134 = getelementptr inbounds i8, ptr %133, i64 16
  %135 = load ptr, ptr %134, align 8
  call void %135(ptr noundef nonnull align 8 dereferenceable(8) %132, ptr noundef %4)
  %136 = load ptr, ptr %129, align 8, !tbaa !19
  %137 = getelementptr inbounds i8, ptr %136, i64 32
  %138 = load ptr, ptr %137, align 8, !tbaa !24
  %139 = load ptr, ptr %138, align 8, !tbaa !13
  %140 = getelementptr inbounds i8, ptr %139, i64 24
  %141 = load ptr, ptr %140, align 8
  call void %141(ptr noundef nonnull align 8 dereferenceable(8) %138, ptr noundef nonnull %2)
  %142 = load ptr, ptr %129, align 8, !tbaa !19
  %143 = getelementptr inbounds i8, ptr %142, i64 32
  %144 = load ptr, ptr %143, align 8, !tbaa !24
  %145 = load ptr, ptr %144, align 8, !tbaa !13
  %146 = getelementptr inbounds i8, ptr %145, i64 32
  %147 = load ptr, ptr %146, align 8
  call void %147(ptr noundef nonnull align 8 dereferenceable(8) %144, ptr noundef %3)
  %148 = load ptr, ptr %129, align 8, !tbaa !19
  %149 = getelementptr inbounds i8, ptr %148, i64 16
  %150 = load ptr, ptr %149, align 8, !tbaa !25
  %151 = getelementptr inbounds i8, ptr %148, i64 44
  %152 = load i32, ptr %151, align 4, !tbaa !26
  call void @_Z15sth_draw_text3DP9sth_stashiffffPKcPffS3_i(ptr noundef %150, i32 noundef %152, float noundef 6.400000e+01, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, ptr noundef %1, ptr noundef nonnull %10, float noundef %5, ptr noundef %4, i32 noundef 0)
  %153 = load ptr, ptr %129, align 8, !tbaa !19
  %154 = getelementptr inbounds i8, ptr %153, i64 16
  %155 = load ptr, ptr %154, align 8, !tbaa !25
  call void @_Z12sth_end_drawP9sth_stash(ptr noundef %155)
  %156 = load ptr, ptr %129, align 8, !tbaa !19
  %157 = getelementptr inbounds i8, ptr %156, i64 16
  %158 = load ptr, ptr %157, align 8, !tbaa !25
  call void @_Z14sth_flush_drawP9sth_stash(ptr noundef %158)
  %159 = load ptr, ptr @glad_glDisable, align 8, !tbaa !16
  call void %159(i32 noundef 3042)
  br label %331

160:                                              ; preds = %.thread, %77
  %.0150 = phi float [ %79, %.thread ], [ %69, %77 ]
  %.0134148 = phi float [ %95, %.thread ], [ %71, %77 ]
  %161 = load ptr, ptr @glad_glActiveTexture, align 8, !tbaa !16
  call void %161(i32 noundef 33984)
  %162 = load ptr, ptr @glad_glBindTexture, align 8, !tbaa !16
  %163 = getelementptr inbounds i8, ptr %0, i64 80
  %164 = load ptr, ptr %163, align 8, !tbaa !19
  %165 = getelementptr inbounds i8, ptr %164, i64 4
  %166 = load i32, ptr %165, align 4, !tbaa !27
  call void %162(i32 noundef 3553, i32 noundef %166)
  %167 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !16
  %168 = getelementptr inbounds i8, ptr %167, i64 5136
  %169 = load i32, ptr %168, align 8, !tbaa !28
  %170 = sitofp i32 %169 to float
  %171 = call float @llvm.fmuladd.f32(float %170, float %5, float %.0134148)
  %172 = load float, ptr %72, align 4, !tbaa !15
  br i1 %.not, label %173, label %.thread162

173:                                              ; preds = %160
  %174 = load i8, ptr %1, align 1, !tbaa !30
  %.not143156 = icmp eq i8 %174, 0
  br i1 %.not143156, label %._crit_edge, label %.lr.ph.split.us.preheader

.thread162:                                       ; preds = %160
  %175 = load ptr, ptr %42, align 8, !tbaa !5
  %176 = load ptr, ptr %175, align 8, !tbaa !13
  %177 = getelementptr inbounds i8, ptr %176, i64 384
  %178 = load ptr, ptr %177, align 8
  %179 = call noundef i32 %178(ptr noundef nonnull align 8 dereferenceable(60) %175)
  %180 = load ptr, ptr %42, align 8, !tbaa !5
  %181 = load ptr, ptr %180, align 8, !tbaa !13
  %182 = getelementptr inbounds i8, ptr %181, i64 384
  %183 = load ptr, ptr %182, align 8
  %184 = call noundef i32 %183(ptr noundef nonnull align 8 dereferenceable(60) %180)
  %185 = load float, ptr %14, align 4, !tbaa !15
  %186 = call float @llvm.fmuladd.f32(float %185, float 2.000000e+00, float -1.000000e+00)
  %187 = load i8, ptr %1, align 1, !tbaa !30
  %.not143156166 = icmp eq i8 %187, 0
  br i1 %.not143156166, label %._crit_edge, label %.lr.ph.split.preheader

.lr.ph.split.preheader:                           ; preds = %.thread162
  %188 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !16
  %189 = getelementptr inbounds i8, ptr %188, i64 5136
  %190 = load i32, ptr %189, align 8, !tbaa !28
  %191 = sitofp i32 %190 to float
  %192 = fneg float %191
  %193 = sdiv i32 %184, 2
  %194 = sdiv i32 %179, 2
  %195 = add nsw i32 %193, %194
  %196 = sitofp i32 %195 to float
  %197 = load float, ptr %13, align 4, !tbaa !15
  %198 = fsub float %196, %197
  %199 = call float @llvm.fmuladd.f32(float %192, float %5, float %198)
  %200 = getelementptr inbounds i8, ptr %15, i64 20
  %201 = getelementptr inbounds i8, ptr %15, i64 40
  %202 = getelementptr inbounds i8, ptr %15, i64 60
  %203 = fmul float %199, 2.000000e+00
  %204 = getelementptr inbounds i8, ptr %4, i64 4
  %205 = getelementptr inbounds i8, ptr %4, i64 8
  %206 = getelementptr inbounds i8, ptr %4, i64 12
  %207 = getelementptr inbounds i8, ptr %16, i64 40
  %208 = fmul float %198, 2.000000e+00
  %209 = getelementptr inbounds i8, ptr %16, i64 80
  %210 = getelementptr inbounds i8, ptr %16, i64 120
  %211 = getelementptr inbounds i8, ptr %0, i64 88
  br label %.lr.ph.split

.lr.ph.split.us.preheader:                        ; preds = %173
  %212 = getelementptr inbounds i8, ptr %15, i64 20
  %213 = getelementptr inbounds i8, ptr %4, i64 4
  %214 = getelementptr inbounds i8, ptr %4, i64 8
  %215 = getelementptr inbounds i8, ptr %4, i64 12
  %216 = getelementptr inbounds i8, ptr %0, i64 88
  %217 = getelementptr inbounds i8, ptr %29, i64 40
  %218 = getelementptr inbounds i8, ptr %29, i64 80
  %219 = getelementptr inbounds i8, ptr %29, i64 120
  br label %.lr.ph.split.us

.lr.ph.split.us:                                  ; preds = %.lr.ph.split.us.preheader, %.lr.ph.split.us
  %indvars.iv160 = phi i64 [ 0, %.lr.ph.split.us.preheader ], [ %indvars.iv.next161, %.lr.ph.split.us ]
  %220 = phi i8 [ %174, %.lr.ph.split.us.preheader ], [ %268, %.lr.ph.split.us ]
  %.0136157.us = phi float [ %.0150, %.lr.ph.split.us.preheader ], [ %227, %.lr.ph.split.us ]
  %221 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !16
  %222 = getelementptr inbounds i8, ptr %221, i64 4112
  %223 = sext i8 %220 to i64
  %224 = getelementptr inbounds [256 x i32], ptr %222, i64 0, i64 %223
  %225 = load i32, ptr %224, align 4, !tbaa !17
  %226 = sitofp i32 %225 to float
  %227 = call float @llvm.fmuladd.f32(float %226, float %5, float %.0136157.us)
  %228 = getelementptr inbounds i8, ptr %221, i64 16
  %229 = getelementptr inbounds [256 x float], ptr %228, i64 0, i64 %223
  %230 = load float, ptr %229, align 4, !tbaa !15
  %231 = getelementptr inbounds i8, ptr %221, i64 2064
  %232 = getelementptr inbounds [256 x float], ptr %231, i64 0, i64 %223
  %233 = load float, ptr %232, align 4, !tbaa !15
  %234 = getelementptr inbounds i8, ptr %221, i64 1040
  %235 = getelementptr inbounds [256 x float], ptr %234, i64 0, i64 %223
  %236 = load float, ptr %235, align 4, !tbaa !15
  %237 = getelementptr inbounds i8, ptr %221, i64 3088
  %238 = getelementptr inbounds [256 x float], ptr %237, i64 0, i64 %223
  %239 = load float, ptr %238, align 4, !tbaa !15
  %240 = load ptr, ptr %42, align 8, !tbaa !5
  %241 = load ptr, ptr %240, align 8, !tbaa !13
  %242 = getelementptr inbounds i8, ptr %241, i64 376
  %243 = load ptr, ptr %242, align 8
  %244 = call noundef i32 %243(ptr noundef nonnull align 8 dereferenceable(60) %240)
  %245 = load ptr, ptr %42, align 8, !tbaa !5
  %246 = load ptr, ptr %245, align 8, !tbaa !13
  %247 = getelementptr inbounds i8, ptr %246, i64 384
  %248 = load ptr, ptr %247, align 8
  %249 = call noundef i32 %248(ptr noundef nonnull align 8 dereferenceable(60) %245)
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %15) #7
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(64) %15, i8 0, i64 64, i1 false)
  store float 1.000000e+00, ptr %15, align 16
  store float 1.000000e+00, ptr %212, align 4
  call void @llvm.lifetime.start.p0(i64 160, ptr nonnull %29) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %30) #7
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %30, float noundef %.0136157.us, float noundef %171, float noundef %172, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %31) #7
  %250 = load float, ptr %4, align 4, !tbaa !15
  %251 = load float, ptr %213, align 4, !tbaa !15
  %252 = load float, ptr %214, align 4, !tbaa !15
  %253 = load float, ptr %215, align 4, !tbaa !15
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %31, float noundef %250, float noundef %251, float noundef %252, float noundef %253)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %32) #7
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %32, float noundef %230, float noundef %236)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %29, ptr noundef nonnull align 4 dereferenceable(16) %30, ptr noundef nonnull align 4 dereferenceable(16) %31, ptr noundef nonnull align 4 dereferenceable(8) %32)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %33) #7
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %33, float noundef %.0136157.us, float noundef %.0134148, float noundef %172, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %34) #7
  %254 = load float, ptr %4, align 4, !tbaa !15
  %255 = load float, ptr %213, align 4, !tbaa !15
  %256 = load float, ptr %214, align 4, !tbaa !15
  %257 = load float, ptr %215, align 4, !tbaa !15
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %34, float noundef %254, float noundef %255, float noundef %256, float noundef %257)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %35) #7
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %35, float noundef %230, float noundef %239)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %217, ptr noundef nonnull align 4 dereferenceable(16) %33, ptr noundef nonnull align 4 dereferenceable(16) %34, ptr noundef nonnull align 4 dereferenceable(8) %35)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %36) #7
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %36, float noundef %227, float noundef %.0134148, float noundef %172, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %37) #7
  %258 = load float, ptr %4, align 4, !tbaa !15
  %259 = load float, ptr %213, align 4, !tbaa !15
  %260 = load float, ptr %214, align 4, !tbaa !15
  %261 = load float, ptr %215, align 4, !tbaa !15
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %37, float noundef %258, float noundef %259, float noundef %260, float noundef %261)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %38) #7
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %38, float noundef %233, float noundef %239)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %218, ptr noundef nonnull align 4 dereferenceable(16) %36, ptr noundef nonnull align 4 dereferenceable(16) %37, ptr noundef nonnull align 4 dereferenceable(8) %38)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %39) #7
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %39, float noundef %227, float noundef %171, float noundef %172, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %40) #7
  %262 = load float, ptr %4, align 4, !tbaa !15
  %263 = load float, ptr %213, align 4, !tbaa !15
  %264 = load float, ptr %214, align 4, !tbaa !15
  %265 = load float, ptr %215, align 4, !tbaa !15
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %40, float noundef %262, float noundef %263, float noundef %264, float noundef %265)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %41) #7
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %41, float noundef %233, float noundef %236)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %219, ptr noundef nonnull align 4 dereferenceable(16) %39, ptr noundef nonnull align 4 dereferenceable(16) %40, ptr noundef nonnull align 4 dereferenceable(8) %41)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %41) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %40) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %39) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %38) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %37) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %36) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %34) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %33) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %32) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %31) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %30) #7
  %266 = load ptr, ptr %216, align 8, !tbaa !31
  call void @_ZN23TinyGLPrimitiveRenderer21draw_textured_rect_3dERK10PrimVertexS2_S2_S2_PfS3_b(ptr noundef nonnull align 8 dereferenceable(32) %266, ptr noundef nonnull align 4 dereferenceable(40) %29, ptr noundef nonnull align 4 dereferenceable(40) %217, ptr noundef nonnull align 4 dereferenceable(40) %218, ptr noundef nonnull align 4 dereferenceable(40) %219, ptr noundef nonnull %8, ptr noundef nonnull %9, i1 noundef zeroext false)
  call void @llvm.lifetime.end.p0(i64 160, ptr nonnull %29) #7
  %indvars.iv.next161 = add nuw nsw i64 %indvars.iv160, 1
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %15) #7
  %267 = getelementptr inbounds i8, ptr %1, i64 %indvars.iv.next161
  %268 = load i8, ptr %267, align 1, !tbaa !30
  %.not143.us = icmp eq i8 %268, 0
  br i1 %.not143.us, label %._crit_edge, label %.lr.ph.split.us, !llvm.loop !32

.lr.ph.split:                                     ; preds = %.lr.ph.split.preheader, %.lr.ph.split
  %indvars.iv = phi i64 [ 0, %.lr.ph.split.preheader ], [ %indvars.iv.next, %.lr.ph.split ]
  %269 = phi i8 [ %187, %.lr.ph.split.preheader ], [ %329, %.lr.ph.split ]
  %.0136157 = phi float [ %.0150, %.lr.ph.split.preheader ], [ %276, %.lr.ph.split ]
  %270 = load ptr, ptr @g_DefaultLargeFont, align 8, !tbaa !16
  %271 = getelementptr inbounds i8, ptr %270, i64 4112
  %272 = sext i8 %269 to i64
  %273 = getelementptr inbounds [256 x i32], ptr %271, i64 0, i64 %272
  %274 = load i32, ptr %273, align 4, !tbaa !17
  %275 = sitofp i32 %274 to float
  %276 = call float @llvm.fmuladd.f32(float %275, float %5, float %.0136157)
  %277 = getelementptr inbounds i8, ptr %270, i64 16
  %278 = getelementptr inbounds [256 x float], ptr %277, i64 0, i64 %272
  %279 = load float, ptr %278, align 4, !tbaa !15
  %280 = getelementptr inbounds i8, ptr %270, i64 2064
  %281 = getelementptr inbounds [256 x float], ptr %280, i64 0, i64 %272
  %282 = load float, ptr %281, align 4, !tbaa !15
  %283 = getelementptr inbounds i8, ptr %270, i64 1040
  %284 = getelementptr inbounds [256 x float], ptr %283, i64 0, i64 %272
  %285 = load float, ptr %284, align 4, !tbaa !15
  %286 = getelementptr inbounds i8, ptr %270, i64 3088
  %287 = getelementptr inbounds [256 x float], ptr %286, i64 0, i64 %272
  %288 = load float, ptr %287, align 4, !tbaa !15
  %289 = load ptr, ptr %42, align 8, !tbaa !5
  %290 = load ptr, ptr %289, align 8, !tbaa !13
  %291 = getelementptr inbounds i8, ptr %290, i64 376
  %292 = load ptr, ptr %291, align 8
  %293 = call noundef i32 %292(ptr noundef nonnull align 8 dereferenceable(60) %289)
  %294 = load ptr, ptr %42, align 8, !tbaa !5
  %295 = load ptr, ptr %294, align 8, !tbaa !13
  %296 = getelementptr inbounds i8, ptr %295, i64 384
  %297 = load ptr, ptr %296, align 8
  %298 = call noundef i32 %297(ptr noundef nonnull align 8 dereferenceable(60) %294)
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %15) #7
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(64) %15, i8 0, i64 64, i1 false)
  store float 1.000000e+00, ptr %15, align 16
  store float 1.000000e+00, ptr %200, align 4
  store float 1.000000e+00, ptr %201, align 8
  store float 1.000000e+00, ptr %202, align 4
  call void @llvm.lifetime.start.p0(i64 160, ptr nonnull %16) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #7
  %299 = fmul float %.0136157, 2.000000e+00
  %300 = sitofp i32 %293 to float
  %301 = fdiv float %299, %300
  %302 = fadd float %301, -1.000000e+00
  %303 = sitofp i32 %298 to float
  %304 = fdiv float %203, %303
  %305 = fsub float 1.000000e+00, %304
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %17, float noundef %302, float noundef %305, float noundef %186, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %18) #7
  %306 = load float, ptr %4, align 4, !tbaa !15
  %307 = load float, ptr %204, align 4, !tbaa !15
  %308 = load float, ptr %205, align 4, !tbaa !15
  %309 = load float, ptr %206, align 4, !tbaa !15
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %18, float noundef %306, float noundef %307, float noundef %308, float noundef %309)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %19) #7
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %19, float noundef %279, float noundef %285)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %16, ptr noundef nonnull align 4 dereferenceable(16) %17, ptr noundef nonnull align 4 dereferenceable(16) %18, ptr noundef nonnull align 4 dereferenceable(8) %19)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #7
  %310 = fdiv float %208, %303
  %311 = fsub float 1.000000e+00, %310
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %20, float noundef %302, float noundef %311, float noundef %186, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %21) #7
  %312 = load float, ptr %4, align 4, !tbaa !15
  %313 = load float, ptr %204, align 4, !tbaa !15
  %314 = load float, ptr %205, align 4, !tbaa !15
  %315 = load float, ptr %206, align 4, !tbaa !15
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %21, float noundef %312, float noundef %313, float noundef %314, float noundef %315)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %22) #7
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %22, float noundef %279, float noundef %288)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %207, ptr noundef nonnull align 4 dereferenceable(16) %20, ptr noundef nonnull align 4 dereferenceable(16) %21, ptr noundef nonnull align 4 dereferenceable(8) %22)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %23) #7
  %316 = fmul float %276, 2.000000e+00
  %317 = fdiv float %316, %300
  %318 = fadd float %317, -1.000000e+00
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %23, float noundef %318, float noundef %311, float noundef %186, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %24) #7
  %319 = load float, ptr %4, align 4, !tbaa !15
  %320 = load float, ptr %204, align 4, !tbaa !15
  %321 = load float, ptr %205, align 4, !tbaa !15
  %322 = load float, ptr %206, align 4, !tbaa !15
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %24, float noundef %319, float noundef %320, float noundef %321, float noundef %322)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %25) #7
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %25, float noundef %282, float noundef %288)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %209, ptr noundef nonnull align 4 dereferenceable(16) %23, ptr noundef nonnull align 4 dereferenceable(16) %24, ptr noundef nonnull align 4 dereferenceable(8) %25)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %26) #7
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %26, float noundef %318, float noundef %305, float noundef %186, float noundef 1.000000e+00)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %27) #7
  %323 = load float, ptr %4, align 4, !tbaa !15
  %324 = load float, ptr %204, align 4, !tbaa !15
  %325 = load float, ptr %205, align 4, !tbaa !15
  %326 = load float, ptr %206, align 4, !tbaa !15
  call void @_ZN8PrimVec4C2Effff(ptr noundef nonnull align 4 dereferenceable(16) %27, float noundef %323, float noundef %324, float noundef %325, float noundef %326)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %28) #7
  call void @_ZN8PrimVec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %28, float noundef %282, float noundef %285)
  call void @_ZN10PrimVertexC2ERK8PrimVec4S2_RK8PrimVec2(ptr noundef nonnull align 4 dereferenceable(40) %210, ptr noundef nonnull align 4 dereferenceable(16) %26, ptr noundef nonnull align 4 dereferenceable(16) %27, ptr noundef nonnull align 4 dereferenceable(8) %28)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %28) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %27) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %26) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %25) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %24) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %23) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %22) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %21) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %19) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %18) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #7
  %327 = load ptr, ptr %211, align 8, !tbaa !31
  call void @_ZN23TinyGLPrimitiveRenderer21draw_textured_rect_3dERK10PrimVertexS2_S2_S2_PfS3_b(ptr noundef nonnull align 8 dereferenceable(32) %327, ptr noundef nonnull align 4 dereferenceable(40) %16, ptr noundef nonnull align 4 dereferenceable(40) %207, ptr noundef nonnull align 4 dereferenceable(40) %209, ptr noundef nonnull align 4 dereferenceable(40) %210, ptr noundef nonnull %15, ptr noundef nonnull %15, i1 noundef zeroext false)
  call void @llvm.lifetime.end.p0(i64 160, ptr nonnull %16) #7
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %15) #7
  %328 = getelementptr inbounds i8, ptr %1, i64 %indvars.iv.next
  %329 = load i8, ptr %328, align 1, !tbaa !30
  %.not143 = icmp eq i8 %329, 0
  br i1 %.not143, label %._crit_edge, label %.lr.ph.split, !llvm.loop !32

._crit_edge:                                      ; preds = %.lr.ph.split, %.lr.ph.split.us, %.thread162, %173
  %330 = load ptr, ptr @glad_glBindTexture, align 8, !tbaa !16
  call void %330(i32 noundef 3553, i32 noundef 0)
  br label %331

331:                                              ; preds = %97, %126, %._crit_edge
  %332 = load ptr, ptr @glad_glDisable, align 8, !tbaa !16
  call void %332(i32 noundef 3042)
  br label %333

333:                                              ; preds = %74, %331
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %12) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %11) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %10) #7
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %9) #7
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %8) #7
  ret void
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef i32 @_Z25projectWorldCoordToScreenIfEiT_S0_S0_PKS0_S2_PKiPS0_S5_S5_(float noundef, float noundef, float noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare void @_Z13sth_draw_textP9sth_stashifffPKcPfiiifS3_(ptr noundef, i32 noundef, float noundef, float noundef, float noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, float noundef, ptr noundef) local_unnamed_addr #3

declare void @_Z12sth_end_drawP9sth_stash(ptr noundef) local_unnamed_addr #3

declare void @_Z14sth_flush_drawP9sth_stash(ptr noundef) local_unnamed_addr #3

declare void @_Z15sth_draw_text3DP9sth_stashiffffPKcPffS3_i(ptr noundef, i32 noundef, float noundef, float noundef, float noundef, float noundef, ptr noundef, ptr noundef, float noundef, ptr noundef, i32 noundef) local_unnamed_addr #3

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #4

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

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

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

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

declare void @_ZN23TinyGLPrimitiveRenderer21draw_textured_rect_3dERK10PrimVertexS2_S2_S2_PfS3_b(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 4 dereferenceable(40), ptr noundef nonnull align 4 dereferenceable(40), ptr noundef nonnull align 4 dereferenceable(40), ptr noundef nonnull align 4 dereferenceable(40), ptr noundef, ptr noundef, i1 noundef zeroext) local_unnamed_addr #3

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !8, i64 96}
!6 = !{!"_ZTS14TinyOpenGL3App", !7, i64 0, !8, i64 80, !8, i64 88, !8, i64 96}
!7 = !{!"_ZTS21TinyCommonGraphicsApp", !8, i64 8, !8, i64 16, !8, i64 24, !8, i64 32, !11, i64 40, !11, i64 41, !11, i64 42, !12, i64 44, !12, i64 48, !12, i64 52, !12, i64 56, !11, i64 60, !9, i64 64}
!8 = !{!"any pointer", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C++ TBAA"}
!11 = !{!"bool", !9, i64 0}
!12 = !{!"float", !9, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"vtable pointer", !10, i64 0}
!15 = !{!12, !12, i64 0}
!16 = !{!8, !8, i64 0}
!17 = !{!18, !18, i64 0}
!18 = !{!"int", !9, i64 0}
!19 = !{!6, !8, i64 80}
!20 = !{!21, !8, i64 8}
!21 = !{!"_ZTS26TinyOpenGL3AppInternalData", !18, i64 0, !18, i64 4, !8, i64 8, !8, i64 16, !8, i64 24, !8, i64 32, !18, i64 40, !18, i64 44, !18, i64 48, !8, i64 56, !8, i64 64, !8, i64 72, !8, i64 80, !18, i64 88, !18, i64 92, !18, i64 96, !18, i64 100}
!22 = !{!21, !18, i64 40}
!23 = !{!7, !8, i64 8}
!24 = !{!21, !8, i64 32}
!25 = !{!21, !8, i64 16}
!26 = !{!21, !18, i64 44}
!27 = !{!21, !18, i64 4}
!28 = !{!29, !18, i64 5136}
!29 = !{!"_ZTS8CTexFont", !8, i64 0, !18, i64 8, !18, i64 12, !9, i64 16, !9, i64 1040, !9, i64 2064, !9, i64 3088, !9, i64 4112, !18, i64 5136, !18, i64 5140}
!30 = !{!9, !9, i64 0}
!31 = !{!6, !8, i64 88}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}


; Effective O3 passes: ADCEPass,CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass