; LLVM IR from HRI-EU/Rcs :: src/RcsCore/PeriodicCallback.ll (ZN3Rcs16PeriodicCallback15threadFuncPosixEPv)

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

%"class.Rcs::PeriodicCallback" = type { ptr, i8, i8, double, double, double, double, double, double, double, i64, i64, i32, i32, i64, %"class.std::__cxx11::basic_string", i32, %union.pthread_mutex_t }
%"class.std::__cxx11::basic_string" = type { %"struct.std::__cxx11::basic_string<char>::_Alloc_hider", i64, %union.anon }
%"struct.std::__cxx11::basic_string<char>::_Alloc_hider" = type { ptr }
%union.anon = type { i64, [8 x i8] }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }

@RCS_GLOBAL_RLOG_CB = external global ptr, align 8
@.str = external hidden unnamed_addr constant [77 x i8], align 1
@__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv = external hidden unnamed_addr constant [16 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [42 x i8], align 1
@RcsLogLevel = external global i32, align 4
@stderr = external global ptr, align 8
@.str.2 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [66 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [29 x i8], align 1

; Function Attrs: mustprogress uwtable
define dso_local noundef ptr @_ZN3Rcs16PeriodicCallback15threadFuncPosixEPv(ptr noundef %0) #0 align 2 {
  %2 = alloca ptr, align 8
  %3 = alloca ptr, align 8
  %4 = alloca double, align 8
  %5 = alloca double, align 8
  %6 = alloca ptr, align 8
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %3) #9
  %7 = load ptr, ptr %2, align 8, !tbaa !5
  store ptr %7, ptr %3, align 8, !tbaa !5
  %8 = load ptr, ptr %3, align 8, !tbaa !5
  %9 = load ptr, ptr %8, align 8, !tbaa !9
  %10 = getelementptr inbounds ptr, ptr %9, i64 3
  %11 = load ptr, ptr %10, align 8
  call void %11(ptr noundef nonnull align 8 dereferenceable(184) %8)
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #9
  %12 = load ptr, ptr %3, align 8, !tbaa !5
  %13 = load ptr, ptr %12, align 8, !tbaa !9
  %14 = getelementptr inbounds ptr, ptr %13, i64 15
  %15 = load ptr, ptr %14, align 8
  %16 = call noundef double %15(ptr noundef nonnull align 8 dereferenceable(184) %12)
  %17 = fdiv double 1.000000e+00, %16
  store double %17, ptr %4, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #9
  %18 = load double, ptr %4, align 8, !tbaa !11
  %19 = fmul double 1.000000e+06, %18
  store double %19, ptr %5, align 8, !tbaa !11
  br label %20

20:                                               ; preds = %1
  %21 = load ptr, ptr @RCS_GLOBAL_RLOG_CB, align 8, !tbaa !5
  %22 = icmp ne ptr %21, null
  br i1 %22, label %23, label %27

23:                                               ; preds = %20
  %24 = load ptr, ptr @RCS_GLOBAL_RLOG_CB, align 8, !tbaa !5
  %25 = load double, ptr %4, align 8, !tbaa !11
  %26 = fmul double 1.000000e+03, %25
  call void (i32, ptr, ptr, i32, ptr, ...) %24(i32 noundef 5, ptr noundef @.str, ptr noundef @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 65, ptr noundef @.str.1, double noundef %26)
  br label %27

27:                                               ; preds = %23, %20
  %28 = load i32, ptr @RcsLogLevel, align 4, !tbaa !13
  %29 = icmp sle i32 5, %28
  br i1 %29, label %30, label %39

30:                                               ; preds = %27
  %31 = load ptr, ptr @stderr, align 8, !tbaa !5
  %32 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %31, ptr noundef @.str.2, ptr noundef @.str, ptr noundef @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 65) #9
  %33 = load ptr, ptr @stderr, align 8, !tbaa !5
  %34 = load double, ptr %4, align 8, !tbaa !11
  %35 = fmul double 1.000000e+03, %34
  %36 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %33, ptr noundef @.str.1, double noundef %35) #9
  %37 = load ptr, ptr @stderr, align 8, !tbaa !5
  %38 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %37, ptr noundef @.str.3) #9
  br label %39

39:                                               ; preds = %30, %27
  br label %40

40:                                               ; preds = %39
  br label %41

41:                                               ; preds = %40
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #9
  %42 = load double, ptr %4, align 8, !tbaa !11
  %43 = call ptr @Timer_create(double noundef %42)
  store ptr %43, ptr %6, align 8, !tbaa !5
  br label %44

44:                                               ; preds = %207, %41
  %45 = load ptr, ptr %3, align 8, !tbaa !5
  %46 = load ptr, ptr %45, align 8, !tbaa !9
  %47 = getelementptr inbounds ptr, ptr %46, i64 11
  %48 = load ptr, ptr %47, align 8
  %49 = call noundef zeroext i1 %48(ptr noundef nonnull align 8 dereferenceable(184) %45)
  %50 = zext i1 %49 to i32
  %51 = icmp eq i32 %50, 1
  br i1 %51, label %52, label %208

52:                                               ; preds = %44
  %53 = load ptr, ptr %3, align 8, !tbaa !5
  %54 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %53, i32 0, i32 17
  %55 = call i32 @pthread_mutex_lock(ptr noundef %54) #9
  %56 = call double @Timer_getSystemTime()
  %57 = load ptr, ptr %3, align 8, !tbaa !5
  %58 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %57, i32 0, i32 4
  store double %56, ptr %58, align 8, !tbaa !15
  %59 = load ptr, ptr %3, align 8, !tbaa !5
  %60 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %59, i32 0, i32 17
  %61 = call i32 @pthread_mutex_unlock(ptr noundef %60) #9
  %62 = load ptr, ptr %3, align 8, !tbaa !5
  %63 = load ptr, ptr %62, align 8, !tbaa !9
  %64 = getelementptr inbounds ptr, ptr %63, i64 2
  %65 = load ptr, ptr %64, align 8
  call void %65(ptr noundef nonnull align 8 dereferenceable(184) %62)
  %66 = load ptr, ptr %3, align 8, !tbaa !5
  %67 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %66, i32 0, i32 17
  %68 = call i32 @pthread_mutex_lock(ptr noundef %67) #9
  %69 = call double @Timer_getSystemTime()
  %70 = load ptr, ptr %3, align 8, !tbaa !5
  %71 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %70, i32 0, i32 4
  %72 = load double, ptr %71, align 8, !tbaa !15
  %73 = fsub double %69, %72
  %74 = fmul double %73, 1.000000e+06
  %75 = load ptr, ptr %3, align 8, !tbaa !5
  %76 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %75, i32 0, i32 5
  store double %74, ptr %76, align 8, !tbaa !22
  %77 = load ptr, ptr %3, align 8, !tbaa !5
  %78 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %77, i32 0, i32 5
  %79 = load ptr, ptr %3, align 8, !tbaa !5
  %80 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %79, i32 0, i32 6
  %81 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3minIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %78, ptr noundef nonnull align 8 dereferenceable(8) %80)
  %82 = load double, ptr %81, align 8, !tbaa !11
  %83 = load ptr, ptr %3, align 8, !tbaa !5
  %84 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %83, i32 0, i32 6
  store double %82, ptr %84, align 8, !tbaa !23
  %85 = load ptr, ptr %3, align 8, !tbaa !5
  %86 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %85, i32 0, i32 5
  %87 = load ptr, ptr %3, align 8, !tbaa !5
  %88 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %87, i32 0, i32 7
  %89 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %86, ptr noundef nonnull align 8 dereferenceable(8) %88)
  %90 = load double, ptr %89, align 8, !tbaa !11
  %91 = load ptr, ptr %3, align 8, !tbaa !5
  %92 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %91, i32 0, i32 7
  store double %90, ptr %92, align 8, !tbaa !24
  %93 = load ptr, ptr %3, align 8, !tbaa !5
  %94 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %93, i32 0, i32 5
  %95 = load double, ptr %94, align 8, !tbaa !22
  %96 = load ptr, ptr %3, align 8, !tbaa !5
  %97 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %96, i32 0, i32 8
  %98 = load double, ptr %97, align 8, !tbaa !25
  %99 = fadd double %98, %95
  store double %99, ptr %97, align 8, !tbaa !25
  %100 = load ptr, ptr %3, align 8, !tbaa !5
  %101 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %100, i32 0, i32 5
  %102 = load double, ptr %101, align 8, !tbaa !22
  %103 = load ptr, ptr %3, align 8, !tbaa !5
  %104 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %103, i32 0, i32 5
  %105 = load double, ptr %104, align 8, !tbaa !22
  %106 = load ptr, ptr %3, align 8, !tbaa !5
  %107 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %106, i32 0, i32 9
  %108 = load double, ptr %107, align 8, !tbaa !26
  %109 = call double @llvm.fmuladd.f64(double %102, double %105, double %108)
  store double %109, ptr %107, align 8, !tbaa !26
  %110 = load ptr, ptr %3, align 8, !tbaa !5
  %111 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %110, i32 0, i32 5
  %112 = load double, ptr %111, align 8, !tbaa !22
  %113 = load double, ptr %5, align 8, !tbaa !11
  %114 = fcmp ogt double %112, %113
  br i1 %114, label %115, label %163

115:                                              ; preds = %52
  %116 = load ptr, ptr %3, align 8, !tbaa !5
  %117 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %116, i32 0, i32 16
  %118 = load i32, ptr %117, align 8, !tbaa !27
  %119 = icmp ne i32 %118, 2
  br i1 %119, label %120, label %163

120:                                              ; preds = %115
  br label %121

121:                                              ; preds = %120
  %122 = load ptr, ptr @RCS_GLOBAL_RLOG_CB, align 8, !tbaa !5
  %123 = icmp ne ptr %122, null
  br i1 %123, label %124, label %136

124:                                              ; preds = %121
  %125 = load ptr, ptr @RCS_GLOBAL_RLOG_CB, align 8, !tbaa !5
  %126 = load ptr, ptr %3, align 8, !tbaa !5
  %127 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %126, i32 0, i32 10
  %128 = load i64, ptr %127, align 8, !tbaa !28
  %129 = load ptr, ptr %3, align 8, !tbaa !5
  %130 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %129, i32 0, i32 15
  %131 = call noundef ptr @_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv(ptr noundef nonnull align 8 dereferenceable(32) %130) #9
  %132 = load ptr, ptr %3, align 8, !tbaa !5
  %133 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %132, i32 0, i32 5
  %134 = load double, ptr %133, align 8, !tbaa !22
  %135 = load double, ptr %5, align 8, !tbaa !11
  call void (i32, ptr, ptr, i32, ptr, ...) %125(i32 noundef 3, ptr noundef @.str, ptr noundef @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 99, ptr noundef @.str.4, i64 noundef %128, ptr noundef %131, double noundef %134, double noundef %135)
  br label %136

136:                                              ; preds = %124, %121
  %137 = load i32, ptr @RcsLogLevel, align 4, !tbaa !13
  %138 = icmp sle i32 3, %137
  br i1 %138, label %139, label %156

139:                                              ; preds = %136
  %140 = load ptr, ptr @stderr, align 8, !tbaa !5
  %141 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %140, ptr noundef @.str.2, ptr noundef @.str, ptr noundef @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 99) #9
  %142 = load ptr, ptr @stderr, align 8, !tbaa !5
  %143 = load ptr, ptr %3, align 8, !tbaa !5
  %144 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %143, i32 0, i32 10
  %145 = load i64, ptr %144, align 8, !tbaa !28
  %146 = load ptr, ptr %3, align 8, !tbaa !5
  %147 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %146, i32 0, i32 15
  %148 = call noundef ptr @_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv(ptr noundef nonnull align 8 dereferenceable(32) %147) #9
  %149 = load ptr, ptr %3, align 8, !tbaa !5
  %150 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %149, i32 0, i32 5
  %151 = load double, ptr %150, align 8, !tbaa !22
  %152 = load double, ptr %5, align 8, !tbaa !11
  %153 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %142, ptr noundef @.str.4, i64 noundef %145, ptr noundef %148, double noundef %151, double noundef %152) #9
  %154 = load ptr, ptr @stderr, align 8, !tbaa !5
  %155 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %154, ptr noundef @.str.3) #9
  br label %156

156:                                              ; preds = %139, %136
  br label %157

157:                                              ; preds = %156
  br label %158

158:                                              ; preds = %157
  %159 = load ptr, ptr %3, align 8, !tbaa !5
  %160 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %159, i32 0, i32 11
  %161 = load i64, ptr %160, align 8, !tbaa !29
  %162 = add i64 %161, 1
  store i64 %162, ptr %160, align 8, !tbaa !29
  br label %163

163:                                              ; preds = %158, %115, %52
  %164 = load ptr, ptr %3, align 8, !tbaa !5
  %165 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %164, i32 0, i32 10
  %166 = load i64, ptr %165, align 8, !tbaa !28
  %167 = add i64 %166, 1
  store i64 %167, ptr %165, align 8, !tbaa !28
  %168 = load ptr, ptr %3, align 8, !tbaa !5
  %169 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %168, i32 0, i32 17
  %170 = call i32 @pthread_mutex_unlock(ptr noundef %169) #9
  %171 = load ptr, ptr %3, align 8, !tbaa !5
  %172 = load ptr, ptr %171, align 8, !tbaa !9
  %173 = getelementptr inbounds ptr, ptr %172, i64 6
  %174 = load ptr, ptr %173, align 8
  %175 = call noundef i32 %174(ptr noundef nonnull align 8 dereferenceable(184) %171)
  switch i32 %175, label %192 [
    i32 0, label %176
    i32 1, label %179
    i32 2, label %181
    i32 3, label %183
    i32 4, label %207
  ]

176:                                              ; preds = %163
  %177 = load ptr, ptr %6, align 8, !tbaa !5
  %178 = call zeroext i1 @Timer_wait(ptr noundef %177)
  br label %207

179:                                              ; preds = %163
  %180 = load ptr, ptr %6, align 8, !tbaa !5
  call void @Timer_waitNoCatchUp(ptr noundef %180)
  br label %207

181:                                              ; preds = %163
  %182 = load double, ptr %4, align 8, !tbaa !11
  call void @Timer_waitDT(double noundef %182)
  br label %207

183:                                              ; preds = %163
  %184 = load ptr, ptr %3, align 8, !tbaa !5
  %185 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %184, i32 0, i32 17
  %186 = call i32 @pthread_mutex_lock(ptr noundef %185) #9
  %187 = load ptr, ptr %3, align 8, !tbaa !5
  %188 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %187, i32 0, i32 1
  store i8 0, ptr %188, align 8, !tbaa !30
  %189 = load ptr, ptr %3, align 8, !tbaa !5
  %190 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %189, i32 0, i32 17
  %191 = call i32 @pthread_mutex_unlock(ptr noundef %190) #9
  br label %207

192:                                              ; preds = %163
  br label %193

193:                                              ; preds = %192
  %194 = load ptr, ptr @stderr, align 8, !tbaa !5
  %195 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %194, ptr noundef @.str.5, ptr noundef @.str, ptr noundef @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 137) #9
  %196 = load ptr, ptr @stderr, align 8, !tbaa !5
  %197 = load ptr, ptr %3, align 8, !tbaa !5
  %198 = load ptr, ptr %197, align 8, !tbaa !9
  %199 = getelementptr inbounds ptr, ptr %198, i64 6
  %200 = load ptr, ptr %199, align 8
  %201 = call noundef i32 %200(ptr noundef nonnull align 8 dereferenceable(184) %197)
  %202 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %196, ptr noundef @.str.6, i32 noundef %201) #9
  %203 = load ptr, ptr @stderr, align 8, !tbaa !5
  %204 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %203, ptr noundef @.str.3) #9
  call void @print_trace()
  call void @exit(i32 noundef 1) #10
  unreachable

205:                                              ; No predecessors!
  br label %206

206:                                              ; preds = %205
  br label %207

207:                                              ; preds = %206, %183, %181, %179, %176, %163
  br label %44, !llvm.loop !31

208:                                              ; preds = %44
  %209 = load i32, ptr @RcsLogLevel, align 4, !tbaa !13
  %210 = icmp sle i32 1, %209
  br i1 %210, label %211, label %217

211:                                              ; preds = %208
  %212 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 145)
  %213 = load ptr, ptr %3, align 8, !tbaa !5
  %214 = load ptr, ptr %213, align 8, !tbaa !9
  %215 = getelementptr inbounds ptr, ptr %214, i64 10
  %216 = load ptr, ptr %215, align 8
  call void %216(ptr noundef nonnull align 8 dereferenceable(184) %213)
  br label %217

217:                                              ; preds = %211, %208
  %218 = load ptr, ptr %6, align 8, !tbaa !5
  call void @Timer_destroy(ptr noundef %218)
  %219 = load ptr, ptr %3, align 8, !tbaa !5
  %220 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %219, i32 0, i32 17
  %221 = call i32 @pthread_mutex_lock(ptr noundef %220) #9
  %222 = load ptr, ptr %3, align 8, !tbaa !5
  %223 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %222, i32 0, i32 2
  store i8 0, ptr %223, align 1, !tbaa !33
  %224 = load ptr, ptr %3, align 8, !tbaa !5
  %225 = getelementptr inbounds %"class.Rcs::PeriodicCallback", ptr %224, i32 0, i32 17
  %226 = call i32 @pthread_mutex_unlock(ptr noundef %225) #9
  call void @pthread_exit(ptr noundef null) #11
  unreachable
}

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

; Function Attrs: nounwind
declare i32 @fprintf(ptr noundef, ptr noundef, ...) #2

declare ptr @Timer_create(double noundef) #3

; Function Attrs: nounwind
declare i32 @pthread_mutex_lock(ptr noundef) #2

declare double @Timer_getSystemTime() #3

; Function Attrs: nounwind
declare i32 @pthread_mutex_unlock(ptr noundef) #2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3minIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) #4

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) #4

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #5

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

declare zeroext i1 @Timer_wait(ptr noundef) #3

declare void @Timer_waitNoCatchUp(ptr noundef) #3

declare void @Timer_waitDT(double noundef) #3

declare void @print_trace() #3

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) #7

declare i32 @printf(ptr noundef, ...) #3

declare void @Timer_destroy(ptr noundef) #3

; Function Attrs: noreturn
declare void @pthread_exit(ptr noundef) #8

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"vtable pointer", !8, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"int", !7, i64 0}
!15 = !{!16, !12, i64 24}
!16 = !{!"_ZTSN3Rcs16PeriodicCallbackE", !17, i64 8, !17, i64 9, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48, !12, i64 56, !12, i64 64, !18, i64 72, !18, i64 80, !14, i64 88, !14, i64 92, !18, i64 96, !19, i64 104, !21, i64 136, !7, i64 144}
!17 = !{!"bool", !7, i64 0}
!18 = !{!"long", !7, i64 0}
!19 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !20, i64 0, !18, i64 8, !7, i64 16}
!20 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !6, i64 0}
!21 = !{!"_ZTSN3Rcs16PeriodicCallback15SynchronizeModeE", !7, i64 0}
!22 = !{!16, !12, i64 32}
!23 = !{!16, !12, i64 40}
!24 = !{!16, !12, i64 48}
!25 = !{!16, !12, i64 56}
!26 = !{!16, !12, i64 64}
!27 = !{!16, !21, i64 136}
!28 = !{!16, !18, i64 72}
!29 = !{!16, !18, i64 80}
!30 = !{!16, !17, i64 8}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.mustprogress"}
!33 = !{!16, !17, i64 9}


; 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"

@RCS_GLOBAL_RLOG_CB = external local_unnamed_addr global ptr, align 8
@.str = external hidden unnamed_addr constant [77 x i8], align 1
@__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv = external hidden unnamed_addr constant [16 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [42 x i8], align 1
@RcsLogLevel = external local_unnamed_addr global i32, align 4
@stderr = external local_unnamed_addr global ptr, align 8
@.str.2 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [66 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [29 x i8], align 1

; Function Attrs: mustprogress noreturn uwtable
define dso_local noundef ptr @_ZN3Rcs16PeriodicCallback15threadFuncPosixEPv(ptr noundef %0) local_unnamed_addr #0 align 2 {
  %2 = load ptr, ptr %0, align 8, !tbaa !5
  %3 = getelementptr inbounds i8, ptr %2, i64 24
  %4 = load ptr, ptr %3, align 8
  tail call void %4(ptr noundef nonnull align 8 dereferenceable(184) %0)
  %5 = load ptr, ptr %0, align 8, !tbaa !5
  %6 = getelementptr inbounds i8, ptr %5, i64 120
  %7 = load ptr, ptr %6, align 8
  %8 = tail call noundef double %7(ptr noundef nonnull align 8 dereferenceable(184) %0)
  %9 = fdiv double 1.000000e+00, %8
  %10 = fmul double %9, 1.000000e+06
  %11 = load ptr, ptr @RCS_GLOBAL_RLOG_CB, align 8, !tbaa !8
  %.not = icmp eq ptr %11, null
  br i1 %.not, label %14, label %12

12:                                               ; preds = %1
  %13 = fmul double %9, 1.000000e+03
  tail call void (i32, ptr, ptr, i32, ptr, ...) %11(i32 noundef 5, ptr noundef nonnull @.str, ptr noundef nonnull @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 65, ptr noundef nonnull @.str.1, double noundef %13)
  br label %14

14:                                               ; preds = %12, %1
  %15 = load i32, ptr @RcsLogLevel, align 4, !tbaa !11
  %16 = icmp sgt i32 %15, 4
  br i1 %16, label %17, label %25

17:                                               ; preds = %14
  %18 = load ptr, ptr @stderr, align 8, !tbaa !8
  %19 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %18, ptr noundef nonnull @.str.2, ptr noundef nonnull @.str, ptr noundef nonnull @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 65) #9
  %20 = load ptr, ptr @stderr, align 8, !tbaa !8
  %21 = fmul double %9, 1.000000e+03
  %22 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %20, ptr noundef nonnull @.str.1, double noundef %21) #9
  %23 = load ptr, ptr @stderr, align 8, !tbaa !8
  %24 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %23, ptr noundef nonnull @.str.3) #9
  br label %25

25:                                               ; preds = %17, %14
  %26 = tail call ptr @Timer_create(double noundef %9)
  %27 = load ptr, ptr %0, align 8, !tbaa !5
  %28 = getelementptr inbounds i8, ptr %27, i64 88
  %29 = load ptr, ptr %28, align 8
  %30 = tail call noundef zeroext i1 %29(ptr noundef nonnull align 8 dereferenceable(184) %0)
  br i1 %30, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %25
  %31 = getelementptr inbounds i8, ptr %0, i64 144
  %32 = getelementptr inbounds i8, ptr %0, i64 24
  %33 = getelementptr inbounds i8, ptr %0, i64 32
  %34 = getelementptr inbounds i8, ptr %0, i64 40
  %35 = getelementptr inbounds i8, ptr %0, i64 48
  %36 = getelementptr inbounds i8, ptr %0, i64 56
  %37 = getelementptr inbounds i8, ptr %0, i64 64
  %38 = getelementptr inbounds i8, ptr %0, i64 136
  %39 = getelementptr inbounds i8, ptr %0, i64 72
  %40 = getelementptr inbounds i8, ptr %0, i64 104
  %41 = getelementptr inbounds i8, ptr %0, i64 80
  %42 = getelementptr inbounds i8, ptr %0, i64 8
  br label %43

43:                                               ; preds = %.lr.ph, %115
  %44 = tail call i32 @pthread_mutex_lock(ptr noundef nonnull %31) #10
  %45 = tail call double @Timer_getSystemTime()
  store double %45, ptr %32, align 8, !tbaa !13
  %46 = tail call i32 @pthread_mutex_unlock(ptr noundef nonnull %31) #10
  %47 = load ptr, ptr %0, align 8, !tbaa !5
  %48 = getelementptr inbounds i8, ptr %47, i64 16
  %49 = load ptr, ptr %48, align 8
  tail call void %49(ptr noundef nonnull align 8 dereferenceable(184) %0)
  %50 = tail call i32 @pthread_mutex_lock(ptr noundef nonnull %31) #10
  %51 = tail call double @Timer_getSystemTime()
  %52 = load double, ptr %32, align 8, !tbaa !13
  %53 = fsub double %51, %52
  %54 = fmul double %53, 1.000000e+06
  store double %54, ptr %33, align 8, !tbaa !21
  %55 = tail call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3minIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %33, ptr noundef nonnull align 8 dereferenceable(8) %34)
  %56 = load double, ptr %55, align 8, !tbaa !22
  store double %56, ptr %34, align 8, !tbaa !23
  %57 = tail call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %33, ptr noundef nonnull align 8 dereferenceable(8) %35)
  %58 = load double, ptr %57, align 8, !tbaa !22
  store double %58, ptr %35, align 8, !tbaa !24
  %59 = load double, ptr %33, align 8, !tbaa !21
  %60 = load double, ptr %36, align 8, !tbaa !25
  %61 = fadd double %59, %60
  store double %61, ptr %36, align 8, !tbaa !25
  %62 = load double, ptr %37, align 8, !tbaa !26
  %63 = tail call double @llvm.fmuladd.f64(double %59, double %59, double %62)
  store double %63, ptr %37, align 8, !tbaa !26
  %64 = fcmp ogt double %59, %10
  br i1 %64, label %65, label %89

65:                                               ; preds = %43
  %66 = load i32, ptr %38, align 8, !tbaa !27
  %.not55 = icmp eq i32 %66, 2
  br i1 %.not55, label %89, label %67

67:                                               ; preds = %65
  %68 = load ptr, ptr @RCS_GLOBAL_RLOG_CB, align 8, !tbaa !8
  %.not56 = icmp eq ptr %68, null
  br i1 %.not56, label %73, label %69

69:                                               ; preds = %67
  %70 = load i64, ptr %39, align 8, !tbaa !28
  %71 = tail call noundef ptr @_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv(ptr noundef nonnull align 8 dereferenceable(32) %40) #10
  %72 = load double, ptr %33, align 8, !tbaa !21
  tail call void (i32, ptr, ptr, i32, ptr, ...) %68(i32 noundef 3, ptr noundef nonnull @.str, ptr noundef nonnull @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 99, ptr noundef nonnull @.str.4, i64 noundef %70, ptr noundef %71, double noundef %72, double noundef %10)
  br label %73

73:                                               ; preds = %69, %67
  %74 = load i32, ptr @RcsLogLevel, align 4, !tbaa !11
  %75 = icmp sgt i32 %74, 2
  br i1 %75, label %76, label %86

76:                                               ; preds = %73
  %77 = load ptr, ptr @stderr, align 8, !tbaa !8
  %78 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %77, ptr noundef nonnull @.str.2, ptr noundef nonnull @.str, ptr noundef nonnull @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 99) #9
  %79 = load ptr, ptr @stderr, align 8, !tbaa !8
  %80 = load i64, ptr %39, align 8, !tbaa !28
  %81 = tail call noundef ptr @_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv(ptr noundef nonnull align 8 dereferenceable(32) %40) #10
  %82 = load double, ptr %33, align 8, !tbaa !21
  %83 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %79, ptr noundef nonnull @.str.4, i64 noundef %80, ptr noundef %81, double noundef %82, double noundef %10) #9
  %84 = load ptr, ptr @stderr, align 8, !tbaa !8
  %85 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %84, ptr noundef nonnull @.str.3) #9
  br label %86

86:                                               ; preds = %76, %73
  %87 = load i64, ptr %41, align 8, !tbaa !29
  %88 = add i64 %87, 1
  store i64 %88, ptr %41, align 8, !tbaa !29
  br label %89

89:                                               ; preds = %86, %65, %43
  %90 = load i64, ptr %39, align 8, !tbaa !28
  %91 = add i64 %90, 1
  store i64 %91, ptr %39, align 8, !tbaa !28
  %92 = tail call i32 @pthread_mutex_unlock(ptr noundef nonnull %31) #10
  %93 = load ptr, ptr %0, align 8, !tbaa !5
  %94 = getelementptr inbounds i8, ptr %93, i64 48
  %95 = load ptr, ptr %94, align 8
  %96 = tail call noundef i32 %95(ptr noundef nonnull align 8 dereferenceable(184) %0)
  switch i32 %96, label %104 [
    i32 0, label %97
    i32 1, label %99
    i32 2, label %100
    i32 3, label %101
    i32 4, label %115
  ]

97:                                               ; preds = %89
  %98 = tail call zeroext i1 @Timer_wait(ptr noundef %26)
  br label %115

99:                                               ; preds = %89
  tail call void @Timer_waitNoCatchUp(ptr noundef %26)
  br label %115

100:                                              ; preds = %89
  tail call void @Timer_waitDT(double noundef %9)
  br label %115

101:                                              ; preds = %89
  %102 = tail call i32 @pthread_mutex_lock(ptr noundef nonnull %31) #10
  store i8 0, ptr %42, align 8, !tbaa !30
  %103 = tail call i32 @pthread_mutex_unlock(ptr noundef nonnull %31) #10
  br label %115

104:                                              ; preds = %89
  %105 = load ptr, ptr @stderr, align 8, !tbaa !8
  %106 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %105, ptr noundef nonnull @.str.5, ptr noundef nonnull @.str, ptr noundef nonnull @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 137) #9
  %107 = load ptr, ptr @stderr, align 8, !tbaa !8
  %108 = load ptr, ptr %0, align 8, !tbaa !5
  %109 = getelementptr inbounds i8, ptr %108, i64 48
  %110 = load ptr, ptr %109, align 8
  %111 = tail call noundef i32 %110(ptr noundef nonnull align 8 dereferenceable(184) %0)
  %112 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %107, ptr noundef nonnull @.str.6, i32 noundef %111) #9
  %113 = load ptr, ptr @stderr, align 8, !tbaa !8
  %114 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %113, ptr noundef nonnull @.str.3) #9
  tail call void @print_trace()
  tail call void @exit(i32 noundef 1) #11
  unreachable

115:                                              ; preds = %101, %100, %99, %97, %89
  %116 = load ptr, ptr %0, align 8, !tbaa !5
  %117 = getelementptr inbounds i8, ptr %116, i64 88
  %118 = load ptr, ptr %117, align 8
  %119 = tail call noundef zeroext i1 %118(ptr noundef nonnull align 8 dereferenceable(184) %0)
  br i1 %119, label %43, label %._crit_edge, !llvm.loop !31

._crit_edge:                                      ; preds = %115, %25
  %120 = load i32, ptr @RcsLogLevel, align 4, !tbaa !11
  %121 = icmp sgt i32 %120, 0
  br i1 %121, label %122, label %127

122:                                              ; preds = %._crit_edge
  %123 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, ptr noundef nonnull @__func__._ZN3Rcs16PeriodicCallback15threadFuncPosixEPv, i32 noundef 145)
  %124 = load ptr, ptr %0, align 8, !tbaa !5
  %125 = getelementptr inbounds i8, ptr %124, i64 80
  %126 = load ptr, ptr %125, align 8
  tail call void %126(ptr noundef nonnull align 8 dereferenceable(184) %0)
  br label %127

127:                                              ; preds = %122, %._crit_edge
  tail call void @Timer_destroy(ptr noundef %26)
  %128 = getelementptr inbounds i8, ptr %0, i64 144
  %129 = tail call i32 @pthread_mutex_lock(ptr noundef nonnull %128) #10
  %130 = getelementptr inbounds i8, ptr %0, i64 9
  store i8 0, ptr %130, align 1, !tbaa !33
  %131 = tail call i32 @pthread_mutex_unlock(ptr noundef nonnull %128) #10
  tail call void @pthread_exit(ptr noundef null) #12
  unreachable
}

; Function Attrs: nofree nounwind
declare noundef i32 @fprintf(ptr nocapture noundef, ptr nocapture noundef readonly, ...) local_unnamed_addr #1

declare ptr @Timer_create(double noundef) local_unnamed_addr #2

; Function Attrs: nounwind
declare i32 @pthread_mutex_lock(ptr noundef) local_unnamed_addr #3

declare double @Timer_getSystemTime() local_unnamed_addr #2

; Function Attrs: nounwind
declare i32 @pthread_mutex_unlock(ptr noundef) local_unnamed_addr #3

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3minIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #4

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #4

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #5

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

declare zeroext i1 @Timer_wait(ptr noundef) local_unnamed_addr #2

declare void @Timer_waitNoCatchUp(ptr noundef) local_unnamed_addr #2

declare void @Timer_waitDT(double noundef) local_unnamed_addr #2

declare void @print_trace() local_unnamed_addr #2

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) local_unnamed_addr #7

; Function Attrs: nofree nounwind
declare noundef i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #1

declare void @Timer_destroy(ptr noundef) local_unnamed_addr #2

; Function Attrs: noreturn
declare void @pthread_exit(ptr noundef) local_unnamed_addr #8

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"vtable pointer", !7, i64 0}
!7 = !{!"Simple C++ TBAA"}
!8 = !{!9, !9, i64 0}
!9 = !{!"any pointer", !10, i64 0}
!10 = !{!"omnipotent char", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !10, i64 0}
!13 = !{!14, !16, i64 24}
!14 = !{!"_ZTSN3Rcs16PeriodicCallbackE", !15, i64 8, !15, i64 9, !16, i64 16, !16, i64 24, !16, i64 32, !16, i64 40, !16, i64 48, !16, i64 56, !16, i64 64, !17, i64 72, !17, i64 80, !12, i64 88, !12, i64 92, !17, i64 96, !18, i64 104, !20, i64 136, !10, i64 144}
!15 = !{!"bool", !10, i64 0}
!16 = !{!"double", !10, i64 0}
!17 = !{!"long", !10, i64 0}
!18 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !19, i64 0, !17, i64 8, !10, i64 16}
!19 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !9, i64 0}
!20 = !{!"_ZTSN3Rcs16PeriodicCallback15SynchronizeModeE", !10, i64 0}
!21 = !{!14, !16, i64 32}
!22 = !{!16, !16, i64 0}
!23 = !{!14, !16, i64 40}
!24 = !{!14, !16, i64 48}
!25 = !{!14, !16, i64 56}
!26 = !{!14, !16, i64 64}
!27 = !{!14, !20, i64 136}
!28 = !{!14, !17, i64 72}
!29 = !{!14, !17, i64 80}
!30 = !{!14, !15, i64 8}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.mustprogress"}
!33 = !{!14, !15, i64 9}


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