EnzymeAD / Enzyme

High-performance automatic differentiation of LLVM and MLIR.
https://enzyme.mit.edu
Other
1.25k stars 104 forks source link

[Bithack] Handle or of i32 with 32 #797

Closed ZuseZ4 closed 2 years ago

ZuseZ4 commented 2 years ago
cannot handle unknown binary operator:   %367 = or i32 %366, 32

or.ll.txt

wsmoses commented 2 years ago

Can you attach a full compiler explorer example? This feels more likely to actually be an integer rather than a weird bithack of a float/double...

ZuseZ4 commented 2 years ago

wip

; ModuleID = 'minOrBug.ll'
source_filename = "ld-temp.o"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"class.std::basic_ostream" = type { i32 (...)**, %"class.std::basic_ios" }
%"class.std::basic_ios" = type { %"class.std::ios_base", %"class.std::basic_ostream"*, i8, i8, %"class.std::basic_streambuf"*, %"class.std::ctype"*, %"class.std::num_put"*, %"class.std::num_put"* }
%"class.std::ios_base" = type { i32 (...)**, i64, i64, i32, i32, i32, %"struct.std::ios_base::_Callback_list"*, %"struct.std::ios_base::_Words", [8 x %"struct.std::ios_base::_Words"], i32, %"struct.std::ios_base::_Words"*, %"class.std::locale" }
%"struct.std::ios_base::_Callback_list" = type { %"struct.std::ios_base::_Callback_list"*, void (i32, %"class.std::ios_base"*, i32)*, i32, i32 }
%"struct.std::ios_base::_Words" = type { i8*, i64 }
%"class.std::locale" = type { %"class.std::locale::_Impl"* }
%"class.std::locale::_Impl" = type { i32, %"class.std::locale::facet"**, i64, %"class.std::locale::facet"**, i8** }
%"class.std::locale::facet" = type <{ i32 (...)**, i32, [4 x i8] }>
%"class.std::basic_streambuf" = type { i32 (...)**, i8*, i8*, i8*, i8*, i8*, i8*, %"class.std::locale" }
%"class.std::ctype" = type <{ %"class.std::locale::facet.base", [4 x i8], %struct.__locale_struct*, i8, [7 x i8], i32*, i32*, i16*, i8, [256 x i8], [256 x i8], i8, [6 x i8] }>
%"class.std::locale::facet.base" = type <{ i32 (...)**, i32 }>
%struct.__locale_struct = type { [13 x %struct.__locale_data*], i16*, i32*, i32*, [13 x i8*] }
%struct.__locale_data = type opaque
%"class.std::num_put" = type { %"class.std::locale::facet.base", [4 x i8] }
%"class.olb::util::Timer" = type { %"class.olb::OstreamManager", double, double, double, i64, i64, i64, i64*, %struct.timeval, %struct.timeval, %struct.timeval, %struct.timeval, double, i32, i32, i64, i32, i32, i32, double, double, double, double, double, double, double, double, double }
%"class.olb::OstreamManager" = type { %"class.std::basic_ostream.base", %"class.olb::OMBuf", %"class.std::basic_ios" }
%"class.std::basic_ostream.base" = type { i32 (...)** }
%"class.olb::OMBuf" = type { %"class.std::__cxx11::basic_stringbuf", %"class.std::basic_ostream"*, %"class.std::__cxx11::basic_string" }
%"class.std::__cxx11::basic_stringbuf" = type { %"class.std::basic_streambuf", i32, %"class.std::__cxx11::basic_string" }
%"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 { i8* }
%union.anon = type { i64, [8 x i8] }
%struct.timeval = type { i64, i64 }

$_ZN3olb4util5TimerIdE9printStepEi = comdat any

@.str.96 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.97 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.98 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.99 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.100 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.101 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.102 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.103 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.104 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.105 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.106 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.107 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.108 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.109 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.110 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.111 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.112 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.113 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.114 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.115 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.116 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.117 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.118 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.119 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.120 = external hidden unnamed_addr constant [57 x i8], align 1
@.str.121 = external hidden unnamed_addr constant [11 x i8], align 1

declare dso_local noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8), i8* noundef, i64 noundef) local_unnamed_addr #0

declare dso_local noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo5flushEv(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #0

; Function Attrs: noreturn
declare dso_local void @_ZSt16__throw_bad_castv() local_unnamed_addr #1

declare dso_local void @_ZNKSt5ctypeIcE13_M_widen_initEv(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570)) local_unnamed_addr #0

declare dso_local noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo3putEc(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8), i8 noundef signext) local_unnamed_addr #0

declare dso_local noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8), i32 noundef) local_unnamed_addr #0

declare dso_local noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8), double noundef) local_unnamed_addr #0

; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
declare double @llvm.maxnum.f64(double, double) #2

; Function Attrs: mustprogress uwtable
define hidden void @_ZN3olb4util5TimerIdE9printStepEi(%"class.olb::util::Timer"* noundef nonnull align 8 dereferenceable(648) %0, i32 noundef %1) #3 comdat align 2 {
  switch i32 %1, label %683 [
    i32 0, label %3
    i32 1, label %85
    i32 2, label %290
    i32 3, label %586
  ]

3:                                                ; preds = %2
  %4 = bitcast %"class.olb::util::Timer"* %0 to %"class.std::basic_ostream"*
  %5 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %4, i8* noundef nonnull getelementptr inbounds ([6 x i8], [6 x i8]* @.str.96, i64 0, i64 0), i64 noundef 5)
  %6 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 13
  %7 = load i32, i32* %6, align 8, !tbaa !7
  %8 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %4, i32 noundef %7)
  %9 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %8, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.97, i64 0, i64 0), i64 noundef 2)
  %10 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %8, i8* noundef nonnull getelementptr inbounds ([9 x i8], [9 x i8]* @.str.98, i64 0, i64 0), i64 noundef 8)
  %11 = load i32, i32* %6, align 8, !tbaa !7
  %12 = sitofp i32 %11 to double
  %13 = fmul double %12, 1.000000e+02
  %14 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 14
  %15 = load i32, i32* %14, align 4, !tbaa !20
  %16 = sitofp i32 %15 to double
  %17 = fdiv double %13, %16
  %18 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %8, double noundef %17)
  %19 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %18, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.97, i64 0, i64 0), i64 noundef 2)
  %20 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %18, i8* noundef nonnull getelementptr inbounds ([12 x i8], [12 x i8]* @.str.99, i64 0, i64 0), i64 noundef 11)
  %21 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 25
  %22 = load double, double* %21, align 8, !tbaa !21
  %23 = fdiv double %22, 1.000000e+03
  %24 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %18, double noundef %23)
  %25 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %24, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.97, i64 0, i64 0), i64 noundef 2)
  %26 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %24, i8* noundef nonnull getelementptr inbounds ([9 x i8], [9 x i8]* @.str.100, i64 0, i64 0), i64 noundef 8)
  %27 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 26
  %28 = load double, double* %27, align 8, !tbaa !22
  %29 = fdiv double %28, 1.000000e+03
  %30 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %24, double noundef %29)
  %31 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %30, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.97, i64 0, i64 0), i64 noundef 2)
  %32 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %30, i8* noundef nonnull getelementptr inbounds ([7 x i8], [7 x i8]* @.str.101, i64 0, i64 0), i64 noundef 6)
  %33 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 15
  %34 = load i64, i64* %33, align 8, !tbaa !23
  %35 = uitofp i64 %34 to double
  %36 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 12
  %37 = load double, double* %36, align 8, !tbaa !24
  %38 = fmul double %37, %35
  %39 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 9, i32 0
  %40 = load i64, i64* %39, align 8, !tbaa.struct !25
  %41 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 9, i32 1
  %42 = load i64, i64* %41, align 8, !tbaa.struct !27
  %43 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 11, i32 0
  %44 = load i64, i64* %43, align 8, !tbaa.struct !25
  %45 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 11, i32 1
  %46 = load i64, i64* %45, align 8, !tbaa.struct !27
  %47 = sub nsw i64 %40, %44
  %48 = mul nsw i64 %47, 1000
  %49 = sub nsw i64 %42, %46
  %50 = sdiv i64 %49, 1000
  %51 = add nsw i64 %50, %48
  %52 = sitofp i64 %51 to double
  %53 = tail call double @llvm.maxnum.f64(double %52, double 1.000000e+00) #4
  %54 = fmul double %53, 1.000000e+03
  %55 = fdiv double %38, %54
  %56 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %30, double noundef %55)
  %57 = bitcast %"class.std::basic_ostream"* %56 to i8**
  %58 = load i8*, i8** %57, align 8, !tbaa !28
  %59 = getelementptr i8, i8* %58, i64 -24
  %60 = bitcast i8* %59 to i64*
  %61 = load i64, i64* %60, align 8
  %62 = bitcast %"class.std::basic_ostream"* %56 to i8*
  %63 = getelementptr inbounds i8, i8* %62, i64 %61
  %64 = getelementptr inbounds i8, i8* %63, i64 240
  %65 = bitcast i8* %64 to %"class.std::ctype"**
  %66 = load %"class.std::ctype"*, %"class.std::ctype"** %65, align 8, !tbaa !30
  %67 = icmp eq %"class.std::ctype"* %66, null
  br i1 %67, label %68, label %69

68:                                               ; preds = %3
  tail call void @_ZSt16__throw_bad_castv() #5
  unreachable

69:                                               ; preds = %3
  %70 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %66, i64 0, i32 8
  %71 = load i8, i8* %70, align 8, !tbaa !33
  %72 = icmp eq i8 %71, 0
  br i1 %72, label %76, label %73

73:                                               ; preds = %69
  %74 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %66, i64 0, i32 9, i64 10
  %75 = load i8, i8* %74, align 1, !tbaa !35
  br label %82

76:                                               ; preds = %69
  tail call void @_ZNKSt5ctypeIcE13_M_widen_initEv(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %66)
  %77 = bitcast %"class.std::ctype"* %66 to i8 (%"class.std::ctype"*, i8)***
  %78 = load i8 (%"class.std::ctype"*, i8)**, i8 (%"class.std::ctype"*, i8)*** %77, align 8, !tbaa !28
  %79 = getelementptr inbounds i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %78, i64 6
  %80 = load i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %79, align 8
  %81 = tail call noundef signext i8 %80(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %66, i8 noundef signext 10)
  br label %82

82:                                               ; preds = %76, %73
  %83 = phi i8 [ %75, %73 ], [ %81, %76 ]
  %84 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo3putEc(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %56, i8 noundef signext %83)
  br label %717

85:                                               ; preds = %2
  %86 = bitcast %"class.olb::util::Timer"* %0 to %"class.std::basic_ostream"*
  %87 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %86, i8* noundef nonnull getelementptr inbounds ([12 x i8], [12 x i8]* @.str.102, i64 0, i64 0), i64 noundef 11)
  %88 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 13
  %89 = load i32, i32* %88, align 8, !tbaa !7
  %90 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %86, i32 noundef %89)
  %91 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %90, i8* noundef nonnull getelementptr inbounds ([2 x i8], [2 x i8]* @.str.103, i64 0, i64 0), i64 noundef 1)
  %92 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 14
  %93 = load i32, i32* %92, align 4, !tbaa !20
  %94 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %90, i32 noundef %93)
  %95 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %94, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.104, i64 0, i64 0), i64 noundef 2)
  %96 = load i32, i32* %88, align 8, !tbaa !7
  %97 = mul nsw i32 %96, 100
  %98 = load i32, i32* %92, align 4, !tbaa !20
  %99 = sdiv i32 %97, %98
  %100 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %94, i32 noundef %99)
  %101 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %100, i8* noundef nonnull getelementptr inbounds ([5 x i8], [5 x i8]* @.str.105, i64 0, i64 0), i64 noundef 4)
  %102 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %100, i8* noundef nonnull getelementptr inbounds ([14 x i8], [14 x i8]* @.str.106, i64 0, i64 0), i64 noundef 13)
  %103 = bitcast %"class.std::basic_ostream"* %100 to i8**
  %104 = load i8*, i8** %103, align 8, !tbaa !28
  %105 = getelementptr i8, i8* %104, i64 -24
  %106 = bitcast i8* %105 to i64*
  %107 = load i64, i64* %106, align 8
  %108 = bitcast %"class.std::basic_ostream"* %100 to i8*
  %109 = getelementptr inbounds i8, i8* %108, i64 %107
  %110 = getelementptr inbounds i8, i8* %109, i64 8
  %111 = bitcast i8* %110 to i64*
  store i64 2, i64* %111, align 8, !tbaa !36
  %112 = load i64, i64* %106, align 8
  %113 = getelementptr inbounds i8, i8* %108, i64 %112
  %114 = getelementptr inbounds i8, i8* %113, i64 24
  %115 = bitcast i8* %114 to i32*
  %116 = load i32, i32* %115, align 8, !tbaa !42
  %117 = and i32 %116, -261
  %118 = or i32 %117, 4
  store i32 %118, i32* %115, align 8, !tbaa !43
  %119 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 25
  %120 = load double, double* %119, align 8, !tbaa !21
  %121 = fdiv double %120, 1.000000e+03
  %122 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %100, double noundef %121)
  %123 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %122, i8* noundef nonnull getelementptr inbounds ([2 x i8], [2 x i8]* @.str.103, i64 0, i64 0), i64 noundef 1)
  %124 = bitcast %"class.std::basic_ostream"* %122 to i8**
  %125 = load i8*, i8** %124, align 8, !tbaa !28
  %126 = getelementptr i8, i8* %125, i64 -24
  %127 = bitcast i8* %126 to i64*
  %128 = load i64, i64* %127, align 8
  %129 = bitcast %"class.std::basic_ostream"* %122 to i8*
  %130 = getelementptr inbounds i8, i8* %129, i64 %128
  %131 = getelementptr inbounds i8, i8* %130, i64 8
  %132 = bitcast i8* %131 to i64*
  store i64 1, i64* %132, align 8, !tbaa !36
  %133 = load i64, i64* %127, align 8
  %134 = getelementptr inbounds i8, i8* %129, i64 %133
  %135 = getelementptr inbounds i8, i8* %134, i64 24
  %136 = bitcast i8* %135 to i32*
  %137 = load i32, i32* %136, align 8, !tbaa !42
  %138 = and i32 %137, -261
  %139 = or i32 %138, 4
  store i32 %139, i32* %136, align 8, !tbaa !43
  %140 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 27
  %141 = load double, double* %140, align 8, !tbaa !44
  %142 = fdiv double %141, 1.000000e+03
  %143 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %122, double noundef %142)
  %144 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %143, i8* noundef nonnull getelementptr inbounds ([4 x i8], [4 x i8]* @.str.107, i64 0, i64 0), i64 noundef 3)
  %145 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %143, i8* noundef nonnull getelementptr inbounds ([10 x i8], [10 x i8]* @.str.108, i64 0, i64 0), i64 noundef 9)
  %146 = bitcast %"class.std::basic_ostream"* %143 to i8**
  %147 = load i8*, i8** %146, align 8, !tbaa !28
  %148 = getelementptr i8, i8* %147, i64 -24
  %149 = bitcast i8* %148 to i64*
  %150 = load i64, i64* %149, align 8
  %151 = bitcast %"class.std::basic_ostream"* %143 to i8*
  %152 = getelementptr inbounds i8, i8* %151, i64 %150
  %153 = getelementptr inbounds i8, i8* %152, i64 16
  %154 = bitcast i8* %153 to i64*
  store i64 2, i64* %154, align 8, !tbaa !45
  %155 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 26
  %156 = load double, double* %155, align 8, !tbaa !22
  %157 = fdiv double %156, 1.000000e+03
  %158 = fptosi double %157 to i32
  %159 = sdiv i32 %158, 60
  %160 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %143, i32 noundef %159)
  %161 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %160, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.109, i64 0, i64 0), i64 noundef 2)
  %162 = bitcast %"class.std::basic_ostream"* %160 to i8**
  %163 = load i8*, i8** %162, align 8, !tbaa !28
  %164 = getelementptr i8, i8* %163, i64 -24
  %165 = bitcast i8* %164 to i64*
  %166 = load i64, i64* %165, align 8
  %167 = bitcast %"class.std::basic_ostream"* %160 to i8*
  %168 = getelementptr inbounds i8, i8* %167, i64 %166
  %169 = getelementptr inbounds i8, i8* %168, i64 225
  %170 = load i8, i8* %169, align 1, !tbaa !46, !range !47
  %171 = icmp eq i8 %170, 0
  br i1 %171, label %172, label %191

172:                                              ; preds = %85
  %173 = getelementptr inbounds i8, i8* %168, i64 240
  %174 = bitcast i8* %173 to %"class.std::ctype"**
  %175 = load %"class.std::ctype"*, %"class.std::ctype"** %174, align 8, !tbaa !30
  %176 = icmp eq %"class.std::ctype"* %175, null
  br i1 %176, label %177, label %178

177:                                              ; preds = %172
  tail call void @_ZSt16__throw_bad_castv() #5
  unreachable

178:                                              ; preds = %172
  %179 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %175, i64 0, i32 8
  %180 = load i8, i8* %179, align 8, !tbaa !33
  %181 = icmp eq i8 %180, 0
  br i1 %181, label %182, label %189

182:                                              ; preds = %178
  tail call void @_ZNKSt5ctypeIcE13_M_widen_initEv(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %175)
  %183 = bitcast %"class.std::ctype"* %175 to i8 (%"class.std::ctype"*, i8)***
  %184 = load i8 (%"class.std::ctype"*, i8)**, i8 (%"class.std::ctype"*, i8)*** %183, align 8, !tbaa !28
  %185 = getelementptr inbounds i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %184, i64 6
  %186 = load i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %185, align 8
  %187 = tail call noundef signext i8 %186(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %175, i8 noundef signext 32)
  %188 = load i8*, i8** %162, align 8, !tbaa !28
  br label %189

189:                                              ; preds = %182, %178
  %190 = phi i8* [ %188, %182 ], [ %163, %178 ]
  store i8 1, i8* %169, align 1, !tbaa !46
  br label %191

191:                                              ; preds = %189, %85
  %192 = phi i8* [ %163, %85 ], [ %190, %189 ]
  %193 = getelementptr inbounds i8, i8* %168, i64 224
  store i8 48, i8* %193, align 8, !tbaa !48
  %194 = getelementptr i8, i8* %192, i64 -24
  %195 = bitcast i8* %194 to i64*
  %196 = load i64, i64* %195, align 8
  %197 = getelementptr inbounds i8, i8* %167, i64 %196
  %198 = getelementptr inbounds i8, i8* %197, i64 16
  %199 = bitcast i8* %198 to i64*
  store i64 4, i64* %199, align 8, !tbaa !45
  %200 = load double, double* %155, align 8, !tbaa !22
  %201 = fdiv double %200, 1.000000e+02
  %202 = fptosi double %201 to i32
  %203 = srem i32 %202, 600
  %204 = sitofp i32 %203 to double
  %205 = fdiv double %204, 1.000000e+01
  %206 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %160, double noundef %205)
  %207 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %206, i8* noundef nonnull getelementptr inbounds ([4 x i8], [4 x i8]* @.str.107, i64 0, i64 0), i64 noundef 3)
  %208 = bitcast %"class.std::basic_ostream"* %206 to i8**
  %209 = load i8*, i8** %208, align 8, !tbaa !28
  %210 = getelementptr i8, i8* %209, i64 -24
  %211 = bitcast i8* %210 to i64*
  %212 = load i64, i64* %211, align 8
  %213 = bitcast %"class.std::basic_ostream"* %206 to i8*
  %214 = getelementptr inbounds i8, i8* %213, i64 %212
  %215 = getelementptr inbounds i8, i8* %214, i64 225
  %216 = load i8, i8* %215, align 1, !tbaa !46, !range !47
  %217 = icmp eq i8 %216, 0
  br i1 %217, label %218, label %235

218:                                              ; preds = %191
  %219 = getelementptr inbounds i8, i8* %214, i64 240
  %220 = bitcast i8* %219 to %"class.std::ctype"**
  %221 = load %"class.std::ctype"*, %"class.std::ctype"** %220, align 8, !tbaa !30
  %222 = icmp eq %"class.std::ctype"* %221, null
  br i1 %222, label %223, label %224

223:                                              ; preds = %218
  tail call void @_ZSt16__throw_bad_castv() #5
  unreachable

224:                                              ; preds = %218
  %225 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %221, i64 0, i32 8
  %226 = load i8, i8* %225, align 8, !tbaa !33
  %227 = icmp eq i8 %226, 0
  br i1 %227, label %228, label %234

228:                                              ; preds = %224
  tail call void @_ZNKSt5ctypeIcE13_M_widen_initEv(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %221)
  %229 = bitcast %"class.std::ctype"* %221 to i8 (%"class.std::ctype"*, i8)***
  %230 = load i8 (%"class.std::ctype"*, i8)**, i8 (%"class.std::ctype"*, i8)*** %229, align 8, !tbaa !28
  %231 = getelementptr inbounds i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %230, i64 6
  %232 = load i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %231, align 8
  %233 = tail call noundef signext i8 %232(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %221, i8 noundef signext 32)
  br label %234

234:                                              ; preds = %228, %224
  store i8 1, i8* %215, align 1, !tbaa !46
  br label %235

235:                                              ; preds = %234, %191
  %236 = getelementptr inbounds i8, i8* %214, i64 224
  store i8 32, i8* %236, align 8, !tbaa !48
  %237 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %206, i8* noundef nonnull getelementptr inbounds ([8 x i8], [8 x i8]* @.str.110, i64 0, i64 0), i64 noundef 7)
  %238 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 15
  %239 = load i64, i64* %238, align 8, !tbaa !23
  %240 = uitofp i64 %239 to double
  %241 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 12
  %242 = load double, double* %241, align 8, !tbaa !24
  %243 = fmul double %242, %240
  %244 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 9, i32 0
  %245 = load i64, i64* %244, align 8, !tbaa.struct !25
  %246 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 9, i32 1
  %247 = load i64, i64* %246, align 8, !tbaa.struct !27
  %248 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 11, i32 0
  %249 = load i64, i64* %248, align 8, !tbaa.struct !25
  %250 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 11, i32 1
  %251 = load i64, i64* %250, align 8, !tbaa.struct !27
  %252 = sub nsw i64 %245, %249
  %253 = mul nsw i64 %252, 1000
  %254 = sub nsw i64 %247, %251
  %255 = sdiv i64 %254, 1000
  %256 = add nsw i64 %255, %253
  %257 = sitofp i64 %256 to double
  %258 = tail call double @llvm.maxnum.f64(double %257, double 1.000000e+00) #4
  %259 = fmul double %258, 1.000000e+03
  %260 = fdiv double %243, %259
  %261 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %206, double noundef %260)
  %262 = bitcast %"class.std::basic_ostream"* %261 to i8**
  %263 = load i8*, i8** %262, align 8, !tbaa !28
  %264 = getelementptr i8, i8* %263, i64 -24
  %265 = bitcast i8* %264 to i64*
  %266 = load i64, i64* %265, align 8
  %267 = bitcast %"class.std::basic_ostream"* %261 to i8*
  %268 = getelementptr inbounds i8, i8* %267, i64 %266
  %269 = getelementptr inbounds i8, i8* %268, i64 240
  %270 = bitcast i8* %269 to %"class.std::ctype"**
  %271 = load %"class.std::ctype"*, %"class.std::ctype"** %270, align 8, !tbaa !30
  %272 = icmp eq %"class.std::ctype"* %271, null
  br i1 %272, label %273, label %274

273:                                              ; preds = %235
  tail call void @_ZSt16__throw_bad_castv() #5
  unreachable

274:                                              ; preds = %235
  %275 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %271, i64 0, i32 8
  %276 = load i8, i8* %275, align 8, !tbaa !33
  %277 = icmp eq i8 %276, 0
  br i1 %277, label %281, label %278

278:                                              ; preds = %274
  %279 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %271, i64 0, i32 9, i64 10
  %280 = load i8, i8* %279, align 1, !tbaa !35
  br label %287

281:                                              ; preds = %274
  tail call void @_ZNKSt5ctypeIcE13_M_widen_initEv(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %271)
  %282 = bitcast %"class.std::ctype"* %271 to i8 (%"class.std::ctype"*, i8)***
  %283 = load i8 (%"class.std::ctype"*, i8)**, i8 (%"class.std::ctype"*, i8)*** %282, align 8, !tbaa !28
  %284 = getelementptr inbounds i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %283, i64 6
  %285 = load i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %284, align 8
  %286 = tail call noundef signext i8 %285(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %271, i8 noundef signext 10)
  br label %287

287:                                              ; preds = %281, %278
  %288 = phi i8 [ %280, %278 ], [ %286, %281 ]
  %289 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo3putEc(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %261, i8 noundef signext %288)
  br label %717

290:                                              ; preds = %2
  %291 = bitcast %"class.olb::util::Timer"* %0 to %"class.std::basic_ostream"*
  %292 = bitcast %"class.olb::util::Timer"* %0 to i8**
  %293 = load i8*, i8** %292, align 8, !tbaa !28
  %294 = getelementptr i8, i8* %293, i64 -24
  %295 = bitcast i8* %294 to i64*
  %296 = load i64, i64* %295, align 8
  %297 = bitcast %"class.olb::util::Timer"* %0 to i8*
  %298 = getelementptr inbounds i8, i8* %297, i64 %296
  %299 = getelementptr inbounds i8, i8* %298, i64 16
  %300 = bitcast i8* %299 to i64*
  store i64 21, i64* %300, align 8, !tbaa !45
  %301 = load i64, i64* %295, align 8
  %302 = getelementptr inbounds i8, i8* %297, i64 %301
  %303 = getelementptr inbounds i8, i8* %302, i64 24
  %304 = bitcast i8* %303 to i32*
  %305 = load i32, i32* %304, align 8, !tbaa !42
  %306 = and i32 %305, -177
  %307 = or i32 %306, 32
  store i32 %307, i32* %304, align 8, !tbaa !43
  %308 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %291, i8* noundef nonnull getelementptr inbounds ([18 x i8], [18 x i8]* @.str.111, i64 0, i64 0), i64 noundef 17)
  %309 = load i8*, i8** %292, align 8, !tbaa !28
  %310 = getelementptr i8, i8* %309, i64 -24
  %311 = bitcast i8* %310 to i64*
  %312 = load i64, i64* %311, align 8
  %313 = getelementptr inbounds i8, i8* %297, i64 %312
  %314 = getelementptr inbounds i8, i8* %313, i64 16
  %315 = bitcast i8* %314 to i64*
  store i64 17, i64* %315, align 8, !tbaa !45
  %316 = load i64, i64* %311, align 8
  %317 = getelementptr inbounds i8, i8* %297, i64 %316
  %318 = getelementptr inbounds i8, i8* %317, i64 24
  %319 = bitcast i8* %318 to i32*
  %320 = load i32, i32* %319, align 8, !tbaa !42
  %321 = and i32 %320, -177
  %322 = or i32 %321, 32
  store i32 %322, i32* %319, align 8, !tbaa !43
  %323 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %291, i8* noundef nonnull getelementptr inbounds ([17 x i8], [17 x i8]* @.str.112, i64 0, i64 0), i64 noundef 16)
  %324 = load i8*, i8** %292, align 8, !tbaa !28
  %325 = getelementptr i8, i8* %324, i64 -24
  %326 = bitcast i8* %325 to i64*
  %327 = load i64, i64* %326, align 8
  %328 = getelementptr inbounds i8, i8* %297, i64 %327
  %329 = getelementptr inbounds i8, i8* %328, i64 16
  %330 = bitcast i8* %329 to i64*
  store i64 18, i64* %330, align 8, !tbaa !45
  %331 = load i64, i64* %326, align 8
  %332 = getelementptr inbounds i8, i8* %297, i64 %331
  %333 = getelementptr inbounds i8, i8* %332, i64 24
  %334 = bitcast i8* %333 to i32*
  %335 = load i32, i32* %334, align 8, !tbaa !42
  %336 = and i32 %335, -177
  %337 = or i32 %336, 32
  store i32 %337, i32* %334, align 8, !tbaa !43
  %338 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %291, i8* noundef nonnull getelementptr inbounds ([18 x i8], [18 x i8]* @.str.113, i64 0, i64 0), i64 noundef 17)
  %339 = load i8*, i8** %292, align 8, !tbaa !28
  %340 = getelementptr i8, i8* %339, i64 -24
  %341 = bitcast i8* %340 to i64*
  %342 = load i64, i64* %341, align 8
  %343 = getelementptr inbounds i8, i8* %297, i64 %342
  %344 = getelementptr inbounds i8, i8* %343, i64 16
  %345 = bitcast i8* %344 to i64*
  store i64 6, i64* %345, align 8, !tbaa !45
  %346 = load i64, i64* %341, align 8
  %347 = getelementptr inbounds i8, i8* %297, i64 %346
  %348 = getelementptr inbounds i8, i8* %347, i64 24
  %349 = bitcast i8* %348 to i32*
  %350 = load i32, i32* %349, align 8, !tbaa !42
  %351 = and i32 %350, -177
  %352 = or i32 %351, 32
  store i32 %352, i32* %349, align 8, !tbaa !43
  %353 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %291, i8* noundef nonnull getelementptr inbounds ([6 x i8], [6 x i8]* @.str.114, i64 0, i64 0), i64 noundef 5)
  %354 = load i8*, i8** %292, align 8, !tbaa !28
  %355 = getelementptr i8, i8* %354, i64 -24
  %356 = bitcast i8* %355 to i64*
  %357 = load i64, i64* %356, align 8
  %358 = getelementptr inbounds i8, i8* %297, i64 %357
  %359 = getelementptr inbounds i8, i8* %358, i64 16
  %360 = bitcast i8* %359 to i64*
  store i64 6, i64* %360, align 8, !tbaa !45
  %361 = load i64, i64* %356, align 8
  %362 = getelementptr inbounds i8, i8* %297, i64 %361
  %363 = getelementptr inbounds i8, i8* %362, i64 24
  %364 = bitcast i8* %363 to i32*
  %365 = load i32, i32* %364, align 8, !tbaa !42
  %366 = and i32 %365, -177
  %367 = or i32 %366, 32
  store i32 %367, i32* %364, align 8, !tbaa !43
  %368 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %291, i8* noundef nonnull getelementptr inbounds ([8 x i8], [8 x i8]* @.str.115, i64 0, i64 0), i64 noundef 7)
  %369 = load i8*, i8** %292, align 8, !tbaa !28
  %370 = getelementptr i8, i8* %369, i64 -24
  %371 = bitcast i8* %370 to i64*
  %372 = load i64, i64* %371, align 8
  %373 = getelementptr inbounds i8, i8* %297, i64 %372
  %374 = getelementptr inbounds i8, i8* %373, i64 240
  %375 = bitcast i8* %374 to %"class.std::ctype"**
  %376 = load %"class.std::ctype"*, %"class.std::ctype"** %375, align 8, !tbaa !30
  %377 = icmp eq %"class.std::ctype"* %376, null
  br i1 %377, label %378, label %379

378:                                              ; preds = %290
  tail call void @_ZSt16__throw_bad_castv() #5
  unreachable

379:                                              ; preds = %290
  %380 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %376, i64 0, i32 8
  %381 = load i8, i8* %380, align 8, !tbaa !33
  %382 = icmp eq i8 %381, 0
  br i1 %382, label %386, label %383

383:                                              ; preds = %379
  %384 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %376, i64 0, i32 9, i64 10
  %385 = load i8, i8* %384, align 1, !tbaa !35
  br label %392

386:                                              ; preds = %379
  tail call void @_ZNKSt5ctypeIcE13_M_widen_initEv(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %376)
  %387 = bitcast %"class.std::ctype"* %376 to i8 (%"class.std::ctype"*, i8)***
  %388 = load i8 (%"class.std::ctype"*, i8)**, i8 (%"class.std::ctype"*, i8)*** %387, align 8, !tbaa !28
  %389 = getelementptr inbounds i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %388, i64 6
  %390 = load i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %389, align 8
  %391 = tail call noundef signext i8 %390(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %376, i8 noundef signext 10)
  br label %392

392:                                              ; preds = %386, %383
  %393 = phi i8 [ %385, %383 ], [ %391, %386 ]
  %394 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo3putEc(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %291, i8 noundef signext %393)
  %395 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo5flushEv(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %394)
  %396 = bitcast %"class.std::basic_ostream"* %395 to i8**
  %397 = load i8*, i8** %396, align 8, !tbaa !28
  %398 = getelementptr i8, i8* %397, i64 -24
  %399 = bitcast i8* %398 to i64*
  %400 = load i64, i64* %399, align 8
  %401 = bitcast %"class.std::basic_ostream"* %395 to i8*
  %402 = getelementptr inbounds i8, i8* %401, i64 %400
  %403 = getelementptr inbounds i8, i8* %402, i64 24
  %404 = bitcast i8* %403 to i32*
  %405 = load i32, i32* %404, align 8, !tbaa !42
  %406 = and i32 %405, -177
  %407 = or i32 %406, 128
  store i32 %407, i32* %404, align 8, !tbaa !43
  %408 = load i64, i64* %399, align 8
  %409 = getelementptr inbounds i8, i8* %401, i64 %408
  %410 = getelementptr inbounds i8, i8* %409, i64 16
  %411 = bitcast i8* %410 to i64*
  store i64 6, i64* %411, align 8, !tbaa !45
  %412 = load i64, i64* %399, align 8
  %413 = getelementptr inbounds i8, i8* %401, i64 %412
  %414 = getelementptr inbounds i8, i8* %413, i64 8
  %415 = bitcast i8* %414 to i64*
  store i64 2, i64* %415, align 8, !tbaa !36
  %416 = load i64, i64* %399, align 8
  %417 = getelementptr inbounds i8, i8* %401, i64 %416
  %418 = getelementptr inbounds i8, i8* %417, i64 24
  %419 = bitcast i8* %418 to i32*
  %420 = load i32, i32* %419, align 8, !tbaa !42
  %421 = and i32 %420, -261
  %422 = or i32 %421, 4
  store i32 %422, i32* %419, align 8, !tbaa !43
  %423 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 13
  %424 = load i32, i32* %423, align 8, !tbaa !7
  %425 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %395, i32 noundef %424)
  %426 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %425, i8* noundef nonnull getelementptr inbounds ([2 x i8], [2 x i8]* @.str.103, i64 0, i64 0), i64 noundef 1)
  %427 = bitcast %"class.std::basic_ostream"* %425 to i8**
  %428 = load i8*, i8** %427, align 8, !tbaa !28
  %429 = getelementptr i8, i8* %428, i64 -24
  %430 = bitcast i8* %429 to i64*
  %431 = load i64, i64* %430, align 8
  %432 = bitcast %"class.std::basic_ostream"* %425 to i8*
  %433 = getelementptr inbounds i8, i8* %432, i64 %431
  %434 = getelementptr inbounds i8, i8* %433, i64 16
  %435 = bitcast i8* %434 to i64*
  store i64 6, i64* %435, align 8, !tbaa !45
  %436 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 14
  %437 = load i32, i32* %436, align 4, !tbaa !20
  %438 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %425, i32 noundef %437)
  %439 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %438, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.104, i64 0, i64 0), i64 noundef 2)
  %440 = bitcast %"class.std::basic_ostream"* %438 to i8**
  %441 = load i8*, i8** %440, align 8, !tbaa !28
  %442 = getelementptr i8, i8* %441, i64 -24
  %443 = bitcast i8* %442 to i64*
  %444 = load i64, i64* %443, align 8
  %445 = bitcast %"class.std::basic_ostream"* %438 to i8*
  %446 = getelementptr inbounds i8, i8* %445, i64 %444
  %447 = getelementptr inbounds i8, i8* %446, i64 16
  %448 = bitcast i8* %447 to i64*
  store i64 3, i64* %448, align 8, !tbaa !45
  %449 = load i32, i32* %423, align 8, !tbaa !7
  %450 = mul nsw i32 %449, 100
  %451 = load i32, i32* %436, align 4, !tbaa !20
  %452 = sdiv i32 %450, %451
  %453 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %438, i32 noundef %452)
  %454 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %453, i8* noundef nonnull getelementptr inbounds ([5 x i8], [5 x i8]* @.str.116, i64 0, i64 0), i64 noundef 4)
  %455 = bitcast %"class.std::basic_ostream"* %453 to i8**
  %456 = load i8*, i8** %455, align 8, !tbaa !28
  %457 = getelementptr i8, i8* %456, i64 -24
  %458 = bitcast i8* %457 to i64*
  %459 = load i64, i64* %458, align 8
  %460 = bitcast %"class.std::basic_ostream"* %453 to i8*
  %461 = getelementptr inbounds i8, i8* %460, i64 %459
  %462 = getelementptr inbounds i8, i8* %461, i64 16
  %463 = bitcast i8* %462 to i64*
  store i64 7, i64* %463, align 8, !tbaa !45
  %464 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 19
  %465 = load double, double* %464, align 8, !tbaa !49
  %466 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %453, double noundef %465)
  %467 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %466, i8* noundef nonnull getelementptr inbounds ([2 x i8], [2 x i8]* @.str.103, i64 0, i64 0), i64 noundef 1)
  %468 = bitcast %"class.std::basic_ostream"* %466 to i8**
  %469 = load i8*, i8** %468, align 8, !tbaa !28
  %470 = getelementptr i8, i8* %469, i64 -24
  %471 = bitcast i8* %470 to i64*
  %472 = load i64, i64* %471, align 8
  %473 = bitcast %"class.std::basic_ostream"* %466 to i8*
  %474 = getelementptr inbounds i8, i8* %473, i64 %472
  %475 = getelementptr inbounds i8, i8* %474, i64 16
  %476 = bitcast i8* %475 to i64*
  store i64 7, i64* %476, align 8, !tbaa !45
  %477 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 21
  %478 = load double, double* %477, align 8, !tbaa !50
  %479 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %466, double noundef %478)
  %480 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %479, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.117, i64 0, i64 0), i64 noundef 2)
  %481 = bitcast %"class.std::basic_ostream"* %479 to i8**
  %482 = load i8*, i8** %481, align 8, !tbaa !28
  %483 = getelementptr i8, i8* %482, i64 -24
  %484 = bitcast i8* %483 to i64*
  %485 = load i64, i64* %484, align 8
  %486 = bitcast %"class.std::basic_ostream"* %479 to i8*
  %487 = getelementptr inbounds i8, i8* %486, i64 %485
  %488 = getelementptr inbounds i8, i8* %487, i64 16
  %489 = bitcast i8* %488 to i64*
  store i64 8, i64* %489, align 8, !tbaa !45
  %490 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 25
  %491 = load double, double* %490, align 8, !tbaa !21
  %492 = fdiv double %491, 1.000000e+03
  %493 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %479, double noundef %492)
  %494 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %493, i8* noundef nonnull getelementptr inbounds ([2 x i8], [2 x i8]* @.str.103, i64 0, i64 0), i64 noundef 1)
  %495 = bitcast %"class.std::basic_ostream"* %493 to i8**
  %496 = load i8*, i8** %495, align 8, !tbaa !28
  %497 = getelementptr i8, i8* %496, i64 -24
  %498 = bitcast i8* %497 to i64*
  %499 = load i64, i64* %498, align 8
  %500 = bitcast %"class.std::basic_ostream"* %493 to i8*
  %501 = getelementptr inbounds i8, i8* %500, i64 %499
  %502 = getelementptr inbounds i8, i8* %501, i64 16
  %503 = bitcast i8* %502 to i64*
  store i64 7, i64* %503, align 8, !tbaa !45
  %504 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 27
  %505 = load double, double* %504, align 8, !tbaa !44
  %506 = fdiv double %505, 1.000000e+03
  %507 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %493, double noundef %506)
  %508 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %507, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.117, i64 0, i64 0), i64 noundef 2)
  %509 = bitcast %"class.std::basic_ostream"* %507 to i8**
  %510 = load i8*, i8** %509, align 8, !tbaa !28
  %511 = getelementptr i8, i8* %510, i64 -24
  %512 = bitcast i8* %511 to i64*
  %513 = load i64, i64* %512, align 8
  %514 = bitcast %"class.std::basic_ostream"* %507 to i8*
  %515 = getelementptr inbounds i8, i8* %514, i64 %513
  %516 = getelementptr inbounds i8, i8* %515, i64 16
  %517 = bitcast i8* %516 to i64*
  store i64 4, i64* %517, align 8, !tbaa !45
  %518 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 26
  %519 = load double, double* %518, align 8, !tbaa !22
  %520 = fptosi double %519 to i32
  %521 = sdiv i32 %520, 1000
  %522 = add nsw i32 %521, 1
  %523 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %507, i32 noundef %522)
  %524 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %523, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.117, i64 0, i64 0), i64 noundef 2)
  %525 = bitcast %"class.std::basic_ostream"* %523 to i8**
  %526 = load i8*, i8** %525, align 8, !tbaa !28
  %527 = getelementptr i8, i8* %526, i64 -24
  %528 = bitcast i8* %527 to i64*
  %529 = load i64, i64* %528, align 8
  %530 = bitcast %"class.std::basic_ostream"* %523 to i8*
  %531 = getelementptr inbounds i8, i8* %530, i64 %529
  %532 = getelementptr inbounds i8, i8* %531, i64 16
  %533 = bitcast i8* %532 to i64*
  store i64 6, i64* %533, align 8, !tbaa !45
  %534 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 15
  %535 = load i64, i64* %534, align 8, !tbaa !23
  %536 = uitofp i64 %535 to double
  %537 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 12
  %538 = load double, double* %537, align 8, !tbaa !24
  %539 = fmul double %538, %536
  %540 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 9, i32 0
  %541 = load i64, i64* %540, align 8, !tbaa.struct !25
  %542 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 9, i32 1
  %543 = load i64, i64* %542, align 8, !tbaa.struct !27
  %544 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 11, i32 0
  %545 = load i64, i64* %544, align 8, !tbaa.struct !25
  %546 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 11, i32 1
  %547 = load i64, i64* %546, align 8, !tbaa.struct !27
  %548 = sub nsw i64 %541, %545
  %549 = mul nsw i64 %548, 1000
  %550 = sub nsw i64 %543, %547
  %551 = sdiv i64 %550, 1000
  %552 = add nsw i64 %551, %549
  %553 = sitofp i64 %552 to double
  %554 = tail call double @llvm.maxnum.f64(double %553, double 1.000000e+00) #4
  %555 = fmul double %554, 1.000000e+03
  %556 = fdiv double %539, %555
  %557 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %523, double noundef %556)
  %558 = bitcast %"class.std::basic_ostream"* %557 to i8**
  %559 = load i8*, i8** %558, align 8, !tbaa !28
  %560 = getelementptr i8, i8* %559, i64 -24
  %561 = bitcast i8* %560 to i64*
  %562 = load i64, i64* %561, align 8
  %563 = bitcast %"class.std::basic_ostream"* %557 to i8*
  %564 = getelementptr inbounds i8, i8* %563, i64 %562
  %565 = getelementptr inbounds i8, i8* %564, i64 240
  %566 = bitcast i8* %565 to %"class.std::ctype"**
  %567 = load %"class.std::ctype"*, %"class.std::ctype"** %566, align 8, !tbaa !30
  %568 = icmp eq %"class.std::ctype"* %567, null
  br i1 %568, label %569, label %570

569:                                              ; preds = %392
  tail call void @_ZSt16__throw_bad_castv() #5
  unreachable

570:                                              ; preds = %392
  %571 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %567, i64 0, i32 8
  %572 = load i8, i8* %571, align 8, !tbaa !33
  %573 = icmp eq i8 %572, 0
  br i1 %573, label %577, label %574

574:                                              ; preds = %570
  %575 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %567, i64 0, i32 9, i64 10
  %576 = load i8, i8* %575, align 1, !tbaa !35
  br label %583

577:                                              ; preds = %570
  tail call void @_ZNKSt5ctypeIcE13_M_widen_initEv(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %567)
  %578 = bitcast %"class.std::ctype"* %567 to i8 (%"class.std::ctype"*, i8)***
  %579 = load i8 (%"class.std::ctype"*, i8)**, i8 (%"class.std::ctype"*, i8)*** %578, align 8, !tbaa !28
  %580 = getelementptr inbounds i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %579, i64 6
  %581 = load i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %580, align 8
  %582 = tail call noundef signext i8 %581(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %567, i8 noundef signext 10)
  br label %583

583:                                              ; preds = %577, %574
  %584 = phi i8 [ %576, %574 ], [ %582, %577 ]
  %585 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo3putEc(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %557, i8 noundef signext %584)
  br label %717

586:                                              ; preds = %2
  %587 = bitcast %"class.olb::util::Timer"* %0 to %"class.std::basic_ostream"*
  %588 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %587, i8* noundef nonnull getelementptr inbounds ([6 x i8], [6 x i8]* @.str.118, i64 0, i64 0), i64 noundef 5)
  %589 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 13
  %590 = load i32, i32* %589, align 8, !tbaa !7
  %591 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %587, i32 noundef %590)
  %592 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %591, i8* noundef nonnull getelementptr inbounds ([3 x i8], [3 x i8]* @.str.97, i64 0, i64 0), i64 noundef 2)
  %593 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %591, i8* noundef nonnull getelementptr inbounds ([7 x i8], [7 x i8]* @.str.101, i64 0, i64 0), i64 noundef 6)
  %594 = bitcast %"class.std::basic_ostream"* %591 to i8**
  %595 = load i8*, i8** %594, align 8, !tbaa !28
  %596 = getelementptr i8, i8* %595, i64 -24
  %597 = bitcast i8* %596 to i64*
  %598 = load i64, i64* %597, align 8
  %599 = bitcast %"class.std::basic_ostream"* %591 to i8*
  %600 = getelementptr inbounds i8, i8* %599, i64 %598
  %601 = getelementptr inbounds i8, i8* %600, i64 16
  %602 = bitcast i8* %601 to i64*
  store i64 8, i64* %602, align 8, !tbaa !45
  %603 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 15
  %604 = load i64, i64* %603, align 8, !tbaa !23
  %605 = uitofp i64 %604 to double
  %606 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 12
  %607 = load double, double* %606, align 8, !tbaa !24
  %608 = fmul double %607, %605
  %609 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 9, i32 0
  %610 = load i64, i64* %609, align 8, !tbaa.struct !25
  %611 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 9, i32 1
  %612 = load i64, i64* %611, align 8, !tbaa.struct !27
  %613 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 11, i32 0
  %614 = load i64, i64* %613, align 8, !tbaa.struct !25
  %615 = getelementptr inbounds %"class.olb::util::Timer", %"class.olb::util::Timer"* %0, i64 0, i32 11, i32 1
  %616 = load i64, i64* %615, align 8, !tbaa.struct !27
  %617 = sub nsw i64 %610, %614
  %618 = mul nsw i64 %617, 1000
  %619 = sub nsw i64 %612, %616
  %620 = sdiv i64 %619, 1000
  %621 = add nsw i64 %620, %618
  %622 = sitofp i64 %621 to double
  %623 = tail call double @llvm.maxnum.f64(double %622, double 1.000000e+00) #4
  %624 = fmul double %623, 1.000000e+03
  %625 = fdiv double %608, %624
  %626 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %591, double noundef %625)
  %627 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %626, i8* noundef nonnull getelementptr inbounds ([10 x i8], [10 x i8]* @.str.119, i64 0, i64 0), i64 noundef 9)
  %628 = bitcast %"class.std::basic_ostream"* %626 to i8**
  %629 = load i8*, i8** %628, align 8, !tbaa !28
  %630 = getelementptr i8, i8* %629, i64 -24
  %631 = bitcast i8* %630 to i64*
  %632 = load i64, i64* %631, align 8
  %633 = bitcast %"class.std::basic_ostream"* %626 to i8*
  %634 = getelementptr inbounds i8, i8* %633, i64 %632
  %635 = getelementptr inbounds i8, i8* %634, i64 16
  %636 = bitcast i8* %635 to i64*
  store i64 8, i64* %636, align 8, !tbaa !45
  %637 = load i64, i64* %603, align 8, !tbaa !23
  %638 = uitofp i64 %637 to double
  %639 = load double, double* %606, align 8, !tbaa !24
  %640 = fmul double %639, %638
  %641 = load i64, i64* %609, align 8, !tbaa.struct !25
  %642 = load i64, i64* %611, align 8, !tbaa.struct !27
  %643 = load i64, i64* %613, align 8, !tbaa.struct !25
  %644 = load i64, i64* %615, align 8, !tbaa.struct !27
  %645 = sub nsw i64 %641, %643
  %646 = mul nsw i64 %645, 1000
  %647 = sub nsw i64 %642, %644
  %648 = sdiv i64 %647, 1000
  %649 = add nsw i64 %648, %646
  %650 = sitofp i64 %649 to double
  %651 = tail call double @llvm.maxnum.f64(double %650, double 1.000000e+00) #4
  %652 = fmul double %651, 1.000000e+03
  %653 = fdiv double %640, %652
  %654 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo9_M_insertIdEERSoT_(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %626, double noundef %653)
  %655 = bitcast %"class.std::basic_ostream"* %654 to i8**
  %656 = load i8*, i8** %655, align 8, !tbaa !28
  %657 = getelementptr i8, i8* %656, i64 -24
  %658 = bitcast i8* %657 to i64*
  %659 = load i64, i64* %658, align 8
  %660 = bitcast %"class.std::basic_ostream"* %654 to i8*
  %661 = getelementptr inbounds i8, i8* %660, i64 %659
  %662 = getelementptr inbounds i8, i8* %661, i64 240
  %663 = bitcast i8* %662 to %"class.std::ctype"**
  %664 = load %"class.std::ctype"*, %"class.std::ctype"** %663, align 8, !tbaa !30
  %665 = icmp eq %"class.std::ctype"* %664, null
  br i1 %665, label %666, label %667

666:                                              ; preds = %586
  tail call void @_ZSt16__throw_bad_castv() #5
  unreachable

667:                                              ; preds = %586
  %668 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %664, i64 0, i32 8
  %669 = load i8, i8* %668, align 8, !tbaa !33
  %670 = icmp eq i8 %669, 0
  br i1 %670, label %674, label %671

671:                                              ; preds = %667
  %672 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %664, i64 0, i32 9, i64 10
  %673 = load i8, i8* %672, align 1, !tbaa !35
  br label %680

674:                                              ; preds = %667
  tail call void @_ZNKSt5ctypeIcE13_M_widen_initEv(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %664)
  %675 = bitcast %"class.std::ctype"* %664 to i8 (%"class.std::ctype"*, i8)***
  %676 = load i8 (%"class.std::ctype"*, i8)**, i8 (%"class.std::ctype"*, i8)*** %675, align 8, !tbaa !28
  %677 = getelementptr inbounds i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %676, i64 6
  %678 = load i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %677, align 8
  %679 = tail call noundef signext i8 %678(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %664, i8 noundef signext 10)
  br label %680

680:                                              ; preds = %674, %671
  %681 = phi i8 [ %673, %671 ], [ %679, %674 ]
  %682 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo3putEc(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %654, i8 noundef signext %681)
  br label %717

683:                                              ; preds = %2
  %684 = bitcast %"class.olb::util::Timer"* %0 to %"class.std::basic_ostream"*
  %685 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %684, i8* noundef nonnull getelementptr inbounds ([57 x i8], [57 x i8]* @.str.120, i64 0, i64 0), i64 noundef 56)
  %686 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %684, i32 noundef %1)
  %687 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %686, i8* noundef nonnull getelementptr inbounds ([11 x i8], [11 x i8]* @.str.121, i64 0, i64 0), i64 noundef 10)
  %688 = bitcast %"class.std::basic_ostream"* %686 to i8**
  %689 = load i8*, i8** %688, align 8, !tbaa !28
  %690 = getelementptr i8, i8* %689, i64 -24
  %691 = bitcast i8* %690 to i64*
  %692 = load i64, i64* %691, align 8
  %693 = bitcast %"class.std::basic_ostream"* %686 to i8*
  %694 = getelementptr inbounds i8, i8* %693, i64 %692
  %695 = getelementptr inbounds i8, i8* %694, i64 240
  %696 = bitcast i8* %695 to %"class.std::ctype"**
  %697 = load %"class.std::ctype"*, %"class.std::ctype"** %696, align 8, !tbaa !30
  %698 = icmp eq %"class.std::ctype"* %697, null
  br i1 %698, label %699, label %700

699:                                              ; preds = %683
  tail call void @_ZSt16__throw_bad_castv() #5
  unreachable

700:                                              ; preds = %683
  %701 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %697, i64 0, i32 8
  %702 = load i8, i8* %701, align 8, !tbaa !33
  %703 = icmp eq i8 %702, 0
  br i1 %703, label %707, label %704

704:                                              ; preds = %700
  %705 = getelementptr inbounds %"class.std::ctype", %"class.std::ctype"* %697, i64 0, i32 9, i64 10
  %706 = load i8, i8* %705, align 1, !tbaa !35
  br label %713

707:                                              ; preds = %700
  tail call void @_ZNKSt5ctypeIcE13_M_widen_initEv(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %697)
  %708 = bitcast %"class.std::ctype"* %697 to i8 (%"class.std::ctype"*, i8)***
  %709 = load i8 (%"class.std::ctype"*, i8)**, i8 (%"class.std::ctype"*, i8)*** %708, align 8, !tbaa !28
  %710 = getelementptr inbounds i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %709, i64 6
  %711 = load i8 (%"class.std::ctype"*, i8)*, i8 (%"class.std::ctype"*, i8)** %710, align 8
  %712 = tail call noundef signext i8 %711(%"class.std::ctype"* noundef nonnull align 8 dereferenceable(570) %697, i8 noundef signext 10)
  br label %713

713:                                              ; preds = %707, %704
  %714 = phi i8 [ %706, %704 ], [ %712, %707 ]
  %715 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo3putEc(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %686, i8 noundef signext %714)
  %716 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo5flushEv(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %715)
  br label %717

717:                                              ; preds = %713, %680, %583, %287, %82
  %718 = phi %"class.std::basic_ostream"* [ %716, %713 ], [ %682, %680 ], [ %585, %583 ], [ %289, %287 ], [ %84, %82 ]
  %719 = tail call noundef nonnull align 8 dereferenceable(8) %"class.std::basic_ostream"* @_ZNSo5flushEv(%"class.std::basic_ostream"* noundef nonnull align 8 dereferenceable(8) %718)
  ret void
}

attributes #0 = { "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cascadelake" "target-features"="+64bit,+adx,+aes,+avx,+avx2,+avx512bw,+avx512cd,+avx512dq,+avx512f,+avx512vl,+avx512vnni,+bmi,+bmi2,+clflushopt,+clwb,+cmov,+crc32,+cx16,+cx8,+f16c,+fma,+fsgsbase,+fxsr,+invpcid,+lzcnt,+mmx,+movbe,+pclmul,+pku,+popcnt,+prfchw,+rdrnd,+rdseed,+sahf,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave,+xsavec,+xsaveopt,+xsaves,-amx-bf16,-amx-int8,-amx-tile,-avx512bf16,-avx512bitalg,-avx512er,-avx512fp16,-avx512ifma,-avx512pf,-avx512vbmi,-avx512vbmi2,-avx512vp2intersect,-avx512vpopcntdq,-avxvnni,-cldemote,-clzero,-enqcmd,-fma4,-gfni,-hreset,-kl,-lwp,-movdir64b,-movdiri,-mwaitx,-pconfig,-prefetchwt1,-ptwrite,-rdpid,-rtm,-serialize,-sgx,-sha,-shstk,-sse4a,-tbm,-tsxldtrk,-uintr,-vaes,-vpclmulqdq,-waitpkg,-wbnoinvd,-widekl,-xop" "tune-cpu"="cascadelake" }
attributes #1 = { noreturn "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cascadelake" "target-features"="+64bit,+adx,+aes,+avx,+avx2,+avx512bw,+avx512cd,+avx512dq,+avx512f,+avx512vl,+avx512vnni,+bmi,+bmi2,+clflushopt,+clwb,+cmov,+crc32,+cx16,+cx8,+f16c,+fma,+fsgsbase,+fxsr,+invpcid,+lzcnt,+mmx,+movbe,+pclmul,+pku,+popcnt,+prfchw,+rdrnd,+rdseed,+sahf,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave,+xsavec,+xsaveopt,+xsaves,-amx-bf16,-amx-int8,-amx-tile,-avx512bf16,-avx512bitalg,-avx512er,-avx512fp16,-avx512ifma,-avx512pf,-avx512vbmi,-avx512vbmi2,-avx512vp2intersect,-avx512vpopcntdq,-avxvnni,-cldemote,-clzero,-enqcmd,-fma4,-gfni,-hreset,-kl,-lwp,-movdir64b,-movdiri,-mwaitx,-pconfig,-prefetchwt1,-ptwrite,-rdpid,-rtm,-serialize,-sgx,-sha,-shstk,-sse4a,-tbm,-tsxldtrk,-uintr,-vaes,-vpclmulqdq,-waitpkg,-wbnoinvd,-widekl,-xop" "tune-cpu"="cascadelake" }
attributes #2 = { nofree nosync nounwind readnone speculatable willreturn }
attributes #3 = { mustprogress uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cascadelake" "target-features"="+64bit,+adx,+aes,+avx,+avx2,+avx512bw,+avx512cd,+avx512dq,+avx512f,+avx512vl,+avx512vnni,+bmi,+bmi2,+clflushopt,+clwb,+cmov,+crc32,+cx16,+cx8,+f16c,+fma,+fsgsbase,+fxsr,+invpcid,+lzcnt,+mmx,+movbe,+pclmul,+pku,+popcnt,+prfchw,+rdrnd,+rdseed,+sahf,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave,+xsavec,+xsaveopt,+xsaves,-amx-bf16,-amx-int8,-amx-tile,-avx512bf16,-avx512bitalg,-avx512er,-avx512fp16,-avx512ifma,-avx512pf,-avx512vbmi,-avx512vbmi2,-avx512vp2intersect,-avx512vpopcntdq,-avxvnni,-cldemote,-clzero,-enqcmd,-fma4,-gfni,-hreset,-kl,-lwp,-movdir64b,-movdiri,-mwaitx,-pconfig,-prefetchwt1,-ptwrite,-rdpid,-rtm,-serialize,-sgx,-sha,-shstk,-sse4a,-tbm,-tsxldtrk,-uintr,-vaes,-vpclmulqdq,-waitpkg,-wbnoinvd,-widekl,-xop" "tune-cpu"="cascadelake" }
attributes #4 = { nounwind }
attributes #5 = { noreturn }

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

!0 = !{!"clang version 14.0.4 (git@github.com:llvm/llvm-project.git 29f1039a7285a5c3a9c353d054140bf2556d4c4d)"}
!1 = !{i32 1, !"wchar_size", i32 4}
!2 = !{i32 7, !"uwtable", i32 1}
!3 = !{i32 1, !"ThinLTO", i32 0}
!4 = !{i32 1, !"EnableSplitLTOUnit", i32 1}
!5 = !{i32 7, !"frame-pointer", i32 2}
!6 = !{i32 1, !"LTOPostLink", i32 1}
!7 = !{!8, !19, i64 544}
!8 = !{!"_ZTSN3olb4util5TimerIdEE", !9, i64 0, !17, i64 416, !17, i64 424, !17, i64 432, !16, i64 440, !16, i64 448, !16, i64 456, !11, i64 464, !18, i64 472, !18, i64 488, !18, i64 504, !18, i64 520, !17, i64 536, !19, i64 544, !19, i64 548, !16, i64 552, !19, i64 560, !19, i64 564, !19, i64 568, !17, i64 576, !17, i64 584, !17, i64 592, !17, i64 600, !17, i64 608, !17, i64 616, !17, i64 624, !17, i64 632, !17, i64 640}
!9 = !{!"_ZTSN3olb14OstreamManagerE", !10, i64 8}
!10 = !{!"_ZTSN3olb5OMBufE", !11, i64 104, !14, i64 112}
!11 = !{!"any pointer", !12, i64 0}
!12 = !{!"omnipotent char", !13, i64 0}
!13 = !{!"Simple C++ TBAA"}
!14 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !15, i64 0, !16, i64 8, !12, i64 16}
!15 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !11, i64 0}
!16 = !{!"long", !12, i64 0}
!17 = !{!"double", !12, i64 0}
!18 = !{!"_ZTS7timeval", !16, i64 0, !16, i64 8}
!19 = !{!"int", !12, i64 0}
!20 = !{!8, !19, i64 548}
!21 = !{!8, !17, i64 624}
!22 = !{!8, !17, i64 632}
!23 = !{!8, !16, i64 552}
!24 = !{!8, !17, i64 536}
!25 = !{i64 0, i64 8, !26, i64 8, i64 8, !26}
!26 = !{!16, !16, i64 0}
!27 = !{i64 0, i64 8, !26}
!28 = !{!29, !29, i64 0}
!29 = !{!"vtable pointer", !13, i64 0}
!30 = !{!31, !11, i64 240}
!31 = !{!"_ZTSSt9basic_iosIcSt11char_traitsIcEE", !11, i64 216, !12, i64 224, !32, i64 225, !11, i64 232, !11, i64 240, !11, i64 248, !11, i64 256}
!32 = !{!"bool", !12, i64 0}
!33 = !{!34, !12, i64 56}
!34 = !{!"_ZTSSt5ctypeIcE", !11, i64 16, !32, i64 24, !11, i64 32, !11, i64 40, !11, i64 48, !12, i64 56, !12, i64 57, !12, i64 313, !12, i64 569}
!35 = !{!12, !12, i64 0}
!36 = !{!37, !16, i64 8}
!37 = !{!"_ZTSSt8ios_base", !16, i64 8, !16, i64 16, !38, i64 24, !39, i64 28, !39, i64 32, !11, i64 40, !40, i64 48, !12, i64 64, !19, i64 192, !11, i64 200, !41, i64 208}
!38 = !{!"_ZTSSt13_Ios_Fmtflags", !12, i64 0}
!39 = !{!"_ZTSSt12_Ios_Iostate", !12, i64 0}
!40 = !{!"_ZTSNSt8ios_base6_WordsE", !11, i64 0, !16, i64 8}
!41 = !{!"_ZTSSt6locale", !11, i64 0}
!42 = !{!37, !38, i64 24}
!43 = !{!38, !38, i64 0}
!44 = !{!8, !17, i64 640}
!45 = !{!37, !16, i64 16}
!46 = !{!31, !32, i64 225}
!47 = !{i8 0, i8 2}
!48 = !{!31, !12, i64 224}
!49 = !{!8, !17, i64 576}
!50 = !{!8, !17, i64 592}
ZuseZ4 commented 2 years ago

Explorer: https://fwd.gymni.ch/kBC8Ut https://fwd.gymni.ch/gSWcwM https://fwd.gymni.ch/YCJsqv

ZuseZ4 commented 2 years ago

Minimized: https://fwd.gymni.ch/CiQ2l0

ZuseZ4 commented 2 years ago

https://fwd.gymni.ch/MWgfXW https://fwd.gymni.ch/CnTz25

ZuseZ4 commented 2 years ago

@wsmoses trying to get rid of the openLB types from this example here: https://fwd.gymni.ch/nmzV0u by directly passing i8 instead of %"class.olb::util::Timer" and bitcasting it to i8 and i8. Getting an illegal updateAnalysis issue.

Either way, smaller: https://fwd.gymni.ch/OVBQrT

ZuseZ4 commented 2 years ago

https://fwd.gymni.ch/drPuEj

; ModuleID = 'minOrBug.ll'
source_filename = "ld-temp.o"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"struct" = type { i32 }

declare dso_local void @__enzyme_autodiff(...)

define void @caller() {
entry:
  call void (...) @__enzyme_autodiff(i8* bitcast (void (i8*)* @g to i8*), metadata !"enzyme_dup",  i8* null, i8* null)
  ret void
}

define hidden void @g(i8* align 8 %arg) {
  %i1 = getelementptr inbounds i8, i8* %arg, i64 24
  %i2 = bitcast i8* %i1 to i32*
  %i3 = load i32, i32* %i2, align 8
  %i4 = or i32 %i3, 32
  store i32 %i4, i32* %i2, align 8
  ret void
}
ZuseZ4 commented 2 years ago

https://fwd.gymni.ch/74rdk9

; ModuleID = 'minOrBug.ll'
source_filename = "ld-temp.o"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

declare dso_local void @__enzyme_autodiff(...)

define void @caller() {
  call void (...) @__enzyme_autodiff(i8* bitcast (void (i32*)* @f to i8*), metadata !"enzyme_dup",  i32* null, i32* null)
  ret void
}

define hidden void @f(i32* align 8 %arg) {
  %i1 = load i32, i32* %arg, align 8
  %i2 = or i32 %i1, 32
  store i32 %i2, i32* %arg, align 8
  ret void
}
wsmoses commented 2 years ago
  %365 = load i32, i32* %364, align 8, !tbaa !42
  %366 = and i32 %365, -177
  %367 = or i32 %366, 32
  store i32 %367, i32* %364, align 8, !tbaa !43

!12 = !{!"omnipotent char", !13, i64 0}
!13 = !{!"Simple C++ TBAA"}

!16 = !{!"long", !12, i64 0}

!37 = !{!"_ZTSSt8ios_base", !16, i64 8, !16, i64 16, !38, i64 24, !39, i64 28, !39, i64 32, !11, i64 40, !40, i64 48, !12, i64 64, !19, i64 192, !11, i64 200, !41, i64 208}
!38 = !{!"_ZTSSt13_Ios_Fmtflags", !12, i64 0}

!42 = !{!37, !38, i64 24}
!43 = !{!38, !38, i64 0}

Relevant section above. The minimal cases have truely no information for which Enzyme can deduce that is an integer (which it appears to be), without TBAA or other info. The tbaa from the earlier case of relevance is posted above. It would be worth checking type analysis here to see what of the types exist and can be deduced as integral.

wsmoses commented 2 years ago

Minimized, but with the above info: https://fwd.gymni.ch/fZtSHY

ZuseZ4 commented 2 years ago

closed by #801