; LLVM IR from balintbalazs/B3D :: source/src/B3D_cudaCompress/profiler/profiler.ll (ZNK8Profiler6outputEi)

; 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.Profiler = type { [100 x %"struct.Profiler::sample"], %"class.std::set", i32, i32, i32, i32, i32, i64, i64, i32, i64, i64, i32, i64, i8, i64, i64, i64 }
%"struct.Profiler::sample" = type { i8, %"class.std::__cxx11::basic_string", i32, i32, i8, i64, i64, i64, i64, i64, i32, i32, i32, i32, i64 }
%"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] }
%"class.std::set" = type { %"class.std::_Rb_tree" }
%"class.std::_Rb_tree" = type { %"struct.std::_Rb_tree<IProfilerOutputHandler *, IProfilerOutputHandler *, std::_Identity<IProfilerOutputHandler *>, std::less<IProfilerOutputHandler *>>::_Rb_tree_impl" }
%"struct.std::_Rb_tree<IProfilerOutputHandler *, IProfilerOutputHandler *, std::_Identity<IProfilerOutputHandler *>, std::less<IProfilerOutputHandler *>>::_Rb_tree_impl" = type { [8 x i8], %"struct.std::_Rb_tree_header" }
%"struct.std::_Rb_tree_header" = type { %"struct.std::_Rb_tree_node_base", i64 }
%"struct.std::_Rb_tree_node_base" = type { i32, ptr, ptr, ptr }

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK8Profiler9getTimeMSEy(ptr noundef nonnull align 8 dereferenceable(12160), i64 noundef) #1 align 2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZNK8Profiler6outputEi(ptr noundef nonnull align 8 dereferenceable(12160) %0, i32 noundef %1) #2 align 2 {
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca float, align 4
  %7 = alloca i64, align 8
  %8 = alloca float, align 4
  %9 = alloca float, align 4
  %10 = alloca float, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  store i32 %1, ptr %4, align 4, !tbaa !9
  %11 = load ptr, ptr %3, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #3
  store i32 0, ptr %5, align 4, !tbaa !9
  br label %12

12:                                               ; preds = %106, %2
  %13 = load i32, ptr %5, align 4, !tbaa !9
  %14 = icmp ult i32 %13, 100
  br i1 %14, label %16, label %15

15:                                               ; preds = %12
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #3
  br label %109

16:                                               ; preds = %12
  %17 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %18 = load i32, ptr %5, align 4, !tbaa !9
  %19 = zext i32 %18 to i64
  %20 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %17, i64 0, i64 %19
  %21 = getelementptr inbounds %"struct.Profiler::sample", ptr %20, i32 0, i32 0
  %22 = load i8, ptr %21, align 8, !tbaa !11, !range !18, !noundef !19
  %23 = trunc i8 %22 to i1
  br i1 %23, label %24, label %105

24:                                               ; preds = %16
  %25 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %26 = load i32, ptr %5, align 4, !tbaa !9
  %27 = zext i32 %26 to i64
  %28 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %25, i64 0, i64 %27
  %29 = getelementptr inbounds %"struct.Profiler::sample", ptr %28, i32 0, i32 2
  %30 = load i32, ptr %29, align 8, !tbaa !20
  %31 = load i32, ptr %4, align 4, !tbaa !9
  %32 = icmp eq i32 %30, %31
  br i1 %32, label %33, label %105

33:                                               ; preds = %24
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #3
  %34 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %35 = load i32, ptr %5, align 4, !tbaa !9
  %36 = zext i32 %35 to i64
  %37 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %34, i64 0, i64 %36
  %38 = getelementptr inbounds %"struct.Profiler::sample", ptr %37, i32 0, i32 5
  %39 = load i64, ptr %38, align 8, !tbaa !21
  %40 = call noundef float @_ZNK8Profiler9getTimeMSEy(ptr noundef nonnull align 8 dereferenceable(12160) %11, i64 noundef %39)
  store float %40, ptr %6, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #3
  %41 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %42 = load i32, ptr %5, align 4, !tbaa !9
  %43 = zext i32 %42 to i64
  %44 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %41, i64 0, i64 %43
  %45 = getelementptr inbounds %"struct.Profiler::sample", ptr %44, i32 0, i32 5
  %46 = load i64, ptr %45, align 8, !tbaa !21
  %47 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %48 = load i32, ptr %5, align 4, !tbaa !9
  %49 = zext i32 %48 to i64
  %50 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %47, i64 0, i64 %49
  %51 = getelementptr inbounds %"struct.Profiler::sample", ptr %50, i32 0, i32 7
  %52 = load i64, ptr %51, align 8, !tbaa !24
  %53 = sub i64 %46, %52
  store i64 %53, ptr %7, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  %54 = load i64, ptr %7, align 8, !tbaa !25
  %55 = call noundef float @_ZNK8Profiler9getTimeMSEy(ptr noundef nonnull align 8 dereferenceable(12160) %11, i64 noundef %54)
  store float %55, ptr %8, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  %56 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %57 = load i32, ptr %5, align 4, !tbaa !9
  %58 = zext i32 %57 to i64
  %59 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %56, i64 0, i64 %58
  %60 = getelementptr inbounds %"struct.Profiler::sample", ptr %59, i32 0, i32 6
  %61 = load i64, ptr %60, align 8, !tbaa !26
  %62 = call noundef float @_ZNK8Profiler9getTimeMSEy(ptr noundef nonnull align 8 dereferenceable(12160) %11, i64 noundef %61)
  store float %62, ptr %9, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  %63 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %64 = load i32, ptr %5, align 4, !tbaa !9
  %65 = zext i32 %64 to i64
  %66 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %63, i64 0, i64 %65
  %67 = getelementptr inbounds %"struct.Profiler::sample", ptr %66, i32 0, i32 9
  %68 = load i64, ptr %67, align 8, !tbaa !27
  %69 = call noundef float @_ZNK8Profiler9getTimeMSEy(ptr noundef nonnull align 8 dereferenceable(12160) %11, i64 noundef %68)
  store float %69, ptr %10, align 4, !tbaa !22
  %70 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %71 = load i32, ptr %5, align 4, !tbaa !9
  %72 = zext i32 %71 to i64
  %73 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %70, i64 0, i64 %72
  %74 = getelementptr inbounds %"struct.Profiler::sample", ptr %73, i32 0, i32 1
  %75 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %76 = load i32, ptr %5, align 4, !tbaa !9
  %77 = zext i32 %76 to i64
  %78 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %75, i64 0, i64 %77
  %79 = getelementptr inbounds %"struct.Profiler::sample", ptr %78, i32 0, i32 3
  %80 = load i32, ptr %79, align 4, !tbaa !28
  %81 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %82 = load i32, ptr %5, align 4, !tbaa !9
  %83 = zext i32 %82 to i64
  %84 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %81, i64 0, i64 %83
  %85 = getelementptr inbounds %"struct.Profiler::sample", ptr %84, i32 0, i32 4
  %86 = load i8, ptr %85, align 8, !tbaa !29, !range !18, !noundef !19
  %87 = trunc i8 %86 to i1
  %88 = load float, ptr %6, align 4, !tbaa !22
  %89 = load float, ptr %9, align 4, !tbaa !22
  %90 = load float, ptr %10, align 4, !tbaa !22
  %91 = load float, ptr %8, align 4, !tbaa !22
  %92 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %93 = load i32, ptr %5, align 4, !tbaa !9
  %94 = zext i32 %93 to i64
  %95 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %92, i64 0, i64 %94
  %96 = getelementptr inbounds %"struct.Profiler::sample", ptr %95, i32 0, i32 10
  %97 = load i32, ptr %96, align 8, !tbaa !30
  %98 = getelementptr inbounds %class.Profiler, ptr %11, i32 0, i32 0
  %99 = load i32, ptr %5, align 4, !tbaa !9
  %100 = zext i32 %99 to i64
  %101 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %98, i64 0, i64 %100
  %102 = getelementptr inbounds %"struct.Profiler::sample", ptr %101, i32 0, i32 12
  %103 = load i32, ptr %102, align 8, !tbaa !31
  call void @_ZNK8Profiler9putSampleERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbffffjj(ptr noundef nonnull align 8 dereferenceable(12160) %11, ptr noundef nonnull align 8 dereferenceable(32) %74, i32 noundef %80, i1 noundef zeroext %87, float noundef %88, float noundef %89, float noundef %90, float noundef %91, i32 noundef %97, i32 noundef %103)
  %104 = load i32, ptr %5, align 4, !tbaa !9
  call void @_ZNK8Profiler6outputEi(ptr noundef nonnull align 8 dereferenceable(12160) %11, i32 noundef %104)
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #3
  br label %105

105:                                              ; preds = %33, %24, %16
  br label %106

106:                                              ; preds = %105
  %107 = load i32, ptr %5, align 4, !tbaa !9
  %108 = add i32 %107, 1
  store i32 %108, ptr %5, align 4, !tbaa !9
  br label %12, !llvm.loop !32

109:                                              ; preds = %15
  ret void
}

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK8Profiler9putSampleERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbffffjj(ptr noundef nonnull align 8 dereferenceable(12160), ptr noundef nonnull align 8 dereferenceable(32), i32 noundef, i1 noundef zeroext, float noundef, float noundef, float noundef, float noundef, i32 noundef, i32 noundef) #2 align 2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { 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 #3 = { nounwind }

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

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


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"struct.Profiler::sample" = type { i8, %"class.std::__cxx11::basic_string", i32, i32, i8, i64, i64, i64, i64, i64, i32, i32, i32, i32, i64 }
%"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] }

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK8Profiler9getTimeMSEy(ptr noundef nonnull align 8 dereferenceable(12160), i64 noundef) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZNK8Profiler6outputEi(ptr noundef nonnull align 8 dereferenceable(12160) %0, i32 noundef %1) local_unnamed_addr #1 align 2 {
  br label %4

3:                                                ; preds = %38
  ret void

4:                                                ; preds = %2, %38
  %indvars.iv = phi i64 [ 0, %2 ], [ %indvars.iv.next, %38 ]
  %5 = getelementptr inbounds [100 x %"struct.Profiler::sample"], ptr %0, i64 0, i64 %indvars.iv
  %6 = load i8, ptr %5, align 8, !tbaa !5, !range !16, !noundef !17
  %7 = trunc nuw i8 %6 to i1
  br i1 %7, label %8, label %38

8:                                                ; preds = %4
  %9 = getelementptr inbounds i8, ptr %5, i64 40
  %10 = load i32, ptr %9, align 8, !tbaa !18
  %11 = icmp eq i32 %10, %1
  br i1 %11, label %12, label %38

12:                                               ; preds = %8
  %13 = getelementptr inbounds i8, ptr %5, i64 56
  %14 = load i64, ptr %13, align 8, !tbaa !19
  %15 = tail call noundef float @_ZNK8Profiler9getTimeMSEy(ptr noundef nonnull align 8 dereferenceable(12160) %0, i64 noundef %14)
  %16 = load i64, ptr %13, align 8, !tbaa !19
  %17 = getelementptr inbounds i8, ptr %5, i64 72
  %18 = load i64, ptr %17, align 8, !tbaa !20
  %19 = sub i64 %16, %18
  %20 = tail call noundef float @_ZNK8Profiler9getTimeMSEy(ptr noundef nonnull align 8 dereferenceable(12160) %0, i64 noundef %19)
  %21 = getelementptr inbounds i8, ptr %5, i64 64
  %22 = load i64, ptr %21, align 8, !tbaa !21
  %23 = tail call noundef float @_ZNK8Profiler9getTimeMSEy(ptr noundef nonnull align 8 dereferenceable(12160) %0, i64 noundef %22)
  %24 = getelementptr inbounds i8, ptr %5, i64 88
  %25 = load i64, ptr %24, align 8, !tbaa !22
  %26 = tail call noundef float @_ZNK8Profiler9getTimeMSEy(ptr noundef nonnull align 8 dereferenceable(12160) %0, i64 noundef %25)
  %27 = getelementptr inbounds i8, ptr %5, i64 8
  %28 = getelementptr inbounds i8, ptr %5, i64 44
  %29 = load i32, ptr %28, align 4, !tbaa !23
  %30 = getelementptr inbounds i8, ptr %5, i64 48
  %31 = load i8, ptr %30, align 8, !tbaa !24, !range !16, !noundef !17
  %32 = trunc nuw i8 %31 to i1
  %33 = getelementptr inbounds i8, ptr %5, i64 96
  %34 = load i32, ptr %33, align 8, !tbaa !25
  %35 = getelementptr inbounds i8, ptr %5, i64 104
  %36 = load i32, ptr %35, align 8, !tbaa !26
  tail call void @_ZNK8Profiler9putSampleERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbffffjj(ptr noundef nonnull align 8 dereferenceable(12160) %0, ptr noundef nonnull align 8 dereferenceable(32) %27, i32 noundef %29, i1 noundef zeroext %32, float noundef %15, float noundef %23, float noundef %26, float noundef %20, i32 noundef %34, i32 noundef %36)
  %37 = trunc nuw nsw i64 %indvars.iv to i32
  tail call void @_ZNK8Profiler6outputEi(ptr noundef nonnull align 8 dereferenceable(12160) %0, i32 noundef %37)
  br label %38

38:                                               ; preds = %4, %8, %12
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, 100
  br i1 %exitcond.not, label %3, label %4, !llvm.loop !27
}

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK8Profiler9putSampleERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbffffjj(ptr noundef nonnull align 8 dereferenceable(12160), ptr noundef nonnull align 8 dereferenceable(32), i32 noundef, i1 noundef zeroext, float noundef, float noundef, float noundef, float noundef, i32 noundef, i32 noundef) local_unnamed_addr #1 align 2

attributes #0 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { 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" }

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

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


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,LoopRotatePass,SROAPass,SimplifyCFGPass,TailCallElimPass