; LLVM IR from libxsmm/libxsmm :: src (libxsmm_gemm)

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

; 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: nounwind uwtable
declare dso_local void @libxsmm_gemm_batch_task(i32 noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #1

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_gemm_groups(i32 noundef %0, i32 noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7, ptr noundef %8, ptr noundef %9, ptr noundef %10, ptr noundef %11, ptr noundef %12, ptr noundef %13, ptr noundef %14, i32 noundef %15, ptr noundef %16, i32 noundef %17) #1 {
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca ptr, align 8
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca i32, align 4
  %35 = alloca ptr, align 8
  %36 = alloca i32, align 4
  %37 = alloca i8, align 1
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  %42 = alloca i32, align 4
  %43 = alloca i32, align 4
  %44 = alloca i32, align 4
  store i32 %0, ptr %19, align 4, !tbaa !5
  store i32 %1, ptr %20, align 4, !tbaa !5
  store ptr %2, ptr %21, align 8, !tbaa !9
  store ptr %3, ptr %22, align 8, !tbaa !9
  store ptr %4, ptr %23, align 8, !tbaa !9
  store ptr %5, ptr %24, align 8, !tbaa !9
  store ptr %6, ptr %25, align 8, !tbaa !9
  store ptr %7, ptr %26, align 8, !tbaa !9
  store ptr %8, ptr %27, align 8, !tbaa !9
  store ptr %9, ptr %28, align 8, !tbaa !9
  store ptr %10, ptr %29, align 8, !tbaa !9
  store ptr %11, ptr %30, align 8, !tbaa !9
  store ptr %12, ptr %31, align 8, !tbaa !9
  store ptr %13, ptr %32, align 8, !tbaa !9
  store ptr %14, ptr %33, align 8, !tbaa !9
  store i32 %15, ptr %34, align 4, !tbaa !5
  store ptr %16, ptr %35, align 8, !tbaa !9
  store i32 %17, ptr %36, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %37) #3
  %45 = load i32, ptr %20, align 4, !tbaa !5
  %46 = call zeroext i8 @libxsmm_typesize(i32 noundef %45)
  store i8 %46, ptr %37, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #3
  %47 = load ptr, ptr %26, align 8, !tbaa !9
  store ptr %47, ptr %38, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #3
  %48 = load ptr, ptr %31, align 8, !tbaa !9
  store ptr %48, ptr %39, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #3
  store i32 0, ptr %41, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #3
  %49 = load i32, ptr %34, align 4, !tbaa !5
  %50 = icmp sle i32 0, %49
  br i1 %50, label %51, label %53

51:                                               ; preds = %18
  %52 = load i32, ptr %34, align 4, !tbaa !5
  br label %56

53:                                               ; preds = %18
  %54 = load i32, ptr %34, align 4, !tbaa !5
  %55 = sub nsw i32 0, %54
  br label %56

56:                                               ; preds = %53, %51
  %57 = phi i32 [ %52, %51 ], [ %55, %53 ]
  store i32 %57, ptr %42, align 4, !tbaa !5
  store i32 0, ptr %40, align 4, !tbaa !5
  br label %58

58:                                               ; preds = %153, %56
  %59 = load i32, ptr %40, align 4, !tbaa !5
  %60 = load i32, ptr %42, align 4, !tbaa !5
  %61 = icmp slt i32 %59, %60
  br i1 %61, label %62, label %156

62:                                               ; preds = %58
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #3
  %63 = load ptr, ptr %35, align 8, !tbaa !9
  %64 = load i32, ptr %40, align 4, !tbaa !5
  %65 = sext i32 %64 to i64
  %66 = getelementptr inbounds i32, ptr %63, i64 %65
  %67 = load i32, ptr %66, align 4, !tbaa !5
  store i32 %67, ptr %43, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #3
  %68 = load i32, ptr %43, align 4, !tbaa !5
  %69 = icmp sle i32 0, %68
  br i1 %69, label %70, label %72

70:                                               ; preds = %62
  %71 = load i32, ptr %43, align 4, !tbaa !5
  br label %75

72:                                               ; preds = %62
  %73 = load i32, ptr %43, align 4, !tbaa !5
  %74 = sub nsw i32 0, %73
  br label %75

75:                                               ; preds = %72, %70
  %76 = phi i32 [ %71, %70 ], [ %74, %72 ]
  store i32 %76, ptr %44, align 4, !tbaa !5
  %77 = load i32, ptr %19, align 4, !tbaa !5
  %78 = load i32, ptr %20, align 4, !tbaa !5
  %79 = load ptr, ptr %21, align 8, !tbaa !9
  %80 = load i32, ptr %40, align 4, !tbaa !5
  %81 = sext i32 %80 to i64
  %82 = getelementptr inbounds i8, ptr %79, i64 %81
  %83 = load ptr, ptr %22, align 8, !tbaa !9
  %84 = load i32, ptr %40, align 4, !tbaa !5
  %85 = sext i32 %84 to i64
  %86 = getelementptr inbounds i8, ptr %83, i64 %85
  %87 = load ptr, ptr %23, align 8, !tbaa !9
  %88 = load i32, ptr %40, align 4, !tbaa !5
  %89 = sext i32 %88 to i64
  %90 = getelementptr inbounds i32, ptr %87, i64 %89
  %91 = load i32, ptr %90, align 4, !tbaa !5
  %92 = load ptr, ptr %24, align 8, !tbaa !9
  %93 = load i32, ptr %40, align 4, !tbaa !5
  %94 = sext i32 %93 to i64
  %95 = getelementptr inbounds i32, ptr %92, i64 %94
  %96 = load i32, ptr %95, align 4, !tbaa !5
  %97 = load ptr, ptr %25, align 8, !tbaa !9
  %98 = load i32, ptr %40, align 4, !tbaa !5
  %99 = sext i32 %98 to i64
  %100 = getelementptr inbounds i32, ptr %97, i64 %99
  %101 = load i32, ptr %100, align 4, !tbaa !5
  %102 = load ptr, ptr %38, align 8, !tbaa !9
  %103 = load i32, ptr %40, align 4, !tbaa !5
  %104 = load i8, ptr %37, align 1, !tbaa !11
  %105 = zext i8 %104 to i32
  %106 = mul nsw i32 %103, %105
  %107 = sext i32 %106 to i64
  %108 = getelementptr inbounds i8, ptr %102, i64 %107
  %109 = load ptr, ptr %27, align 8, !tbaa !9
  %110 = load i32, ptr %41, align 4, !tbaa !5
  %111 = sext i32 %110 to i64
  %112 = getelementptr inbounds ptr, ptr %109, i64 %111
  %113 = load ptr, ptr %28, align 8, !tbaa !9
  %114 = load i32, ptr %40, align 4, !tbaa !5
  %115 = sext i32 %114 to i64
  %116 = getelementptr inbounds i32, ptr %113, i64 %115
  %117 = load ptr, ptr %29, align 8, !tbaa !9
  %118 = load i32, ptr %41, align 4, !tbaa !5
  %119 = sext i32 %118 to i64
  %120 = getelementptr inbounds ptr, ptr %117, i64 %119
  %121 = load ptr, ptr %30, align 8, !tbaa !9
  %122 = load i32, ptr %40, align 4, !tbaa !5
  %123 = sext i32 %122 to i64
  %124 = getelementptr inbounds i32, ptr %121, i64 %123
  %125 = load ptr, ptr %39, align 8, !tbaa !9
  %126 = load i32, ptr %40, align 4, !tbaa !5
  %127 = load i8, ptr %37, align 1, !tbaa !11
  %128 = zext i8 %127 to i32
  %129 = mul nsw i32 %126, %128
  %130 = sext i32 %129 to i64
  %131 = getelementptr inbounds i8, ptr %125, i64 %130
  %132 = load ptr, ptr %32, align 8, !tbaa !9
  %133 = load i32, ptr %41, align 4, !tbaa !5
  %134 = sext i32 %133 to i64
  %135 = getelementptr inbounds ptr, ptr %132, i64 %134
  %136 = load ptr, ptr %33, align 8, !tbaa !9
  %137 = load i32, ptr %40, align 4, !tbaa !5
  %138 = sext i32 %137 to i64
  %139 = getelementptr inbounds i32, ptr %136, i64 %138
  %140 = load i32, ptr %34, align 4, !tbaa !5
  %141 = icmp slt i32 0, %140
  br i1 %141, label %142, label %144

142:                                              ; preds = %75
  %143 = load i32, ptr %43, align 4, !tbaa !5
  br label %147

144:                                              ; preds = %75
  %145 = load i32, ptr %44, align 4, !tbaa !5
  %146 = sub nsw i32 0, %145
  br label %147

147:                                              ; preds = %144, %142
  %148 = phi i32 [ %143, %142 ], [ %146, %144 ]
  %149 = load i32, ptr %36, align 4, !tbaa !5
  call void @libxsmm_gemm_batch_task(i32 noundef %77, i32 noundef %78, ptr noundef %82, ptr noundef %86, i32 noundef %91, i32 noundef %96, i32 noundef %101, ptr noundef %108, ptr noundef %112, ptr noundef %116, ptr noundef null, ptr noundef %120, ptr noundef %124, ptr noundef null, ptr noundef %131, ptr noundef %135, ptr noundef %139, ptr noundef null, i32 noundef 0, i32 noundef 0, i32 noundef %148, i32 noundef %149, i32 noundef 0, i32 noundef 1)
  %150 = load i32, ptr %44, align 4, !tbaa !5
  %151 = load i32, ptr %41, align 4, !tbaa !5
  %152 = add nsw i32 %151, %150
  store i32 %152, ptr %41, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #3
  br label %153

153:                                              ; preds = %147
  %154 = load i32, ptr %40, align 4, !tbaa !5
  %155 = add nsw i32 %154, 1
  store i32 %155, ptr %40, align 4, !tbaa !5
  br label %58, !llvm.loop !12

156:                                              ; preds = %58
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %37) #3
  ret void
}

declare zeroext i8 @libxsmm_typesize(i32 noundef) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 = { "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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = distinct !{!12, !13}
!13 = !{!"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"

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_gemm_batch_task(i32 noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_gemm_groups(i32 noundef %0, i32 noundef %1, ptr noundef %2, ptr noundef %3, ptr nocapture noundef readonly %4, ptr nocapture noundef readonly %5, ptr nocapture noundef readonly %6, ptr noundef %7, ptr noundef %8, ptr noundef %9, ptr noundef %10, ptr noundef %11, ptr noundef %12, ptr noundef %13, ptr noundef %14, i32 noundef %15, ptr nocapture noundef readonly %16, i32 noundef %17) local_unnamed_addr #0 {
  %19 = tail call zeroext i8 @libxsmm_typesize(i32 noundef %1) #3
  %20 = tail call i32 @llvm.abs.i32(i32 %15, i1 true)
  %.not = icmp eq i32 %15, 0
  br i1 %.not, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %18
  %21 = icmp sgt i32 %15, 0
  %22 = zext i8 %19 to i64
  br i1 %21, label %.lr.ph.split.us.preheader, label %.lr.ph.split.preheader

.lr.ph.split.preheader:                           ; preds = %.lr.ph
  %23 = zext nneg i32 %20 to i64
  br label %.lr.ph.split

.lr.ph.split.us.preheader:                        ; preds = %.lr.ph
  %wide.trip.count = zext nneg i32 %15 to i64
  br label %.lr.ph.split.us

.lr.ph.split.us:                                  ; preds = %.lr.ph.split.us.preheader, %.lr.ph.split.us
  %indvars.iv54 = phi i64 [ 0, %.lr.ph.split.us.preheader ], [ %indvars.iv.next55, %.lr.ph.split.us ]
  %.04950.us = phi i32 [ 0, %.lr.ph.split.us.preheader ], [ %45, %.lr.ph.split.us ]
  %24 = getelementptr inbounds i32, ptr %16, i64 %indvars.iv54
  %25 = load i32, ptr %24, align 4, !tbaa !5
  %26 = tail call i32 @llvm.abs.i32(i32 %25, i1 true)
  %27 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv54
  %28 = getelementptr inbounds i8, ptr %3, i64 %indvars.iv54
  %29 = getelementptr inbounds i32, ptr %4, i64 %indvars.iv54
  %30 = load i32, ptr %29, align 4, !tbaa !5
  %31 = getelementptr inbounds i32, ptr %5, i64 %indvars.iv54
  %32 = load i32, ptr %31, align 4, !tbaa !5
  %33 = getelementptr inbounds i32, ptr %6, i64 %indvars.iv54
  %34 = load i32, ptr %33, align 4, !tbaa !5
  %35 = mul nuw nsw i64 %indvars.iv54, %22
  %36 = getelementptr inbounds i8, ptr %7, i64 %35
  %37 = zext nneg i32 %.04950.us to i64
  %38 = getelementptr inbounds ptr, ptr %8, i64 %37
  %39 = getelementptr inbounds i32, ptr %9, i64 %indvars.iv54
  %40 = getelementptr inbounds ptr, ptr %10, i64 %37
  %41 = getelementptr inbounds i32, ptr %11, i64 %indvars.iv54
  %42 = getelementptr inbounds i8, ptr %12, i64 %35
  %43 = getelementptr inbounds ptr, ptr %13, i64 %37
  %44 = getelementptr inbounds i32, ptr %14, i64 %indvars.iv54
  tail call void @libxsmm_gemm_batch_task(i32 noundef %0, i32 noundef %1, ptr noundef %27, ptr noundef %28, i32 noundef %30, i32 noundef %32, i32 noundef %34, ptr noundef %36, ptr noundef %38, ptr noundef %39, ptr noundef null, ptr noundef %40, ptr noundef %41, ptr noundef null, ptr noundef %42, ptr noundef %43, ptr noundef %44, ptr noundef null, i32 noundef 0, i32 noundef 0, i32 noundef %25, i32 noundef %17, i32 noundef 0, i32 noundef 1)
  %45 = add nuw nsw i32 %26, %.04950.us
  %indvars.iv.next55 = add nuw nsw i64 %indvars.iv54, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next55, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph.split.us, !llvm.loop !9

.lr.ph.split:                                     ; preds = %.lr.ph.split.preheader, %.lr.ph.split
  %indvars.iv = phi i64 [ 0, %.lr.ph.split.preheader ], [ %indvars.iv.next, %.lr.ph.split ]
  %.04950 = phi i32 [ 0, %.lr.ph.split.preheader ], [ %68, %.lr.ph.split ]
  %46 = getelementptr inbounds i32, ptr %16, i64 %indvars.iv
  %47 = load i32, ptr %46, align 4, !tbaa !5
  %48 = tail call i32 @llvm.abs.i32(i32 %47, i1 true)
  %49 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv
  %50 = getelementptr inbounds i8, ptr %3, i64 %indvars.iv
  %51 = getelementptr inbounds i32, ptr %4, i64 %indvars.iv
  %52 = load i32, ptr %51, align 4, !tbaa !5
  %53 = getelementptr inbounds i32, ptr %5, i64 %indvars.iv
  %54 = load i32, ptr %53, align 4, !tbaa !5
  %55 = getelementptr inbounds i32, ptr %6, i64 %indvars.iv
  %56 = load i32, ptr %55, align 4, !tbaa !5
  %57 = mul nuw nsw i64 %indvars.iv, %22
  %58 = getelementptr inbounds i8, ptr %7, i64 %57
  %59 = zext nneg i32 %.04950 to i64
  %60 = getelementptr inbounds ptr, ptr %8, i64 %59
  %61 = getelementptr inbounds i32, ptr %9, i64 %indvars.iv
  %62 = getelementptr inbounds ptr, ptr %10, i64 %59
  %63 = getelementptr inbounds i32, ptr %11, i64 %indvars.iv
  %64 = getelementptr inbounds i8, ptr %12, i64 %57
  %65 = getelementptr inbounds ptr, ptr %13, i64 %59
  %66 = getelementptr inbounds i32, ptr %14, i64 %indvars.iv
  %67 = sub nsw i32 0, %48
  tail call void @libxsmm_gemm_batch_task(i32 noundef %0, i32 noundef %1, ptr noundef %49, ptr noundef %50, i32 noundef %52, i32 noundef %54, i32 noundef %56, ptr noundef %58, ptr noundef %60, ptr noundef %61, ptr noundef null, ptr noundef %62, ptr noundef %63, ptr noundef null, ptr noundef %64, ptr noundef %65, ptr noundef %66, ptr noundef null, i32 noundef 0, i32 noundef 0, i32 noundef %67, i32 noundef %17, i32 noundef 0, i32 noundef 1)
  %68 = add nuw nsw i32 %48, %.04950
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %69 = icmp ult i64 %indvars.iv.next, %23
  br i1 %69, label %.lr.ph.split, label %._crit_edge, !llvm.loop !9

._crit_edge:                                      ; preds = %.lr.ph.split, %.lr.ph.split.us, %18
  ret void
}

declare zeroext i8 @libxsmm_typesize(i32 noundef) local_unnamed_addr #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.abs.i32(i32, i1 immarg) #2

attributes #0 = { 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 = { "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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = distinct !{!9, !10}
!10 = !{!"llvm.loop.mustprogress"}


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