; LLVM IR from mateeeeeee/Adria-DX11 :: ThirdParty/tinygltf/examples/common/imgui/ImGuizmo.ll (ZN8ImGuizmo8DrawCubeEPKfS1_Pf)

; 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.ImGuizmo::Context" = type <{ ptr, i32, %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", float, %struct.ImVec2, %struct.ImVec2, %struct.ImVec2, float, %"struct.ImGuizmo::vec_t", i8, i8, [2 x i8], %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", float, float, %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", float, [3 x i8], [3 x i8], [2 x i8], [3 x float], %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", i32, [2 x i32], i8, [3 x i8], %"struct.ImGuizmo::matrix_t", i32, float, float, float, float, float, float, [4 x i8] }>
%struct.ImVec2 = type { float, float }
%"struct.ImGuizmo::vec_t" = type { float, float, float, float }
%"struct.ImGuizmo::matrix_t" = type { %union.anon }
%union.anon = type { [4 x [4 x float]] }
%struct.anon = type { %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t" }

@_ZN8ImGuizmoL8gContextE = external hidden global %"struct.ImGuizmo::Context", align 8
@_ZN8ImGuizmoL14directionUnaryE = external hidden global [3 x %"struct.ImGuizmo::vec_t"], align 16
@_ZN8ImGuizmoL14directionColorE = external hidden constant [3 x i32], align 4

; Function Attrs: mustprogress nounwind uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16), float noundef) #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(16)) #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tplERKS0_(ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(16)) #0 align 2

; Function Attrs: mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZN8ImGuizmo10NormalizedERKNS_5vec_tE(ptr noundef nonnull align 4 dereferenceable(16)) #1

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef float @_ZN8ImGuizmo3DotERKNS_5vec_tES2_(ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(16)) #3

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

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN8ImGuizmo8matrix_tC2Ev(ptr noundef nonnull align 4 dereferenceable(64)) unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK8ImGuizmo8matrix_tmlERKS0_(ptr dead_on_unwind noalias writable sret(%"struct.ImGuizmo::matrix_t") align 4, ptr noundef nonnull align 4 dereferenceable(64), ptr noundef nonnull align 4 dereferenceable(64)) #5 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN8ImGuizmo5vec_t14TransformPointERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(64)) #3 align 2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN8ImGuizmo8DrawCubeEPKfS1_Pf(ptr noundef %0, ptr noundef %1, ptr noundef %2) #1 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca %"struct.ImGuizmo::matrix_t", align 4
  %8 = alloca ptr, align 8
  %9 = alloca %"struct.ImGuizmo::matrix_t", align 4
  %10 = alloca %"struct.ImGuizmo::matrix_t", align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca float, align 4
  %17 = alloca [4 x %"struct.ImGuizmo::vec_t"], align 16
  %18 = alloca %"struct.ImGuizmo::vec_t", align 4
  %19 = alloca %"struct.ImGuizmo::vec_t", align 4
  %20 = alloca %"struct.ImGuizmo::vec_t", align 4
  %21 = alloca %"struct.ImGuizmo::vec_t", align 4
  %22 = alloca i8, align 1
  %23 = alloca i32, align 4
  %24 = alloca %"struct.ImGuizmo::vec_t", align 4
  %25 = alloca %"struct.ImGuizmo::vec_t", align 4
  %26 = alloca %"struct.ImGuizmo::vec_t", align 4
  %27 = alloca [4 x %struct.ImVec2], align 16
  %28 = alloca i32, align 4
  %29 = alloca %struct.ImVec2, align 4
  %30 = alloca %"struct.ImGuizmo::vec_t", align 4
  %31 = alloca %"struct.ImGuizmo::vec_t", align 4
  %32 = alloca %"struct.ImGuizmo::vec_t", align 4
  %33 = alloca %"struct.ImGuizmo::vec_t", align 4
  %34 = alloca %"struct.ImGuizmo::vec_t", align 4
  %35 = alloca %"struct.ImGuizmo::vec_t", align 4
  %36 = alloca %"struct.ImGuizmo::vec_t", align 4
  %37 = alloca float, align 4
  %38 = alloca %"struct.ImGuizmo::vec_t", align 4
  %39 = alloca %"struct.ImGuizmo::vec_t", align 4
  %40 = alloca %"struct.ImGuizmo::vec_t", align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store ptr %2, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 64, ptr %7) #7
  call void @_ZN8ImGuizmo8matrix_tC2Ev(ptr noundef nonnull align 4 dereferenceable(64) %7)
  %41 = load ptr, ptr %4, align 8, !tbaa !5
  %42 = call noundef float @_ZN8ImGuizmo8matrix_t7InverseERKS0_b(ptr noundef nonnull align 4 dereferenceable(64) %7, ptr noundef nonnull align 4 dereferenceable(64) %41, i1 noundef zeroext false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #7
  %43 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %43, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 64, ptr %9) #7
  call void @llvm.lifetime.start.p0(i64 64, ptr %10) #7
  %44 = load ptr, ptr %6, align 8, !tbaa !5
  %45 = load ptr, ptr %4, align 8, !tbaa !5
  call void @_ZNK8ImGuizmo8matrix_tmlERKS0_(ptr dead_on_unwind writable sret(%"struct.ImGuizmo::matrix_t") align 4 %10, ptr noundef nonnull align 4 dereferenceable(64) %44, ptr noundef nonnull align 4 dereferenceable(64) %45)
  %46 = load ptr, ptr %5, align 8, !tbaa !5
  call void @_ZNK8ImGuizmo8matrix_tmlERKS0_(ptr dead_on_unwind writable sret(%"struct.ImGuizmo::matrix_t") align 4 %9, ptr noundef nonnull align 4 dereferenceable(64) %10, ptr noundef nonnull align 4 dereferenceable(64) %46)
  call void @llvm.lifetime.end.p0(i64 64, ptr %10) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #7
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %47

47:                                               ; preds = %269, %3
  %48 = load i32, ptr %11, align 4, !tbaa !9
  %49 = icmp slt i32 %48, 6
  br i1 %49, label %51, label %50

50:                                               ; preds = %47
  store i32 2, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #7
  br label %272

51:                                               ; preds = %47
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #7
  %52 = load i32, ptr %11, align 4, !tbaa !9
  %53 = srem i32 %52, 3
  store i32 %53, ptr %13, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #7
  %54 = load i32, ptr %13, align 4, !tbaa !9
  %55 = add nsw i32 %54, 1
  %56 = srem i32 %55, 3
  store i32 %56, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #7
  %57 = load i32, ptr %13, align 4, !tbaa !9
  %58 = add nsw i32 %57, 2
  %59 = srem i32 %58, 3
  store i32 %59, ptr %15, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #7
  %60 = load i32, ptr %11, align 4, !tbaa !9
  %61 = icmp sgt i32 %60, 2
  %62 = zext i1 %61 to i64
  %63 = select i1 %61, float -1.000000e+00, float 1.000000e+00
  store float %63, ptr %16, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 64, ptr %17) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %18) #7
  %64 = load i32, ptr %13, align 4, !tbaa !9
  %65 = sext i32 %64 to i64
  %66 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %65
  %67 = load i32, ptr %14, align 4, !tbaa !9
  %68 = sext i32 %67 to i64
  %69 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %68
  %70 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tplERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %66, ptr noundef nonnull align 4 dereferenceable(16) %69)
  %71 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %18, i32 0, i32 0
  %72 = extractvalue { <2 x float>, <2 x float> } %70, 0
  store <2 x float> %72, ptr %71, align 4
  %73 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %18, i32 0, i32 1
  %74 = extractvalue { <2 x float>, <2 x float> } %70, 1
  store <2 x float> %74, ptr %73, align 4
  %75 = load i32, ptr %15, align 4, !tbaa !9
  %76 = sext i32 %75 to i64
  %77 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %76
  %78 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tplERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %18, ptr noundef nonnull align 4 dereferenceable(16) %77)
  %79 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %17, i32 0, i32 0
  %80 = extractvalue { <2 x float>, <2 x float> } %78, 0
  store <2 x float> %80, ptr %79, align 16
  %81 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %17, i32 0, i32 1
  %82 = extractvalue { <2 x float>, <2 x float> } %78, 1
  store <2 x float> %82, ptr %81, align 8
  %83 = getelementptr inbounds %"struct.ImGuizmo::vec_t", ptr %17, i64 1
  call void @llvm.lifetime.start.p0(i64 16, ptr %19) #7
  %84 = load i32, ptr %13, align 4, !tbaa !9
  %85 = sext i32 %84 to i64
  %86 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %85
  %87 = load i32, ptr %14, align 4, !tbaa !9
  %88 = sext i32 %87 to i64
  %89 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %88
  %90 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tplERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %86, ptr noundef nonnull align 4 dereferenceable(16) %89)
  %91 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %19, i32 0, i32 0
  %92 = extractvalue { <2 x float>, <2 x float> } %90, 0
  store <2 x float> %92, ptr %91, align 4
  %93 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %19, i32 0, i32 1
  %94 = extractvalue { <2 x float>, <2 x float> } %90, 1
  store <2 x float> %94, ptr %93, align 4
  %95 = load i32, ptr %15, align 4, !tbaa !9
  %96 = sext i32 %95 to i64
  %97 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %96
  %98 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %19, ptr noundef nonnull align 4 dereferenceable(16) %97)
  %99 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %83, i32 0, i32 0
  %100 = extractvalue { <2 x float>, <2 x float> } %98, 0
  store <2 x float> %100, ptr %99, align 16
  %101 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %83, i32 0, i32 1
  %102 = extractvalue { <2 x float>, <2 x float> } %98, 1
  store <2 x float> %102, ptr %101, align 8
  %103 = getelementptr inbounds %"struct.ImGuizmo::vec_t", ptr %17, i64 2
  call void @llvm.lifetime.start.p0(i64 16, ptr %20) #7
  %104 = load i32, ptr %13, align 4, !tbaa !9
  %105 = sext i32 %104 to i64
  %106 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %105
  %107 = load i32, ptr %14, align 4, !tbaa !9
  %108 = sext i32 %107 to i64
  %109 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %108
  %110 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %106, ptr noundef nonnull align 4 dereferenceable(16) %109)
  %111 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %20, i32 0, i32 0
  %112 = extractvalue { <2 x float>, <2 x float> } %110, 0
  store <2 x float> %112, ptr %111, align 4
  %113 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %20, i32 0, i32 1
  %114 = extractvalue { <2 x float>, <2 x float> } %110, 1
  store <2 x float> %114, ptr %113, align 4
  %115 = load i32, ptr %15, align 4, !tbaa !9
  %116 = sext i32 %115 to i64
  %117 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %116
  %118 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %20, ptr noundef nonnull align 4 dereferenceable(16) %117)
  %119 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %103, i32 0, i32 0
  %120 = extractvalue { <2 x float>, <2 x float> } %118, 0
  store <2 x float> %120, ptr %119, align 16
  %121 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %103, i32 0, i32 1
  %122 = extractvalue { <2 x float>, <2 x float> } %118, 1
  store <2 x float> %122, ptr %121, align 8
  %123 = getelementptr inbounds %"struct.ImGuizmo::vec_t", ptr %17, i64 3
  call void @llvm.lifetime.start.p0(i64 16, ptr %21) #7
  %124 = load i32, ptr %13, align 4, !tbaa !9
  %125 = sext i32 %124 to i64
  %126 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %125
  %127 = load i32, ptr %14, align 4, !tbaa !9
  %128 = sext i32 %127 to i64
  %129 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %128
  %130 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %126, ptr noundef nonnull align 4 dereferenceable(16) %129)
  %131 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %21, i32 0, i32 0
  %132 = extractvalue { <2 x float>, <2 x float> } %130, 0
  store <2 x float> %132, ptr %131, align 4
  %133 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %21, i32 0, i32 1
  %134 = extractvalue { <2 x float>, <2 x float> } %130, 1
  store <2 x float> %134, ptr %133, align 4
  %135 = load i32, ptr %15, align 4, !tbaa !9
  %136 = sext i32 %135 to i64
  %137 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %136
  %138 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tplERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %21, ptr noundef nonnull align 4 dereferenceable(16) %137)
  %139 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %123, i32 0, i32 0
  %140 = extractvalue { <2 x float>, <2 x float> } %138, 0
  store <2 x float> %140, ptr %139, align 16
  %141 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %123, i32 0, i32 1
  %142 = extractvalue { <2 x float>, <2 x float> } %138, 1
  store <2 x float> %142, ptr %141, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %21) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %18) #7
  call void @llvm.lifetime.start.p0(i64 1, ptr %22) #7
  store i8 0, ptr %22, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #7
  store i32 0, ptr %23, align 4, !tbaa !9
  br label %143

143:                                              ; preds = %170, %51
  %144 = load i32, ptr %23, align 4, !tbaa !9
  %145 = icmp ult i32 %144, 4
  br i1 %145, label %147, label %146

146:                                              ; preds = %143
  store i32 5, ptr %12, align 4
  br label %173

147:                                              ; preds = %143
  call void @llvm.lifetime.start.p0(i64 16, ptr %24) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %25) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %26) #7
  %148 = load i32, ptr %23, align 4, !tbaa !9
  %149 = zext i32 %148 to i64
  %150 = getelementptr inbounds [4 x %"struct.ImGuizmo::vec_t"], ptr %17, i64 0, i64 %149
  %151 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %150, float noundef 5.000000e-01)
  %152 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %26, i32 0, i32 0
  %153 = extractvalue { <2 x float>, <2 x float> } %151, 0
  store <2 x float> %153, ptr %152, align 4
  %154 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %26, i32 0, i32 1
  %155 = extractvalue { <2 x float>, <2 x float> } %151, 1
  store <2 x float> %155, ptr %154, align 4
  %156 = load float, ptr %16, align 4, !tbaa !11
  %157 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %26, float noundef %156)
  %158 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %25, i32 0, i32 0
  %159 = extractvalue { <2 x float>, <2 x float> } %157, 0
  store <2 x float> %159, ptr %158, align 4
  %160 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %25, i32 0, i32 1
  %161 = extractvalue { <2 x float>, <2 x float> } %157, 1
  store <2 x float> %161, ptr %160, align 4
  call void @_ZN8ImGuizmo5vec_t14TransformPointERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %24, ptr noundef nonnull align 4 dereferenceable(16) %25, ptr noundef nonnull align 4 dereferenceable(64) getelementptr inbounds (%"struct.ImGuizmo::Context", ptr @_ZN8ImGuizmoL8gContextE, i32 0, i32 8))
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #7
  %162 = getelementptr inbounds %"struct.ImGuizmo::vec_t", ptr %24, i32 0, i32 2
  %163 = load float, ptr %162, align 4, !tbaa !15
  %164 = fcmp olt float %163, 0x3F50624DE0000000
  br i1 %164, label %165, label %166

165:                                              ; preds = %147
  store i8 1, ptr %22, align 1, !tbaa !13
  store i32 5, ptr %12, align 4
  br label %167

166:                                              ; preds = %147
  store i32 0, ptr %12, align 4
  br label %167

167:                                              ; preds = %166, %165
  call void @llvm.lifetime.end.p0(i64 16, ptr %24) #7
  %168 = load i32, ptr %12, align 4
  switch i32 %168, label %173 [
    i32 0, label %169
  ]

169:                                              ; preds = %167
  br label %170

170:                                              ; preds = %169
  %171 = load i32, ptr %23, align 4, !tbaa !9
  %172 = add i32 %171, 1
  store i32 %172, ptr %23, align 4, !tbaa !9
  br label %143, !llvm.loop !17

173:                                              ; preds = %167, %146
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #7
  br label %174

174:                                              ; preds = %173
  %175 = load i8, ptr %22, align 1, !tbaa !13, !range !19, !noundef !20
  %176 = trunc i8 %175 to i1
  br i1 %176, label %177, label %178

177:                                              ; preds = %174
  store i32 4, ptr %12, align 4
  br label %266

178:                                              ; preds = %174
  call void @llvm.lifetime.start.p0(i64 32, ptr %27) #7
  %179 = getelementptr inbounds [4 x %struct.ImVec2], ptr %27, i32 0, i32 0
  %180 = getelementptr inbounds %struct.ImVec2, ptr %179, i64 4
  br label %181

181:                                              ; preds = %181, %178
  %182 = phi ptr [ %179, %178 ], [ %183, %181 ]
  call void @_ZN6ImVec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %182)
  %183 = getelementptr inbounds %struct.ImVec2, ptr %182, i64 1
  %184 = icmp eq ptr %183, %180
  br i1 %184, label %185, label %181

185:                                              ; preds = %181
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #7
  store i32 0, ptr %28, align 4, !tbaa !9
  br label %186

186:                                              ; preds = %209, %185
  %187 = load i32, ptr %28, align 4, !tbaa !9
  %188 = icmp ult i32 %187, 4
  br i1 %188, label %190, label %189

189:                                              ; preds = %186
  store i32 8, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #7
  br label %212

190:                                              ; preds = %186
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %30) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %31) #7
  %191 = load i32, ptr %28, align 4, !tbaa !9
  %192 = zext i32 %191 to i64
  %193 = getelementptr inbounds [4 x %"struct.ImGuizmo::vec_t"], ptr %17, i64 0, i64 %192
  %194 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %193, float noundef 5.000000e-01)
  %195 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %31, i32 0, i32 0
  %196 = extractvalue { <2 x float>, <2 x float> } %194, 0
  store <2 x float> %196, ptr %195, align 4
  %197 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %31, i32 0, i32 1
  %198 = extractvalue { <2 x float>, <2 x float> } %194, 1
  store <2 x float> %198, ptr %197, align 4
  %199 = load float, ptr %16, align 4, !tbaa !11
  %200 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %31, float noundef %199)
  %201 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %30, i32 0, i32 0
  %202 = extractvalue { <2 x float>, <2 x float> } %200, 0
  store <2 x float> %202, ptr %201, align 4
  %203 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %30, i32 0, i32 1
  %204 = extractvalue { <2 x float>, <2 x float> } %200, 1
  store <2 x float> %204, ptr %203, align 4
  %205 = call <2 x float> @_ZN8ImGuizmoL10worldToPosERKNS_5vec_tERKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %30, ptr noundef nonnull align 4 dereferenceable(64) %9)
  store <2 x float> %205, ptr %29, align 4
  %206 = load i32, ptr %28, align 4, !tbaa !9
  %207 = zext i32 %206 to i64
  %208 = getelementptr inbounds [4 x %struct.ImVec2], ptr %27, i64 0, i64 %207
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %208, ptr align 4 %29, i64 8, i1 false), !tbaa.struct !21
  call void @llvm.lifetime.end.p0(i64 16, ptr %31) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %30) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #7
  br label %209

209:                                              ; preds = %190
  %210 = load i32, ptr %28, align 4, !tbaa !9
  %211 = add i32 %210, 1
  store i32 %211, ptr %28, align 4, !tbaa !9
  br label %186, !llvm.loop !22

212:                                              ; preds = %189
  call void @llvm.lifetime.start.p0(i64 16, ptr %32) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %33) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %34) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %35) #7
  %213 = getelementptr inbounds [4 x %"struct.ImGuizmo::vec_t"], ptr %17, i64 0, i64 0
  %214 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %213, float noundef 5.000000e-01)
  %215 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %35, i32 0, i32 0
  %216 = extractvalue { <2 x float>, <2 x float> } %214, 0
  store <2 x float> %216, ptr %215, align 4
  %217 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %35, i32 0, i32 1
  %218 = extractvalue { <2 x float>, <2 x float> } %214, 1
  store <2 x float> %218, ptr %217, align 4
  %219 = load float, ptr %16, align 4, !tbaa !11
  %220 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %35, float noundef %219)
  %221 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %34, i32 0, i32 0
  %222 = extractvalue { <2 x float>, <2 x float> } %220, 0
  store <2 x float> %222, ptr %221, align 4
  %223 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %34, i32 0, i32 1
  %224 = extractvalue { <2 x float>, <2 x float> } %220, 1
  store <2 x float> %224, ptr %223, align 4
  %225 = load ptr, ptr %8, align 8, !tbaa !5
  call void @_ZN8ImGuizmo5vec_t14TransformPointERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %32, ptr noundef nonnull align 4 dereferenceable(16) %34, ptr noundef nonnull align 4 dereferenceable(64) %225)
  call void @llvm.lifetime.end.p0(i64 16, ptr %35) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %34) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %36) #7
  %226 = load i32, ptr %13, align 4, !tbaa !9
  %227 = sext i32 %226 to i64
  %228 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %227
  %229 = load float, ptr %16, align 4, !tbaa !11
  %230 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %228, float noundef %229)
  %231 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %36, i32 0, i32 0
  %232 = extractvalue { <2 x float>, <2 x float> } %230, 0
  store <2 x float> %232, ptr %231, align 4
  %233 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %36, i32 0, i32 1
  %234 = extractvalue { <2 x float>, <2 x float> } %230, 1
  store <2 x float> %234, ptr %233, align 4
  %235 = load ptr, ptr %8, align 8, !tbaa !5
  call void @_ZN8ImGuizmo5vec_t15TransformVectorERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %33, ptr noundef nonnull align 4 dereferenceable(16) %36, ptr noundef nonnull align 4 dereferenceable(64) %235)
  call void @llvm.lifetime.end.p0(i64 16, ptr %36) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %38) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %39) #7
  %236 = getelementptr inbounds %"struct.ImGuizmo::matrix_t", ptr %7, i32 0, i32 0
  %237 = getelementptr inbounds %struct.anon, ptr %236, i32 0, i32 3
  %238 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %32, ptr noundef nonnull align 4 dereferenceable(16) %237)
  %239 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %39, i32 0, i32 0
  %240 = extractvalue { <2 x float>, <2 x float> } %238, 0
  store <2 x float> %240, ptr %239, align 4
  %241 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %39, i32 0, i32 1
  %242 = extractvalue { <2 x float>, <2 x float> } %238, 1
  store <2 x float> %242, ptr %241, align 4
  %243 = call { <2 x float>, <2 x float> } @_ZN8ImGuizmo10NormalizedERKNS_5vec_tE(ptr noundef nonnull align 4 dereferenceable(16) %39)
  %244 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %38, i32 0, i32 0
  %245 = extractvalue { <2 x float>, <2 x float> } %243, 0
  store <2 x float> %245, ptr %244, align 4
  %246 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %38, i32 0, i32 1
  %247 = extractvalue { <2 x float>, <2 x float> } %243, 1
  store <2 x float> %247, ptr %246, align 4
  call void @llvm.lifetime.start.p0(i64 16, ptr %40) #7
  %248 = call { <2 x float>, <2 x float> } @_ZN8ImGuizmo10NormalizedERKNS_5vec_tE(ptr noundef nonnull align 4 dereferenceable(16) %33)
  %249 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %40, i32 0, i32 0
  %250 = extractvalue { <2 x float>, <2 x float> } %248, 0
  store <2 x float> %250, ptr %249, align 4
  %251 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %40, i32 0, i32 1
  %252 = extractvalue { <2 x float>, <2 x float> } %248, 1
  store <2 x float> %252, ptr %251, align 4
  %253 = call noundef float @_ZN8ImGuizmo3DotERKNS_5vec_tES2_(ptr noundef nonnull align 4 dereferenceable(16) %38, ptr noundef nonnull align 4 dereferenceable(16) %40)
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %39) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %38) #7
  store float %253, ptr %37, align 4, !tbaa !11
  %254 = load float, ptr %37, align 4, !tbaa !11
  %255 = fcmp ogt float %254, 0.000000e+00
  br i1 %255, label %256, label %257

256:                                              ; preds = %212
  store i32 4, ptr %12, align 4
  br label %265

257:                                              ; preds = %212
  %258 = load ptr, ptr @_ZN8ImGuizmoL8gContextE, align 8, !tbaa !23
  %259 = getelementptr inbounds [4 x %struct.ImVec2], ptr %27, i64 0, i64 0
  %260 = load i32, ptr %13, align 4, !tbaa !9
  %261 = sext i32 %260 to i64
  %262 = getelementptr inbounds [3 x i32], ptr @_ZN8ImGuizmoL14directionColorE, i64 0, i64 %261
  %263 = load i32, ptr %262, align 4, !tbaa !9
  %264 = or i32 %263, 8421504
  call void @_ZN10ImDrawList19AddConvexPolyFilledEPK6ImVec2ij(ptr noundef nonnull align 8 dereferenceable(168) %258, ptr noundef %259, i32 noundef 4, i32 noundef %264)
  store i32 0, ptr %12, align 4
  br label %265

265:                                              ; preds = %257, %256
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %33) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %32) #7
  call void @llvm.lifetime.end.p0(i64 32, ptr %27) #7
  br label %266

266:                                              ; preds = %265, %177
  call void @llvm.lifetime.end.p0(i64 1, ptr %22) #7
  call void @llvm.lifetime.end.p0(i64 64, ptr %17) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #7
  %267 = load i32, ptr %12, align 4
  switch i32 %267, label %273 [
    i32 0, label %268
    i32 4, label %269
  ]

268:                                              ; preds = %266
  br label %269

269:                                              ; preds = %268, %266
  %270 = load i32, ptr %11, align 4, !tbaa !9
  %271 = add nsw i32 %270, 1
  store i32 %271, ptr %11, align 4, !tbaa !9
  br label %47, !llvm.loop !28

272:                                              ; preds = %50
  call void @llvm.lifetime.end.p0(i64 64, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #7
  call void @llvm.lifetime.end.p0(i64 64, ptr %7) #7
  ret void

273:                                              ; preds = %266
  unreachable
}

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN6ImVec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8)) unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare hidden <2 x float> @_ZN8ImGuizmoL10worldToPosERKNS_5vec_tERKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(64)) #1

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN8ImGuizmo5vec_t15TransformVectorERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(64)) #3 align 2

declare void @_ZN10ImDrawList19AddConvexPolyFilledEPK6ImVec2ij(ptr noundef nonnull align 8 dereferenceable(168), ptr noundef, i32 noundef, i32 noundef) #6

attributes #0 = { mustprogress nounwind uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { "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 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"float", !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"bool", !7, i64 0}
!15 = !{!16, !12, i64 8}
!16 = !{!"_ZTSN8ImGuizmo5vec_tE", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = !{i8 0, i8 2}
!20 = !{}
!21 = !{i64 0, i64 4, !11, i64 4, i64 4, !11}
!22 = distinct !{!22, !18}
!23 = !{!24, !6, i64 0}
!24 = !{!"_ZTSN8ImGuizmo7ContextE", !6, i64 0, !25, i64 8, !26, i64 12, !26, i64 76, !26, i64 140, !26, i64 204, !26, i64 268, !26, i64 332, !26, i64 396, !26, i64 460, !16, i64 524, !16, i64 540, !16, i64 556, !16, i64 572, !16, i64 588, !16, i64 604, !16, i64 620, !12, i64 636, !27, i64 640, !27, i64 648, !27, i64 656, !12, i64 664, !16, i64 668, !14, i64 684, !14, i64 685, !16, i64 688, !16, i64 704, !16, i64 720, !16, i64 736, !12, i64 752, !12, i64 756, !16, i64 760, !16, i64 776, !12, i64 792, !7, i64 796, !7, i64 799, !7, i64 804, !16, i64 816, !16, i64 832, !16, i64 848, !16, i64 864, !10, i64 880, !7, i64 884, !14, i64 892, !26, i64 896, !10, i64 960, !12, i64 964, !12, i64 968, !12, i64 972, !12, i64 976, !12, i64 980, !12, i64 984}
!25 = !{!"_ZTSN8ImGuizmo4MODEE", !7, i64 0}
!26 = !{!"_ZTSN8ImGuizmo8matrix_tE", !7, i64 0}
!27 = !{!"_ZTS6ImVec2", !12, i64 0, !12, i64 4}
!28 = distinct !{!28, !18}


; 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.ImGuizmo::Context" = type <{ ptr, i32, %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::matrix_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", float, %struct.ImVec2, %struct.ImVec2, %struct.ImVec2, float, %"struct.ImGuizmo::vec_t", i8, i8, [2 x i8], %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", float, float, %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", float, [3 x i8], [3 x i8], [2 x i8], [3 x float], %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", %"struct.ImGuizmo::vec_t", i32, [2 x i32], i8, [3 x i8], %"struct.ImGuizmo::matrix_t", i32, float, float, float, float, float, float, [4 x i8] }>
%struct.ImVec2 = type { float, float }
%"struct.ImGuizmo::vec_t" = type { float, float, float, float }
%"struct.ImGuizmo::matrix_t" = type { %union.anon }
%union.anon = type { [4 x [4 x float]] }

@_ZN8ImGuizmoL8gContextE = external hidden global %"struct.ImGuizmo::Context", align 8
@_ZN8ImGuizmoL14directionUnaryE = external hidden global [3 x %"struct.ImGuizmo::vec_t"], align 16
@_ZN8ImGuizmoL14directionColorE = external hidden local_unnamed_addr constant [3 x i32], align 4

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZN8ImGuizmo10NormalizedERKNS_5vec_tE(ptr noundef nonnull align 4 dereferenceable(16)) local_unnamed_addr #1

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

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

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK8ImGuizmo8matrix_tmlERKS0_(ptr dead_on_unwind noalias writable sret(%"struct.ImGuizmo::matrix_t") align 4, ptr noundef nonnull align 4 dereferenceable(64), ptr noundef nonnull align 4 dereferenceable(64)) local_unnamed_addr #4 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN8ImGuizmo5vec_t14TransformPointERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(64)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN8ImGuizmo8DrawCubeEPKfS1_Pf(ptr noundef %0, ptr noundef %1, ptr noundef %2) local_unnamed_addr #1 {
  %4 = alloca %"struct.ImGuizmo::matrix_t", align 4
  %5 = alloca %"struct.ImGuizmo::matrix_t", align 4
  %6 = alloca %"struct.ImGuizmo::matrix_t", align 4
  %7 = alloca [4 x %"struct.ImGuizmo::vec_t"], align 16
  %8 = alloca %"struct.ImGuizmo::vec_t", align 8
  %9 = alloca %"struct.ImGuizmo::vec_t", align 8
  %10 = alloca %"struct.ImGuizmo::vec_t", align 8
  %11 = alloca %"struct.ImGuizmo::vec_t", align 8
  %12 = alloca %"struct.ImGuizmo::vec_t", align 4
  %13 = alloca %"struct.ImGuizmo::vec_t", align 8
  %14 = alloca %"struct.ImGuizmo::vec_t", align 8
  %15 = alloca [4 x %struct.ImVec2], align 16
  %16 = alloca %"struct.ImGuizmo::vec_t", align 8
  %17 = alloca %"struct.ImGuizmo::vec_t", align 8
  %18 = alloca %"struct.ImGuizmo::vec_t", align 4
  %19 = alloca %"struct.ImGuizmo::vec_t", align 4
  %20 = alloca %"struct.ImGuizmo::vec_t", align 8
  %21 = alloca %"struct.ImGuizmo::vec_t", align 8
  %22 = alloca %"struct.ImGuizmo::vec_t", align 8
  %23 = alloca %"struct.ImGuizmo::vec_t", align 8
  %24 = alloca %"struct.ImGuizmo::vec_t", align 8
  %25 = alloca %"struct.ImGuizmo::vec_t", align 8
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %4) #6
  call void @_ZN8ImGuizmo8matrix_tC2Ev(ptr noundef nonnull align 4 dereferenceable(64) %4)
  %26 = call noundef float @_ZN8ImGuizmo8matrix_t7InverseERKS0_b(ptr noundef nonnull align 4 dereferenceable(64) %4, ptr noundef nonnull align 4 dereferenceable(64) %0, i1 noundef zeroext false)
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %5) #6
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %6) #6
  call void @_ZNK8ImGuizmo8matrix_tmlERKS0_(ptr dead_on_unwind nonnull writable sret(%"struct.ImGuizmo::matrix_t") align 4 %6, ptr noundef nonnull align 4 dereferenceable(64) %2, ptr noundef nonnull align 4 dereferenceable(64) %0)
  call void @_ZNK8ImGuizmo8matrix_tmlERKS0_(ptr dead_on_unwind nonnull writable sret(%"struct.ImGuizmo::matrix_t") align 4 %5, ptr noundef nonnull align 4 dereferenceable(64) %6, ptr noundef nonnull align 4 dereferenceable(64) %1)
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %6) #6
  %27 = getelementptr inbounds i8, ptr %8, i64 8
  %28 = getelementptr inbounds i8, ptr %7, i64 8
  %29 = getelementptr inbounds i8, ptr %7, i64 16
  %30 = getelementptr inbounds i8, ptr %9, i64 8
  %31 = getelementptr inbounds i8, ptr %7, i64 24
  %32 = getelementptr inbounds i8, ptr %7, i64 32
  %33 = getelementptr inbounds i8, ptr %10, i64 8
  %34 = getelementptr inbounds i8, ptr %7, i64 40
  %35 = getelementptr inbounds i8, ptr %7, i64 48
  %36 = getelementptr inbounds i8, ptr %11, i64 8
  %37 = getelementptr inbounds i8, ptr %7, i64 56
  %38 = getelementptr inbounds i8, ptr %14, i64 8
  %39 = getelementptr inbounds i8, ptr %13, i64 8
  %40 = getelementptr inbounds i8, ptr %12, i64 8
  %41 = getelementptr inbounds i8, ptr %17, i64 8
  %42 = getelementptr inbounds i8, ptr %16, i64 8
  %43 = getelementptr inbounds i8, ptr %21, i64 8
  %44 = getelementptr inbounds i8, ptr %20, i64 8
  %45 = getelementptr inbounds i8, ptr %22, i64 8
  %46 = getelementptr inbounds i8, ptr %4, i64 48
  %47 = getelementptr inbounds i8, ptr %24, i64 8
  %48 = getelementptr inbounds i8, ptr %23, i64 8
  %49 = getelementptr inbounds i8, ptr %25, i64 8
  %.ptr.1 = getelementptr inbounds i8, ptr %15, i64 8
  %.ptr.2 = getelementptr inbounds i8, ptr %15, i64 16
  %.ptr.3 = getelementptr inbounds i8, ptr %15, i64 24
  br label %51

50:                                               ; preds = %.loopexit
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %5) #6
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %4) #6
  ret void

51:                                               ; preds = %3, %.loopexit
  %.047 = phi i32 [ 0, %3 ], [ %179, %.loopexit ]
  %.urem = add nsw i32 %.047, -3
  %.cmp = icmp ult i32 %.047, 3
  %52 = select i1 %.cmp, i32 %.047, i32 %.urem
  %53 = add nuw nsw i32 %52, 1
  %54 = icmp eq i32 %53, 3
  %55 = select i1 %54, i32 0, i32 %53
  %56 = add nuw nsw i32 %52, 2
  %57 = urem i32 %56, 3
  %58 = icmp ugt i32 %.047, 2
  %59 = select i1 %58, float -1.000000e+00, float 1.000000e+00
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %7) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %8) #6
  %60 = zext nneg i32 %52 to i64
  %61 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %60
  %62 = zext nneg i32 %55 to i64
  %63 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %62
  %64 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tplERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %61, ptr noundef nonnull align 4 dereferenceable(16) %63)
  %65 = extractvalue { <2 x float>, <2 x float> } %64, 0
  store <2 x float> %65, ptr %8, align 8
  %66 = extractvalue { <2 x float>, <2 x float> } %64, 1
  store <2 x float> %66, ptr %27, align 8
  %67 = zext nneg i32 %57 to i64
  %68 = getelementptr inbounds [3 x %"struct.ImGuizmo::vec_t"], ptr @_ZN8ImGuizmoL14directionUnaryE, i64 0, i64 %67
  %69 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tplERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %8, ptr noundef nonnull align 4 dereferenceable(16) %68)
  %70 = extractvalue { <2 x float>, <2 x float> } %69, 0
  store <2 x float> %70, ptr %7, align 16
  %71 = extractvalue { <2 x float>, <2 x float> } %69, 1
  store <2 x float> %71, ptr %28, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #6
  %72 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tplERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %61, ptr noundef nonnull align 4 dereferenceable(16) %63)
  %73 = extractvalue { <2 x float>, <2 x float> } %72, 0
  store <2 x float> %73, ptr %9, align 8
  %74 = extractvalue { <2 x float>, <2 x float> } %72, 1
  store <2 x float> %74, ptr %30, align 8
  %75 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %9, ptr noundef nonnull align 4 dereferenceable(16) %68)
  %76 = extractvalue { <2 x float>, <2 x float> } %75, 0
  store <2 x float> %76, ptr %29, align 16
  %77 = extractvalue { <2 x float>, <2 x float> } %75, 1
  store <2 x float> %77, ptr %31, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #6
  %78 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %61, ptr noundef nonnull align 4 dereferenceable(16) %63)
  %79 = extractvalue { <2 x float>, <2 x float> } %78, 0
  store <2 x float> %79, ptr %10, align 8
  %80 = extractvalue { <2 x float>, <2 x float> } %78, 1
  store <2 x float> %80, ptr %33, align 8
  %81 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %10, ptr noundef nonnull align 4 dereferenceable(16) %68)
  %82 = extractvalue { <2 x float>, <2 x float> } %81, 0
  store <2 x float> %82, ptr %32, align 16
  %83 = extractvalue { <2 x float>, <2 x float> } %81, 1
  store <2 x float> %83, ptr %34, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %11) #6
  %84 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %61, ptr noundef nonnull align 4 dereferenceable(16) %63)
  %85 = extractvalue { <2 x float>, <2 x float> } %84, 0
  store <2 x float> %85, ptr %11, align 8
  %86 = extractvalue { <2 x float>, <2 x float> } %84, 1
  store <2 x float> %86, ptr %36, align 8
  %87 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tplERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %11, ptr noundef nonnull align 4 dereferenceable(16) %68)
  %88 = extractvalue { <2 x float>, <2 x float> } %87, 0
  store <2 x float> %88, ptr %35, align 16
  %89 = extractvalue { <2 x float>, <2 x float> } %87, 1
  store <2 x float> %89, ptr %37, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %11) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #6
  %90 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %7, float noundef 5.000000e-01)
  %91 = extractvalue { <2 x float>, <2 x float> } %90, 0
  store <2 x float> %91, ptr %14, align 8
  %92 = extractvalue { <2 x float>, <2 x float> } %90, 1
  store <2 x float> %92, ptr %38, align 8
  %93 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %14, float noundef %59)
  %94 = extractvalue { <2 x float>, <2 x float> } %93, 0
  store <2 x float> %94, ptr %13, align 8
  %95 = extractvalue { <2 x float>, <2 x float> } %93, 1
  store <2 x float> %95, ptr %39, align 8
  call void @_ZN8ImGuizmo5vec_t14TransformPointERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %12, ptr noundef nonnull align 4 dereferenceable(16) %13, ptr noundef nonnull align 4 dereferenceable(64) getelementptr inbounds (i8, ptr @_ZN8ImGuizmoL8gContextE, i64 396))
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #6
  %96 = load float, ptr %40, align 4, !tbaa !5
  %97 = fcmp uge float %96, 0x3F50624DE0000000
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #6
  br i1 %97, label %98, label %.loopexit

98:                                               ; preds = %51
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #6
  %99 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %29, float noundef 5.000000e-01)
  %100 = extractvalue { <2 x float>, <2 x float> } %99, 0
  store <2 x float> %100, ptr %14, align 8
  %101 = extractvalue { <2 x float>, <2 x float> } %99, 1
  store <2 x float> %101, ptr %38, align 8
  %102 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %14, float noundef %59)
  %103 = extractvalue { <2 x float>, <2 x float> } %102, 0
  store <2 x float> %103, ptr %13, align 8
  %104 = extractvalue { <2 x float>, <2 x float> } %102, 1
  store <2 x float> %104, ptr %39, align 8
  call void @_ZN8ImGuizmo5vec_t14TransformPointERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %12, ptr noundef nonnull align 4 dereferenceable(16) %13, ptr noundef nonnull align 4 dereferenceable(64) getelementptr inbounds (i8, ptr @_ZN8ImGuizmoL8gContextE, i64 396))
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #6
  %105 = load float, ptr %40, align 4, !tbaa !5
  %106 = fcmp uge float %105, 0x3F50624DE0000000
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #6
  br i1 %106, label %107, label %.loopexit

107:                                              ; preds = %98
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #6
  %108 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %32, float noundef 5.000000e-01)
  %109 = extractvalue { <2 x float>, <2 x float> } %108, 0
  store <2 x float> %109, ptr %14, align 8
  %110 = extractvalue { <2 x float>, <2 x float> } %108, 1
  store <2 x float> %110, ptr %38, align 8
  %111 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %14, float noundef %59)
  %112 = extractvalue { <2 x float>, <2 x float> } %111, 0
  store <2 x float> %112, ptr %13, align 8
  %113 = extractvalue { <2 x float>, <2 x float> } %111, 1
  store <2 x float> %113, ptr %39, align 8
  call void @_ZN8ImGuizmo5vec_t14TransformPointERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %12, ptr noundef nonnull align 4 dereferenceable(16) %13, ptr noundef nonnull align 4 dereferenceable(64) getelementptr inbounds (i8, ptr @_ZN8ImGuizmoL8gContextE, i64 396))
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #6
  %114 = load float, ptr %40, align 4, !tbaa !5
  %115 = fcmp uge float %114, 0x3F50624DE0000000
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #6
  br i1 %115, label %116, label %.loopexit

116:                                              ; preds = %107
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #6
  %117 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %35, float noundef 5.000000e-01)
  %118 = extractvalue { <2 x float>, <2 x float> } %117, 0
  store <2 x float> %118, ptr %14, align 8
  %119 = extractvalue { <2 x float>, <2 x float> } %117, 1
  store <2 x float> %119, ptr %38, align 8
  %120 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %14, float noundef %59)
  %121 = extractvalue { <2 x float>, <2 x float> } %120, 0
  store <2 x float> %121, ptr %13, align 8
  %122 = extractvalue { <2 x float>, <2 x float> } %120, 1
  store <2 x float> %122, ptr %39, align 8
  call void @_ZN8ImGuizmo5vec_t14TransformPointERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %12, ptr noundef nonnull align 4 dereferenceable(16) %13, ptr noundef nonnull align 4 dereferenceable(64) getelementptr inbounds (i8, ptr @_ZN8ImGuizmoL8gContextE, i64 396))
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #6
  %123 = load float, ptr %40, align 4, !tbaa !5
  %124 = fcmp uge float %123, 0x3F50624DE0000000
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #6
  br i1 %124, label %.critedge.loopexit, label %.loopexit

.critedge.loopexit:                               ; preds = %116
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %15) #6
  call void @_ZN6ImVec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %15)
  call void @_ZN6ImVec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %.ptr.1)
  call void @_ZN6ImVec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %.ptr.2)
  call void @_ZN6ImVec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %.ptr.3)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #6
  %125 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %7, float noundef 5.000000e-01)
  %126 = extractvalue { <2 x float>, <2 x float> } %125, 0
  store <2 x float> %126, ptr %17, align 8
  %127 = extractvalue { <2 x float>, <2 x float> } %125, 1
  store <2 x float> %127, ptr %41, align 8
  %128 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %17, float noundef %59)
  %129 = extractvalue { <2 x float>, <2 x float> } %128, 0
  store <2 x float> %129, ptr %16, align 8
  %130 = extractvalue { <2 x float>, <2 x float> } %128, 1
  store <2 x float> %130, ptr %42, align 8
  %131 = call <2 x float> @_ZN8ImGuizmoL10worldToPosERKNS_5vec_tERKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %16, ptr noundef nonnull align 4 dereferenceable(64) %5)
  store <2 x float> %131, ptr %15, align 16
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #6
  %132 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %29, float noundef 5.000000e-01)
  %133 = extractvalue { <2 x float>, <2 x float> } %132, 0
  store <2 x float> %133, ptr %17, align 8
  %134 = extractvalue { <2 x float>, <2 x float> } %132, 1
  store <2 x float> %134, ptr %41, align 8
  %135 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %17, float noundef %59)
  %136 = extractvalue { <2 x float>, <2 x float> } %135, 0
  store <2 x float> %136, ptr %16, align 8
  %137 = extractvalue { <2 x float>, <2 x float> } %135, 1
  store <2 x float> %137, ptr %42, align 8
  %138 = call <2 x float> @_ZN8ImGuizmoL10worldToPosERKNS_5vec_tERKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %16, ptr noundef nonnull align 4 dereferenceable(64) %5)
  store <2 x float> %138, ptr %.ptr.1, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #6
  %139 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %32, float noundef 5.000000e-01)
  %140 = extractvalue { <2 x float>, <2 x float> } %139, 0
  store <2 x float> %140, ptr %17, align 8
  %141 = extractvalue { <2 x float>, <2 x float> } %139, 1
  store <2 x float> %141, ptr %41, align 8
  %142 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %17, float noundef %59)
  %143 = extractvalue { <2 x float>, <2 x float> } %142, 0
  store <2 x float> %143, ptr %16, align 8
  %144 = extractvalue { <2 x float>, <2 x float> } %142, 1
  store <2 x float> %144, ptr %42, align 8
  %145 = call <2 x float> @_ZN8ImGuizmoL10worldToPosERKNS_5vec_tERKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %16, ptr noundef nonnull align 4 dereferenceable(64) %5)
  store <2 x float> %145, ptr %.ptr.2, align 16
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #6
  %146 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %35, float noundef 5.000000e-01)
  %147 = extractvalue { <2 x float>, <2 x float> } %146, 0
  store <2 x float> %147, ptr %17, align 8
  %148 = extractvalue { <2 x float>, <2 x float> } %146, 1
  store <2 x float> %148, ptr %41, align 8
  %149 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %17, float noundef %59)
  %150 = extractvalue { <2 x float>, <2 x float> } %149, 0
  store <2 x float> %150, ptr %16, align 8
  %151 = extractvalue { <2 x float>, <2 x float> } %149, 1
  store <2 x float> %151, ptr %42, align 8
  %152 = call <2 x float> @_ZN8ImGuizmoL10worldToPosERKNS_5vec_tERKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %16, ptr noundef nonnull align 4 dereferenceable(64) %5)
  store <2 x float> %152, ptr %.ptr.3, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %18) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %19) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %21) #6
  %153 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %7, float noundef 5.000000e-01)
  %154 = extractvalue { <2 x float>, <2 x float> } %153, 0
  store <2 x float> %154, ptr %21, align 8
  %155 = extractvalue { <2 x float>, <2 x float> } %153, 1
  store <2 x float> %155, ptr %43, align 8
  %156 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %21, float noundef %59)
  %157 = extractvalue { <2 x float>, <2 x float> } %156, 0
  store <2 x float> %157, ptr %20, align 8
  %158 = extractvalue { <2 x float>, <2 x float> } %156, 1
  store <2 x float> %158, ptr %44, align 8
  call void @_ZN8ImGuizmo5vec_t14TransformPointERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %18, ptr noundef nonnull align 4 dereferenceable(16) %20, ptr noundef nonnull align 4 dereferenceable(64) %2)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %21) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %22) #6
  %159 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmlEf(ptr noundef nonnull align 4 dereferenceable(16) %61, float noundef %59)
  %160 = extractvalue { <2 x float>, <2 x float> } %159, 0
  store <2 x float> %160, ptr %22, align 8
  %161 = extractvalue { <2 x float>, <2 x float> } %159, 1
  store <2 x float> %161, ptr %45, align 8
  call void @_ZN8ImGuizmo5vec_t15TransformVectorERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16) %19, ptr noundef nonnull align 4 dereferenceable(16) %22, ptr noundef nonnull align 4 dereferenceable(64) %2)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %22) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %23) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %24) #6
  %162 = call { <2 x float>, <2 x float> } @_ZNK8ImGuizmo5vec_tmiERKS0_(ptr noundef nonnull align 4 dereferenceable(16) %18, ptr noundef nonnull align 4 dereferenceable(16) %46)
  %163 = extractvalue { <2 x float>, <2 x float> } %162, 0
  store <2 x float> %163, ptr %24, align 8
  %164 = extractvalue { <2 x float>, <2 x float> } %162, 1
  store <2 x float> %164, ptr %47, align 8
  %165 = call { <2 x float>, <2 x float> } @_ZN8ImGuizmo10NormalizedERKNS_5vec_tE(ptr noundef nonnull align 4 dereferenceable(16) %24)
  %166 = extractvalue { <2 x float>, <2 x float> } %165, 0
  store <2 x float> %166, ptr %23, align 8
  %167 = extractvalue { <2 x float>, <2 x float> } %165, 1
  store <2 x float> %167, ptr %48, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %25) #6
  %168 = call { <2 x float>, <2 x float> } @_ZN8ImGuizmo10NormalizedERKNS_5vec_tE(ptr noundef nonnull align 4 dereferenceable(16) %19)
  %169 = extractvalue { <2 x float>, <2 x float> } %168, 0
  store <2 x float> %169, ptr %25, align 8
  %170 = extractvalue { <2 x float>, <2 x float> } %168, 1
  store <2 x float> %170, ptr %49, align 8
  %171 = call noundef float @_ZN8ImGuizmo3DotERKNS_5vec_tES2_(ptr noundef nonnull align 4 dereferenceable(16) %23, ptr noundef nonnull align 4 dereferenceable(16) %25)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %25) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %24) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %23) #6
  %172 = fcmp ogt float %171, 0.000000e+00
  br i1 %172, label %178, label %173

173:                                              ; preds = %.critedge.loopexit
  %174 = load ptr, ptr @_ZN8ImGuizmoL8gContextE, align 8, !tbaa !10
  %175 = getelementptr inbounds [3 x i32], ptr @_ZN8ImGuizmoL14directionColorE, i64 0, i64 %60
  %176 = load i32, ptr %175, align 4, !tbaa !18
  %177 = or i32 %176, 8421504
  call void @_ZN10ImDrawList19AddConvexPolyFilledEPK6ImVec2ij(ptr noundef nonnull align 8 dereferenceable(168) %174, ptr noundef nonnull %15, i32 noundef 4, i32 noundef %177)
  br label %178

178:                                              ; preds = %.critedge.loopexit, %173
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %19) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %18) #6
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %15) #6
  br label %.loopexit

.loopexit:                                        ; preds = %51, %98, %107, %116, %178
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %7) #6
  %179 = add nuw nsw i32 %.047, 1
  %exitcond.not = icmp eq i32 %179, 6
  br i1 %exitcond.not, label %50, label %51, !llvm.loop !19
}

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

; Function Attrs: mustprogress uwtable
declare hidden <2 x float> @_ZN8ImGuizmoL10worldToPosERKNS_5vec_tERKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(64)) local_unnamed_addr #1

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN8ImGuizmo5vec_t15TransformVectorERKS0_RKNS_8matrix_tE(ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(64)) local_unnamed_addr #2 align 2

declare void @_ZN10ImDrawList19AddConvexPolyFilledEPK6ImVec2ij(ptr noundef nonnull align 8 dereferenceable(168), ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #5

attributes #0 = { mustprogress nounwind uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { 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, !7, i64 8}
!6 = !{!"_ZTSN8ImGuizmo5vec_tE", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12}
!7 = !{!"float", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!11, !12, i64 0}
!11 = !{!"_ZTSN8ImGuizmo7ContextE", !12, i64 0, !13, i64 8, !14, i64 12, !14, i64 76, !14, i64 140, !14, i64 204, !14, i64 268, !14, i64 332, !14, i64 396, !14, i64 460, !6, i64 524, !6, i64 540, !6, i64 556, !6, i64 572, !6, i64 588, !6, i64 604, !6, i64 620, !7, i64 636, !15, i64 640, !15, i64 648, !15, i64 656, !7, i64 664, !6, i64 668, !16, i64 684, !16, i64 685, !6, i64 688, !6, i64 704, !6, i64 720, !6, i64 736, !7, i64 752, !7, i64 756, !6, i64 760, !6, i64 776, !7, i64 792, !8, i64 796, !8, i64 799, !8, i64 804, !6, i64 816, !6, i64 832, !6, i64 848, !6, i64 864, !17, i64 880, !8, i64 884, !16, i64 892, !14, i64 896, !17, i64 960, !7, i64 964, !7, i64 968, !7, i64 972, !7, i64 976, !7, i64 980, !7, i64 984}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!"_ZTSN8ImGuizmo4MODEE", !8, i64 0}
!14 = !{!"_ZTSN8ImGuizmo8matrix_tE", !8, i64 0}
!15 = !{!"_ZTS6ImVec2", !7, i64 0, !7, i64 4}
!16 = !{!"bool", !8, i64 0}
!17 = !{!"int", !8, i64 0}
!18 = !{!17, !17, i64 0}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}


; Effective O3 passes: ConstraintEliminationPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopInstSimplifyPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,SROAPass,SimplifyCFGPass