; LLVM IR from atabakd/MuJoCo-Tutorials :: src/0_preliminaries (pd)

; 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._mjvCamera = type { i32, i32, i32, [3 x double], double, double, double }
%struct._mjvOption = type { i32, i32, [6 x i8], [6 x i8], [6 x i8], [6 x i8], [6 x i8], [22 x i8] }
%struct._mjvScene = type { i32, i32, ptr, ptr, i32, ptr, ptr, ptr, ptr, ptr, i32, [8 x %struct._mjvLight], [2 x %struct._mjvGLCamera], i8, [3 x float], [4 x float], float, i32, [9 x i8] }
%struct._mjvLight = type { [3 x float], [3 x float], [3 x float], float, float, [3 x float], [3 x float], [3 x float], i8, i8, i8 }
%struct._mjvGLCamera = type { [3 x float], [3 x float], [3 x float], float, float, float, float, float }
%struct._mjrContext = type { float, float, float, float, float, [4 x float], i32, i32, i32, i32, i32, [10 x i32], [10 x i32], [10 x i32], i32, i32, i32, i32, i32, i32, i32, i32, [10 x i32], [10 x i32], [10 x i32], [10 x i32], i32, [100 x i32], [100 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, [127 x i32], [127 x i32], i32, i32, i32, i32, i32, i32, i32, i32 }
%"class.std::chrono::duration" = type { i64 }
%struct._mjrRect = type { i32, i32, i32, i32 }
%struct._mjData = type { i32, i32, i32, i32, i32, i32, [8 x %struct._mjWarningStat], [13 x %struct._mjTimerStat], [1000 x %struct._mjSolverStat], i32, i32, [2 x double], i32, i32, i32, i32, double, [2 x double], ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct._mjWarningStat = type { i32, i32 }
%struct._mjTimerStat = type { double, i32 }
%struct._mjSolverStat = type { double, double, double, i32, i32, i32, i32 }

@m = external dso_local global ptr, align 8
@d = external dso_local global ptr, align 8
@cam = external dso_local global %struct._mjvCamera, align 8
@opt = external dso_local global %struct._mjvOption, align 4
@scn = external dso_local global %struct._mjvScene, align 8
@con = external dso_local global %struct._mjrContext, align 8
@ctrl_update_freq = external dso_local global float, align 4
@last_update = external dso_local global double, align 8
@.str.6 = external hidden unnamed_addr constant [19 x i8], align 1
@__const.main.error = external hidden unnamed_addr constant [1000 x i8], align 16
@.str.7 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [5 x i8], align 1
@mjcb_control = external global ptr, align 8

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z8keyboardP10GLFWwindowiiii(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #0

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z12mouse_buttonP10GLFWwindowiii(ptr noundef, i32 noundef, i32 noundef, i32 noundef) #0

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z10mouse_moveP10GLFWwindowdd(ptr noundef, double noundef, double noundef) #0

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z6scrollP10GLFWwindowdd(ptr noundef, double noundef, double noundef) #0

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z12mycontrollerPK8_mjModelP7_mjData(ptr noundef, ptr noundef) #0

; Function Attrs: mustprogress norecurse uwtable
define dso_local noundef i32 @main(i32 noundef %0, ptr noundef %1) #2 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca [1000 x i8], align 16
  %7 = alloca ptr, align 8
  %8 = alloca double, align 8
  %9 = alloca double, align 8
  %10 = alloca double, align 8
  %11 = alloca %"class.std::chrono::duration", align 8
  %12 = alloca i32, align 4
  %13 = alloca %struct._mjrRect, align 4
  %14 = alloca %struct._mjrRect, align 4
  store i32 0, ptr %3, align 4
  store i32 %0, ptr %4, align 4, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !9
  %15 = call i32 @mj_activate(ptr noundef @.str.6)
  call void @llvm.lifetime.start.p0(i64 1000, ptr %6) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %6, ptr align 16 @__const.main.error, i64 1000, i1 false)
  %16 = load i32, ptr %4, align 4, !tbaa !5
  %17 = icmp slt i32 %16, 2
  br i1 %17, label %18, label %21

18:                                               ; preds = %2
  %19 = getelementptr inbounds [1000 x i8], ptr %6, i64 0, i64 0
  %20 = call ptr @mj_loadXML(ptr noundef @.str.7, ptr noundef null, ptr noundef %19, i32 noundef 1000)
  store ptr %20, ptr @m, align 8, !tbaa !9
  br label %51

21:                                               ; preds = %2
  %22 = load ptr, ptr %5, align 8, !tbaa !9
  %23 = getelementptr inbounds ptr, ptr %22, i64 1
  %24 = load ptr, ptr %23, align 8, !tbaa !9
  %25 = call i64 @strlen(ptr noundef %24) #10
  %26 = icmp ugt i64 %25, 4
  br i1 %26, label %27, label %44

27:                                               ; preds = %21
  %28 = load ptr, ptr %5, align 8, !tbaa !9
  %29 = getelementptr inbounds ptr, ptr %28, i64 1
  %30 = load ptr, ptr %29, align 8, !tbaa !9
  %31 = load ptr, ptr %5, align 8, !tbaa !9
  %32 = getelementptr inbounds ptr, ptr %31, i64 1
  %33 = load ptr, ptr %32, align 8, !tbaa !9
  %34 = call i64 @strlen(ptr noundef %33) #10
  %35 = getelementptr inbounds i8, ptr %30, i64 %34
  %36 = getelementptr inbounds i8, ptr %35, i64 -4
  %37 = call i32 @strcmp(ptr noundef %36, ptr noundef @.str.8) #10
  %38 = icmp ne i32 %37, 0
  br i1 %38, label %44, label %39

39:                                               ; preds = %27
  %40 = load ptr, ptr %5, align 8, !tbaa !9
  %41 = getelementptr inbounds ptr, ptr %40, i64 1
  %42 = load ptr, ptr %41, align 8, !tbaa !9
  %43 = call ptr @mj_loadModel(ptr noundef %42, ptr noundef null)
  store ptr %43, ptr @m, align 8, !tbaa !9
  br label %50

44:                                               ; preds = %27, %21
  %45 = load ptr, ptr %5, align 8, !tbaa !9
  %46 = getelementptr inbounds ptr, ptr %45, i64 1
  %47 = load ptr, ptr %46, align 8, !tbaa !9
  %48 = getelementptr inbounds [1000 x i8], ptr %6, i64 0, i64 0
  %49 = call ptr @mj_loadXML(ptr noundef %47, ptr noundef null, ptr noundef %48, i32 noundef 1000)
  store ptr %49, ptr @m, align 8, !tbaa !9
  br label %50

50:                                               ; preds = %44, %39
  br label %51

51:                                               ; preds = %50, %18
  %52 = load ptr, ptr @m, align 8, !tbaa !9
  %53 = icmp ne ptr %52, null
  br i1 %53, label %56, label %54

54:                                               ; preds = %51
  %55 = getelementptr inbounds [1000 x i8], ptr %6, i64 0, i64 0
  call void @mju_error_s(ptr noundef @.str.9, ptr noundef %55)
  br label %56

56:                                               ; preds = %54, %51
  %57 = load ptr, ptr @m, align 8, !tbaa !9
  %58 = call ptr @mj_makeData(ptr noundef %57)
  store ptr %58, ptr @d, align 8, !tbaa !9
  %59 = call i32 @glfwInit()
  %60 = icmp ne i32 %59, 0
  br i1 %60, label %62, label %61

61:                                               ; preds = %56
  call void @mju_error(ptr noundef @.str.10)
  br label %62

62:                                               ; preds = %61, %56
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #9
  %63 = call ptr @glfwCreateWindow(i32 noundef 1244, i32 noundef 700, ptr noundef @.str.11, ptr noundef null, ptr noundef null)
  store ptr %63, ptr %7, align 8, !tbaa !9
  %64 = load ptr, ptr %7, align 8, !tbaa !9
  call void @glfwMakeContextCurrent(ptr noundef %64)
  call void @glfwSwapInterval(i32 noundef 1)
  call void @mjv_defaultCamera(ptr noundef @cam)
  call void @mjv_defaultOption(ptr noundef @opt)
  call void @mjv_defaultScene(ptr noundef @scn)
  call void @mjr_defaultContext(ptr noundef @con)
  %65 = load ptr, ptr @m, align 8, !tbaa !9
  call void @mjv_makeScene(ptr noundef %65, ptr noundef @scn, i32 noundef 2000)
  %66 = load ptr, ptr @m, align 8, !tbaa !9
  call void @mjr_makeContext(ptr noundef %66, ptr noundef @con, i32 noundef 150)
  %67 = load ptr, ptr %7, align 8, !tbaa !9
  %68 = call ptr @glfwSetKeyCallback(ptr noundef %67, ptr noundef @_Z8keyboardP10GLFWwindowiiii)
  %69 = load ptr, ptr %7, align 8, !tbaa !9
  %70 = call ptr @glfwSetCursorPosCallback(ptr noundef %69, ptr noundef @_Z10mouse_moveP10GLFWwindowdd)
  %71 = load ptr, ptr %7, align 8, !tbaa !9
  %72 = call ptr @glfwSetMouseButtonCallback(ptr noundef %71, ptr noundef @_Z12mouse_buttonP10GLFWwindowiii)
  %73 = load ptr, ptr %7, align 8, !tbaa !9
  %74 = call ptr @glfwSetScrollCallback(ptr noundef %73, ptr noundef @_Z6scrollP10GLFWwindowdd)
  store ptr @_Z12mycontrollerPK8_mjModelP7_mjData, ptr @mjcb_control, align 8, !tbaa !9
  %75 = load ptr, ptr @d, align 8, !tbaa !9
  %76 = getelementptr inbounds %struct._mjData, ptr %75, i32 0, i32 20
  %77 = load ptr, ptr %76, align 8, !tbaa !11
  %78 = getelementptr inbounds double, ptr %77, i64 0
  store double 1.570000e+00, ptr %78, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #9
  %79 = load ptr, ptr @d, align 8, !tbaa !9
  %80 = getelementptr inbounds %struct._mjData, ptr %79, i32 0, i32 16
  %81 = load double, ptr %80, align 8, !tbaa !15
  store double %81, ptr %8, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #9
  store double 1.000000e-02, ptr %9, align 8, !tbaa !14
  %82 = load double, ptr %8, align 8, !tbaa !14
  %83 = load float, ptr @ctrl_update_freq, align 4, !tbaa !16
  %84 = fpext float %83 to double
  %85 = fdiv double 1.000000e+00, %84
  %86 = fsub double %82, %85
  store double %86, ptr @last_update, align 8, !tbaa !14
  br label %87

87:                                               ; preds = %106, %62
  %88 = load ptr, ptr %7, align 8, !tbaa !9
  %89 = call i32 @glfwWindowShouldClose(ptr noundef %88)
  %90 = icmp ne i32 %89, 0
  %91 = xor i1 %90, true
  br i1 %91, label %92, label %117

92:                                               ; preds = %87
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #9
  %93 = load ptr, ptr @d, align 8, !tbaa !9
  %94 = getelementptr inbounds %struct._mjData, ptr %93, i32 0, i32 16
  %95 = load double, ptr %94, align 8, !tbaa !15
  store double %95, ptr %10, align 8, !tbaa !14
  br label %96

96:                                               ; preds = %103, %92
  %97 = load ptr, ptr @d, align 8, !tbaa !9
  %98 = getelementptr inbounds %struct._mjData, ptr %97, i32 0, i32 16
  %99 = load double, ptr %98, align 8, !tbaa !15
  %100 = load double, ptr %10, align 8, !tbaa !14
  %101 = fsub double %99, %100
  %102 = fcmp olt double %101, 0x3F91111111111111
  br i1 %102, label %103, label %106

103:                                              ; preds = %96
  %104 = load ptr, ptr @m, align 8, !tbaa !9
  %105 = load ptr, ptr @d, align 8, !tbaa !9
  call void @mj_step(ptr noundef %104, ptr noundef %105)
  br label %96, !llvm.loop !18

106:                                              ; preds = %96
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #9
  store i32 15, ptr %12, align 4, !tbaa !5
  call void @_ZNSt6chrono8durationIlSt5ratioILl1ELl1000EEEC2IivEERKT_(ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 4 dereferenceable(4) %12)
  call void @_ZNSt11this_thread9sleep_forIlSt5ratioILl1ELl1000EEEEvRKNSt6chrono8durationIT_T0_EE(ptr noundef nonnull align 8 dereferenceable(8) %11)
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %13) #9
  call void @llvm.memset.p0.i64(ptr align 4 %13, i8 0, i64 16, i1 false)
  %107 = load ptr, ptr %7, align 8, !tbaa !9
  %108 = getelementptr inbounds %struct._mjrRect, ptr %13, i32 0, i32 2
  %109 = getelementptr inbounds %struct._mjrRect, ptr %13, i32 0, i32 3
  call void @glfwGetFramebufferSize(ptr noundef %107, ptr noundef %108, ptr noundef %109)
  %110 = load ptr, ptr @m, align 8, !tbaa !9
  %111 = load ptr, ptr @d, align 8, !tbaa !9
  call void @mjv_updateScene(ptr noundef %110, ptr noundef %111, ptr noundef @opt, ptr noundef null, ptr noundef @cam, i32 noundef 7, ptr noundef @scn)
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %14, ptr align 4 %13, i64 16, i1 false), !tbaa.struct !20
  %112 = getelementptr inbounds { i64, i64 }, ptr %14, i32 0, i32 0
  %113 = load i64, ptr %112, align 4
  %114 = getelementptr inbounds { i64, i64 }, ptr %14, i32 0, i32 1
  %115 = load i64, ptr %114, align 4
  call void @mjr_render(i64 %113, i64 %115, ptr noundef @scn, ptr noundef @con)
  %116 = load ptr, ptr %7, align 8, !tbaa !9
  call void @glfwSwapBuffers(ptr noundef %116)
  call void @glfwPollEvents()
  call void @llvm.lifetime.end.p0(i64 16, ptr %13) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #9
  br label %87, !llvm.loop !21

117:                                              ; preds = %87
  call void @mjv_freeScene(ptr noundef @scn)
  call void @mjr_freeContext(ptr noundef @con)
  %118 = load ptr, ptr @d, align 8, !tbaa !9
  call void @mj_deleteData(ptr noundef %118)
  %119 = load ptr, ptr @m, align 8, !tbaa !9
  call void @mj_deleteModel(ptr noundef %119)
  call void @mj_deactivate()
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #9
  call void @llvm.lifetime.end.p0(i64 1000, ptr %6) #9
  ret i32 1
}

declare i32 @mj_activate(ptr noundef) #3

; 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) #4

declare ptr @mj_loadXML(ptr noundef, ptr noundef, ptr noundef, i32 noundef) #3

; Function Attrs: nounwind willreturn memory(read)
declare i64 @strlen(ptr noundef) #5

; Function Attrs: nounwind willreturn memory(read)
declare i32 @strcmp(ptr noundef, ptr noundef) #5

declare ptr @mj_loadModel(ptr noundef, ptr noundef) #3

declare void @mju_error_s(ptr noundef, ptr noundef) #3

declare ptr @mj_makeData(ptr noundef) #3

declare i32 @glfwInit() #3

declare void @mju_error(ptr noundef) #3

declare ptr @glfwCreateWindow(i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) #3

declare void @glfwMakeContextCurrent(ptr noundef) #3

declare void @glfwSwapInterval(i32 noundef) #3

declare void @mjv_defaultCamera(ptr noundef) #3

declare void @mjv_defaultOption(ptr noundef) #3

declare void @mjv_defaultScene(ptr noundef) #3

declare void @mjr_defaultContext(ptr noundef) #3

declare void @mjv_makeScene(ptr noundef, ptr noundef, i32 noundef) #3

declare void @mjr_makeContext(ptr noundef, ptr noundef, i32 noundef) #3

declare ptr @glfwSetKeyCallback(ptr noundef, ptr noundef) #3

declare ptr @glfwSetCursorPosCallback(ptr noundef, ptr noundef) #3

declare ptr @glfwSetMouseButtonCallback(ptr noundef, ptr noundef) #3

declare ptr @glfwSetScrollCallback(ptr noundef, ptr noundef) #3

declare i32 @glfwWindowShouldClose(ptr noundef) #3

declare void @mj_step(ptr noundef, ptr noundef) #3

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZNSt11this_thread9sleep_forIlSt5ratioILl1ELl1000EEEEvRKNSt6chrono8durationIT_T0_EE(ptr noundef nonnull align 8 dereferenceable(8)) #6

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

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

declare void @glfwGetFramebufferSize(ptr noundef, ptr noundef, ptr noundef) #3

declare void @mjv_updateScene(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, ptr noundef) #3

declare void @mjr_render(i64, i64, ptr noundef, ptr noundef) #3

declare void @glfwSwapBuffers(ptr noundef) #3

declare void @glfwPollEvents() #3

declare void @mjv_freeScene(ptr noundef) #3

declare void @mjr_freeContext(ptr noundef) #3

declare void @mj_deleteData(ptr noundef) #3

declare void @mj_deleteModel(ptr noundef) #3

declare void @mj_deactivate() #3

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

!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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !10, i64 40376}
!12 = !{!"_ZTS7_mjData", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !7, i64 24, !7, i64 88, !7, i64 296, !6, i64 40296, !6, i64 40300, !7, i64 40304, !6, i64 40320, !6, i64 40324, !6, i64 40328, !6, i64 40332, !13, i64 40336, !7, i64 40344, !10, i64 40360, !10, i64 40368, !10, i64 40376, !10, i64 40384, !10, i64 40392, !10, i64 40400, !10, i64 40408, !10, i64 40416, !10, i64 40424, !10, i64 40432, !10, i64 40440, !10, i64 40448, !10, i64 40456, !10, i64 40464, !10, i64 40472, !10, i64 40480, !10, i64 40488, !10, i64 40496, !10, i64 40504, !10, i64 40512, !10, i64 40520, !10, i64 40528, !10, i64 40536, !10, i64 40544, !10, i64 40552, !10, i64 40560, !10, i64 40568, !10, i64 40576, !10, i64 40584, !10, i64 40592, !10, i64 40600, !10, i64 40608, !10, i64 40616, !10, i64 40624, !10, i64 40632, !10, i64 40640, !10, i64 40648, !10, i64 40656, !10, i64 40664, !10, i64 40672, !10, i64 40680, !10, i64 40688, !10, i64 40696, !10, i64 40704, !10, i64 40712, !10, i64 40720, !10, i64 40728, !10, i64 40736, !10, i64 40744, !10, i64 40752, !10, i64 40760, !10, i64 40768, !10, i64 40776, !10, i64 40784, !10, i64 40792, !10, i64 40800, !10, i64 40808, !10, i64 40816, !10, i64 40824, !10, i64 40832, !10, i64 40840, !10, i64 40848, !10, i64 40856, !10, i64 40864, !10, i64 40872, !10, i64 40880, !10, i64 40888, !10, i64 40896, !10, i64 40904, !10, i64 40912, !10, i64 40920, !10, i64 40928, !10, i64 40936, !10, i64 40944, !10, i64 40952, !10, i64 40960, !10, i64 40968, !10, i64 40976, !10, i64 40984, !10, i64 40992, !10, i64 41000, !10, i64 41008, !10, i64 41016, !10, i64 41024, !10, i64 41032, !10, i64 41040, !10, i64 41048, !10, i64 41056, !10, i64 41064, !10, i64 41072, !10, i64 41080, !10, i64 41088, !10, i64 41096, !10, i64 41104, !10, i64 41112}
!13 = !{!"double", !7, i64 0}
!14 = !{!13, !13, i64 0}
!15 = !{!12, !13, i64 40336}
!16 = !{!17, !17, i64 0}
!17 = !{!"float", !7, i64 0}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{i64 0, i64 4, !5, i64 4, i64 4, !5, i64 8, i64 4, !5, i64 12, i64 4, !5}
!21 = distinct !{!21, !19}


; 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._mjvCamera = type { i32, i32, i32, [3 x double], double, double, double }
%struct._mjvOption = type { i32, i32, [6 x i8], [6 x i8], [6 x i8], [6 x i8], [6 x i8], [22 x i8] }
%struct._mjvScene = type { i32, i32, ptr, ptr, i32, ptr, ptr, ptr, ptr, ptr, i32, [8 x %struct._mjvLight], [2 x %struct._mjvGLCamera], i8, [3 x float], [4 x float], float, i32, [9 x i8] }
%struct._mjvLight = type { [3 x float], [3 x float], [3 x float], float, float, [3 x float], [3 x float], [3 x float], i8, i8, i8 }
%struct._mjvGLCamera = type { [3 x float], [3 x float], [3 x float], float, float, float, float, float }
%struct._mjrContext = type { float, float, float, float, float, [4 x float], i32, i32, i32, i32, i32, [10 x i32], [10 x i32], [10 x i32], i32, i32, i32, i32, i32, i32, i32, i32, [10 x i32], [10 x i32], [10 x i32], [10 x i32], i32, [100 x i32], [100 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, [127 x i32], [127 x i32], i32, i32, i32, i32, i32, i32, i32, i32 }
%"class.std::chrono::duration" = type { i64 }
%struct._mjrRect = type { i32, i32, i32, i32 }

@m = external dso_local local_unnamed_addr global ptr, align 8
@d = external dso_local local_unnamed_addr global ptr, align 8
@cam = external dso_local global %struct._mjvCamera, align 8
@opt = external dso_local global %struct._mjvOption, align 4
@scn = external dso_local global %struct._mjvScene, align 8
@con = external dso_local global %struct._mjrContext, align 8
@ctrl_update_freq = external dso_local local_unnamed_addr global float, align 4
@last_update = external dso_local local_unnamed_addr global double, align 8
@.str.6 = external hidden unnamed_addr constant [19 x i8], align 1
@__const.main.error = external hidden unnamed_addr constant [1000 x i8], align 16
@.str.7 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [5 x i8], align 1
@mjcb_control = external local_unnamed_addr global ptr, align 8

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z8keyboardP10GLFWwindowiiii(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #0

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z12mouse_buttonP10GLFWwindowiii(ptr noundef, i32 noundef, i32 noundef, i32 noundef) #0

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z10mouse_moveP10GLFWwindowdd(ptr noundef, double noundef, double noundef) #0

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z6scrollP10GLFWwindowdd(ptr noundef, double noundef, double noundef) #0

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z12mycontrollerPK8_mjModelP7_mjData(ptr noundef, ptr noundef) #0

; Function Attrs: mustprogress norecurse uwtable
define dso_local noundef i32 @main(i32 noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #2 {
  %3 = alloca [1000 x i8], align 16
  %4 = alloca %"class.std::chrono::duration", align 8
  %5 = alloca i32, align 4
  %6 = alloca %struct._mjrRect, align 8
  %7 = tail call i32 @mj_activate(ptr noundef nonnull @.str.6)
  call void @llvm.lifetime.start.p0(i64 1000, ptr nonnull %3) #9
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(1000) %3, ptr noundef nonnull align 16 dereferenceable(1000) @__const.main.error, i64 1000, i1 false)
  %8 = icmp slt i32 %0, 2
  br i1 %8, label %9, label %11

9:                                                ; preds = %2
  %10 = call ptr @mj_loadXML(ptr noundef nonnull @.str.7, ptr noundef null, ptr noundef nonnull %3, i32 noundef 1000)
  br label %24

11:                                               ; preds = %2
  %12 = getelementptr inbounds i8, ptr %1, i64 8
  %13 = load ptr, ptr %12, align 8, !tbaa !5
  %14 = tail call i64 @strlen(ptr noundef nonnull dereferenceable(1) %13) #10
  %15 = icmp ugt i64 %14, 4
  br i1 %15, label %16, label %22

16:                                               ; preds = %11
  %17 = getelementptr inbounds i8, ptr %13, i64 %14
  %18 = getelementptr inbounds i8, ptr %17, i64 -4
  %19 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %18, ptr noundef nonnull dereferenceable(1) @.str.8) #10
  %.not = icmp eq i32 %19, 0
  br i1 %.not, label %20, label %22

20:                                               ; preds = %16
  %21 = tail call ptr @mj_loadModel(ptr noundef %13, ptr noundef null)
  br label %24

22:                                               ; preds = %16, %11
  %23 = call ptr @mj_loadXML(ptr noundef %13, ptr noundef null, ptr noundef nonnull %3, i32 noundef 1000)
  br label %24

24:                                               ; preds = %20, %22, %9
  %.sink = phi ptr [ %21, %20 ], [ %23, %22 ], [ %10, %9 ]
  store ptr %.sink, ptr @m, align 8, !tbaa !5
  %.not15 = icmp eq ptr %.sink, null
  br i1 %.not15, label %25, label %26

25:                                               ; preds = %24
  call void @mju_error_s(ptr noundef nonnull @.str.9, ptr noundef nonnull %3)
  %.pre = load ptr, ptr @m, align 8, !tbaa !5
  br label %26

26:                                               ; preds = %25, %24
  %27 = phi ptr [ %.pre, %25 ], [ %.sink, %24 ]
  %28 = call ptr @mj_makeData(ptr noundef %27)
  store ptr %28, ptr @d, align 8, !tbaa !5
  %29 = call i32 @glfwInit()
  %.not16 = icmp eq i32 %29, 0
  br i1 %.not16, label %30, label %31

30:                                               ; preds = %26
  call void @mju_error(ptr noundef nonnull @.str.10)
  br label %31

31:                                               ; preds = %30, %26
  %32 = call ptr @glfwCreateWindow(i32 noundef 1244, i32 noundef 700, ptr noundef nonnull @.str.11, ptr noundef null, ptr noundef null)
  call void @glfwMakeContextCurrent(ptr noundef %32)
  call void @glfwSwapInterval(i32 noundef 1)
  call void @mjv_defaultCamera(ptr noundef nonnull @cam)
  call void @mjv_defaultOption(ptr noundef nonnull @opt)
  call void @mjv_defaultScene(ptr noundef nonnull @scn)
  call void @mjr_defaultContext(ptr noundef nonnull @con)
  %33 = load ptr, ptr @m, align 8, !tbaa !5
  call void @mjv_makeScene(ptr noundef %33, ptr noundef nonnull @scn, i32 noundef 2000)
  %34 = load ptr, ptr @m, align 8, !tbaa !5
  call void @mjr_makeContext(ptr noundef %34, ptr noundef nonnull @con, i32 noundef 150)
  %35 = call ptr @glfwSetKeyCallback(ptr noundef %32, ptr noundef nonnull @_Z8keyboardP10GLFWwindowiiii)
  %36 = call ptr @glfwSetCursorPosCallback(ptr noundef %32, ptr noundef nonnull @_Z10mouse_moveP10GLFWwindowdd)
  %37 = call ptr @glfwSetMouseButtonCallback(ptr noundef %32, ptr noundef nonnull @_Z12mouse_buttonP10GLFWwindowiii)
  %38 = call ptr @glfwSetScrollCallback(ptr noundef %32, ptr noundef nonnull @_Z6scrollP10GLFWwindowdd)
  store ptr @_Z12mycontrollerPK8_mjModelP7_mjData, ptr @mjcb_control, align 8, !tbaa !5
  %39 = load ptr, ptr @d, align 8, !tbaa !5
  %40 = getelementptr inbounds i8, ptr %39, i64 40376
  %41 = load ptr, ptr %40, align 8, !tbaa !9
  store double 1.570000e+00, ptr %41, align 8, !tbaa !13
  %42 = getelementptr inbounds i8, ptr %39, i64 40336
  %43 = load double, ptr %42, align 8, !tbaa !14
  %44 = load float, ptr @ctrl_update_freq, align 4, !tbaa !15
  %45 = fpext float %44 to double
  %46 = fdiv double 1.000000e+00, %45
  %47 = fsub double %43, %46
  store double %47, ptr @last_update, align 8, !tbaa !13
  %48 = call i32 @glfwWindowShouldClose(ptr noundef %32)
  %.not1718 = icmp eq i32 %48, 0
  br i1 %.not1718, label %.lr.ph20, label %._crit_edge21

.lr.ph20:                                         ; preds = %31
  %49 = getelementptr inbounds i8, ptr %6, i64 8
  %50 = getelementptr inbounds i8, ptr %6, i64 12
  br label %51

51:                                               ; preds = %.lr.ph20, %._crit_edge
  %52 = load ptr, ptr @d, align 8, !tbaa !5
  %53 = getelementptr inbounds i8, ptr %52, i64 40336
  %54 = load double, ptr %53, align 8, !tbaa !14
  %55 = fsub double %54, %54
  %56 = fcmp olt double %55, 0x3F91111111111111
  br i1 %56, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %51, %.lr.ph
  %57 = phi ptr [ %59, %.lr.ph ], [ %52, %51 ]
  %58 = load ptr, ptr @m, align 8, !tbaa !5
  call void @mj_step(ptr noundef %58, ptr noundef nonnull %57)
  %59 = load ptr, ptr @d, align 8, !tbaa !5
  %60 = getelementptr inbounds i8, ptr %59, i64 40336
  %61 = load double, ptr %60, align 8, !tbaa !14
  %62 = fsub double %61, %54
  %63 = fcmp olt double %62, 0x3F91111111111111
  br i1 %63, label %.lr.ph, label %._crit_edge, !llvm.loop !17

._crit_edge:                                      ; preds = %.lr.ph, %51
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #9
  store i32 15, ptr %5, align 4, !tbaa !19
  call void @_ZNSt6chrono8durationIlSt5ratioILl1ELl1000EEEC2IivEERKT_(ptr noundef nonnull align 8 dereferenceable(8) %4, ptr noundef nonnull align 4 dereferenceable(4) %5)
  call void @_ZNSt11this_thread9sleep_forIlSt5ratioILl1ELl1000EEEEvRKNSt6chrono8durationIT_T0_EE(ptr noundef nonnull align 8 dereferenceable(8) %4)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %6) #9
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %6, i8 0, i64 16, i1 false)
  call void @glfwGetFramebufferSize(ptr noundef %32, ptr noundef nonnull %49, ptr noundef nonnull %50)
  %64 = load ptr, ptr @m, align 8, !tbaa !5
  %65 = load ptr, ptr @d, align 8, !tbaa !5
  call void @mjv_updateScene(ptr noundef %64, ptr noundef %65, ptr noundef nonnull @opt, ptr noundef null, ptr noundef nonnull @cam, i32 noundef 7, ptr noundef nonnull @scn)
  %.sroa.0.0.copyload = load i64, ptr %6, align 8
  %.sroa.2.0.copyload = load i64, ptr %49, align 8
  call void @mjr_render(i64 %.sroa.0.0.copyload, i64 %.sroa.2.0.copyload, ptr noundef nonnull @scn, ptr noundef nonnull @con)
  call void @glfwSwapBuffers(ptr noundef %32)
  call void @glfwPollEvents()
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #9
  %66 = call i32 @glfwWindowShouldClose(ptr noundef %32)
  %.not17 = icmp eq i32 %66, 0
  br i1 %.not17, label %51, label %._crit_edge21, !llvm.loop !20

._crit_edge21:                                    ; preds = %._crit_edge, %31
  call void @mjv_freeScene(ptr noundef nonnull @scn)
  call void @mjr_freeContext(ptr noundef nonnull @con)
  %67 = load ptr, ptr @d, align 8, !tbaa !5
  call void @mj_deleteData(ptr noundef %67)
  %68 = load ptr, ptr @m, align 8, !tbaa !5
  call void @mj_deleteModel(ptr noundef %68)
  call void @mj_deactivate()
  call void @llvm.lifetime.end.p0(i64 1000, ptr nonnull %3) #9
  ret i32 1
}

declare i32 @mj_activate(ptr noundef) local_unnamed_addr #3

; Function Attrs: mustprogress 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) #4

declare ptr @mj_loadXML(ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #3

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare i64 @strlen(ptr nocapture noundef) local_unnamed_addr #5

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare i32 @strcmp(ptr nocapture noundef, ptr nocapture noundef) local_unnamed_addr #5

declare ptr @mj_loadModel(ptr noundef, ptr noundef) local_unnamed_addr #3

declare void @mju_error_s(ptr noundef, ptr noundef) local_unnamed_addr #3

declare ptr @mj_makeData(ptr noundef) local_unnamed_addr #3

declare i32 @glfwInit() local_unnamed_addr #3

declare void @mju_error(ptr noundef) local_unnamed_addr #3

declare ptr @glfwCreateWindow(i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

declare void @glfwMakeContextCurrent(ptr noundef) local_unnamed_addr #3

declare void @glfwSwapInterval(i32 noundef) local_unnamed_addr #3

declare void @mjv_defaultCamera(ptr noundef) local_unnamed_addr #3

declare void @mjv_defaultOption(ptr noundef) local_unnamed_addr #3

declare void @mjv_defaultScene(ptr noundef) local_unnamed_addr #3

declare void @mjr_defaultContext(ptr noundef) local_unnamed_addr #3

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

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

declare ptr @glfwSetKeyCallback(ptr noundef, ptr noundef) local_unnamed_addr #3

declare ptr @glfwSetCursorPosCallback(ptr noundef, ptr noundef) local_unnamed_addr #3

declare ptr @glfwSetMouseButtonCallback(ptr noundef, ptr noundef) local_unnamed_addr #3

declare ptr @glfwSetScrollCallback(ptr noundef, ptr noundef) local_unnamed_addr #3

declare i32 @glfwWindowShouldClose(ptr noundef) local_unnamed_addr #3

declare void @mj_step(ptr noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZNSt11this_thread9sleep_forIlSt5ratioILl1ELl1000EEEEvRKNSt6chrono8durationIT_T0_EE(ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #6

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

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

declare void @glfwGetFramebufferSize(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

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

declare void @mjr_render(i64, i64, ptr noundef, ptr noundef) local_unnamed_addr #3

declare void @glfwSwapBuffers(ptr noundef) local_unnamed_addr #3

declare void @glfwPollEvents() local_unnamed_addr #3

declare void @mjv_freeScene(ptr noundef) local_unnamed_addr #3

declare void @mjr_freeContext(ptr noundef) local_unnamed_addr #3

declare void @mj_deleteData(ptr noundef) local_unnamed_addr #3

declare void @mj_deleteModel(ptr noundef) local_unnamed_addr #3

declare void @mj_deactivate() local_unnamed_addr #3

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

!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, !6, i64 40376}
!10 = !{!"_ZTS7_mjData", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !7, i64 24, !7, i64 88, !7, i64 296, !11, i64 40296, !11, i64 40300, !7, i64 40304, !11, i64 40320, !11, i64 40324, !11, i64 40328, !11, i64 40332, !12, i64 40336, !7, i64 40344, !6, i64 40360, !6, i64 40368, !6, i64 40376, !6, i64 40384, !6, i64 40392, !6, i64 40400, !6, i64 40408, !6, i64 40416, !6, i64 40424, !6, i64 40432, !6, i64 40440, !6, i64 40448, !6, i64 40456, !6, i64 40464, !6, i64 40472, !6, i64 40480, !6, i64 40488, !6, i64 40496, !6, i64 40504, !6, i64 40512, !6, i64 40520, !6, i64 40528, !6, i64 40536, !6, i64 40544, !6, i64 40552, !6, i64 40560, !6, i64 40568, !6, i64 40576, !6, i64 40584, !6, i64 40592, !6, i64 40600, !6, i64 40608, !6, i64 40616, !6, i64 40624, !6, i64 40632, !6, i64 40640, !6, i64 40648, !6, i64 40656, !6, i64 40664, !6, i64 40672, !6, i64 40680, !6, i64 40688, !6, i64 40696, !6, i64 40704, !6, i64 40712, !6, i64 40720, !6, i64 40728, !6, i64 40736, !6, i64 40744, !6, i64 40752, !6, i64 40760, !6, i64 40768, !6, i64 40776, !6, i64 40784, !6, i64 40792, !6, i64 40800, !6, i64 40808, !6, i64 40816, !6, i64 40824, !6, i64 40832, !6, i64 40840, !6, i64 40848, !6, i64 40856, !6, i64 40864, !6, i64 40872, !6, i64 40880, !6, i64 40888, !6, i64 40896, !6, i64 40904, !6, i64 40912, !6, i64 40920, !6, i64 40928, !6, i64 40936, !6, i64 40944, !6, i64 40952, !6, i64 40960, !6, i64 40968, !6, i64 40976, !6, i64 40984, !6, i64 40992, !6, i64 41000, !6, i64 41008, !6, i64 41016, !6, i64 41024, !6, i64 41032, !6, i64 41040, !6, i64 41048, !6, i64 41056, !6, i64 41064, !6, i64 41072, !6, i64 41080, !6, i64 41088, !6, i64 41096, !6, i64 41104, !6, i64 41112}
!11 = !{!"int", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!12, !12, i64 0}
!14 = !{!10, !12, i64 40336}
!15 = !{!16, !16, i64 0}
!16 = !{!"float", !7, i64 0}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = !{!11, !11, i64 0}
!20 = distinct !{!20, !18}


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