; LLVM IR from vokegpu/bicudo :: src/util/math.ll (ZN6bicudo5orthoEffff)

; 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.bicudo::mat4" = type { %union.anon.0 }
%union.anon.0 = type { %struct.anon.1 }
%struct.anon.1 = type { float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float }

; 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 @_ZN6bicudo5orthoEffff(ptr dead_on_unwind noalias writable sret(%"struct.bicudo::mat4") align 4 %0, float noundef %1, float noundef %2, float noundef %3, float noundef %4) #1 {
  %6 = alloca float, align 4
  %7 = alloca float, align 4
  %8 = alloca float, align 4
  %9 = alloca float, align 4
  %10 = alloca float, align 4
  %11 = alloca float, align 4
  store float %1, ptr %6, align 4, !tbaa !5
  store float %2, ptr %7, align 4, !tbaa !5
  store float %3, ptr %8, align 4, !tbaa !5
  store float %4, ptr %9, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  store float 1.000000e+00, ptr %10, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  store float -1.000000e+00, ptr %11, align 4, !tbaa !5
  %12 = load float, ptr %7, align 4, !tbaa !5
  %13 = load float, ptr %6, align 4, !tbaa !5
  %14 = fsub float %12, %13
  %15 = fdiv float 2.000000e+00, %14
  %16 = load float, ptr %9, align 4, !tbaa !5
  %17 = load float, ptr %8, align 4, !tbaa !5
  %18 = fsub float %16, %17
  %19 = fdiv float 2.000000e+00, %18
  %20 = load float, ptr %10, align 4, !tbaa !5
  %21 = load float, ptr %11, align 4, !tbaa !5
  %22 = fsub float %20, %21
  %23 = fdiv float -2.000000e+00, %22
  %24 = load float, ptr %7, align 4, !tbaa !5
  %25 = load float, ptr %6, align 4, !tbaa !5
  %26 = fadd float %24, %25
  %27 = load float, ptr %7, align 4, !tbaa !5
  %28 = load float, ptr %6, align 4, !tbaa !5
  %29 = fsub float %27, %28
  %30 = fdiv float %26, %29
  %31 = fneg float %30
  %32 = load float, ptr %9, align 4, !tbaa !5
  %33 = load float, ptr %8, align 4, !tbaa !5
  %34 = fadd float %32, %33
  %35 = load float, ptr %9, align 4, !tbaa !5
  %36 = load float, ptr %8, align 4, !tbaa !5
  %37 = fsub float %35, %36
  %38 = fdiv float %34, %37
  %39 = fneg float %38
  %40 = load float, ptr %10, align 4, !tbaa !5
  %41 = load float, ptr %11, align 4, !tbaa !5
  %42 = fadd float %40, %41
  %43 = load float, ptr %10, align 4, !tbaa !5
  %44 = load float, ptr %11, align 4, !tbaa !5
  %45 = fsub float %43, %44
  %46 = fdiv float %42, %45
  %47 = fneg float %46
  call void @_ZN6bicudo4mat4C2Effffffffffffffff(ptr noundef nonnull align 4 dereferenceable(64) %0, float noundef %15, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef %19, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef %23, float noundef 0.000000e+00, float noundef %31, float noundef %39, float noundef %47, float noundef 1.000000e+00)
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  ret void
}

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

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 = { 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 = !{!"float", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}


; 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.bicudo::mat4" = type { %union.anon.0 }
%union.anon.0 = type { %struct.anon.1 }
%struct.anon.1 = type { float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float }

; Function Attrs: mustprogress nounwind uwtable
define dso_local void @_ZN6bicudo5orthoEffff(ptr dead_on_unwind noalias nonnull writable sret(%"struct.bicudo::mat4") align 4 %0, float noundef %1, float noundef %2, float noundef %3, float noundef %4) local_unnamed_addr #0 {
  %6 = fsub float %2, %1
  %7 = fdiv float 2.000000e+00, %6
  %8 = fsub float %4, %3
  %9 = fdiv float 2.000000e+00, %8
  %10 = fadd float %1, %2
  %11 = fneg float %10
  %12 = fdiv float %11, %6
  %13 = fadd float %3, %4
  %14 = fneg float %13
  %15 = fdiv float %14, %8
  tail call void @_ZN6bicudo4mat4C2Effffffffffffffff(ptr noundef nonnull align 4 dereferenceable(64) %0, float noundef %7, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef %9, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef -1.000000e+00, float noundef 0.000000e+00, float noundef %12, float noundef %15, float noundef -0.000000e+00, float noundef 1.000000e+00)
  ret void
}

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

attributes #0 = { 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 #1 = { 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" }

!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)"}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,InferFunctionAttrsPass,InstCombinePass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,TailCallElimPass