; LLVM IR from alekmaul/pvsneslib :: snes-examples/maps/mapscroll (mapscroll)

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

@sprTiles = external dso_local constant [4 x i8], align 1
@tileset = external global i8, align 1
@tilesetpal = external global i8, align 1
@tilesetend = external global i8, align 1
@gfxsprite = external global i8, align 1
@gfxsprite_end = external global i8, align 1
@palsprite = external global i8, align 1
@xloc = external dso_local global i16, align 2
@yloc = external dso_local global i16, align 2
@flipx = external dso_local global i16, align 2
@frame = external dso_local global i16, align 2
@frameidx = external dso_local global i16, align 2
@flip = external dso_local global i16, align 2
@mapmario = external global i8, align 1
@tilesetdef = external global i8, align 1
@tilesetatt = external global i8, align 1
@pad_keys = external global [5 x i16], align 2
@pad0 = external dso_local global i16, align 2
@x_pos = external global i16, align 2
@y_pos = external global i16, align 2

; Function Attrs: nounwind uwtable
define dso_local i32 @main() #0 {
  %1 = alloca i32, align 4
  store i32 0, ptr %1, align 4
  call void @bgInitTileSet(i8 noundef zeroext 0, ptr noundef @tileset, ptr noundef @tilesetpal, i8 noundef zeroext 0, i16 noundef zeroext trunc (i64 sub (i64 ptrtoint (ptr @tilesetend to i64), i64 ptrtoint (ptr @tileset to i64)) to i16), i16 noundef zeroext 32, i16 noundef zeroext 16, i16 noundef zeroext 8192)
  call void @bgSetMapPtr(i8 noundef zeroext 0, i16 noundef zeroext 26624, i8 noundef zeroext 1)
  call void @setMode(i8 noundef zeroext 1, i8 noundef zeroext 0)
  call void @bgSetDisable(i8 noundef zeroext 1)
  call void @bgSetDisable(i8 noundef zeroext 2)
  call void @oamInitGfxSet(ptr noundef @gfxsprite, i16 noundef zeroext trunc (i64 sub (i64 ptrtoint (ptr @gfxsprite_end to i64), i64 ptrtoint (ptr @gfxsprite to i64)) to i16), ptr noundef @palsprite, i16 noundef zeroext 16, i8 noundef zeroext 0, i16 noundef zeroext 0, i8 noundef zeroext 96)
  store i16 0, ptr @xloc, align 2, !tbaa !5
  store i16 192, ptr @yloc, align 2, !tbaa !5
  store i16 0, ptr @flipx, align 2, !tbaa !5
  store i16 0, ptr @frame, align 2, !tbaa !5
  store i16 0, ptr @frameidx, align 2, !tbaa !5
  store i16 0, ptr @flip, align 2, !tbaa !5
  %2 = load i16, ptr @xloc, align 2, !tbaa !5
  %3 = load i16, ptr @yloc, align 2, !tbaa !5
  call void @oamSet(i16 noundef zeroext 0, i16 noundef zeroext %2, i16 noundef zeroext %3, i8 noundef zeroext 0, i8 noundef zeroext 0, i8 noundef zeroext 0, i16 noundef zeroext 0, i8 noundef zeroext 0)
  call void @oamSetEx(i16 noundef zeroext 0, i8 noundef zeroext 0, i8 noundef zeroext 0)
  call void @oamSetVisible(i16 noundef zeroext 0, i8 noundef zeroext 0)
  call void @setScreenOn()
  call void @mapLoad(ptr noundef @mapmario, ptr noundef @tilesetdef, ptr noundef @tilesetatt)
  %4 = load i16, ptr @xloc, align 2, !tbaa !5
  %5 = load i16, ptr @yloc, align 2, !tbaa !5
  call void @mapUpdateCamera(i16 noundef zeroext %4, i16 noundef zeroext %5)
  br label %6

6:                                                ; preds = %73, %0
  %7 = load i16, ptr @pad_keys, align 2, !tbaa !5
  store i16 %7, ptr @pad0, align 2, !tbaa !5
  %8 = load i16, ptr @pad0, align 2, !tbaa !5
  %9 = icmp ne i16 %8, 0
  br i1 %9, label %10, label %73

10:                                               ; preds = %6
  %11 = load i16, ptr @pad0, align 2, !tbaa !5
  %12 = zext i16 %11 to i32
  %13 = and i32 %12, 512
  %14 = icmp ne i32 %13, 0
  br i1 %14, label %15, label %43

15:                                               ; preds = %10
  %16 = load i16, ptr @xloc, align 2, !tbaa !5
  %17 = icmp ne i16 %16, 0
  br i1 %17, label %18, label %21

18:                                               ; preds = %15
  %19 = load i16, ptr @xloc, align 2, !tbaa !5
  %20 = add i16 %19, -1
  store i16 %20, ptr @xloc, align 2, !tbaa !5
  br label %21

21:                                               ; preds = %18, %15
  store i16 1, ptr @flipx, align 2, !tbaa !5
  %22 = load i16, ptr @xloc, align 2, !tbaa !5
  %23 = load i16, ptr @yloc, align 2, !tbaa !5
  call void @mapUpdateCamera(i16 noundef zeroext %22, i16 noundef zeroext %23)
  %24 = load i16, ptr @flip, align 2, !tbaa !5
  %25 = add i16 %24, 1
  store i16 %25, ptr @flip, align 2, !tbaa !5
  %26 = load i16, ptr @flip, align 2, !tbaa !5
  %27 = zext i16 %26 to i32
  %28 = and i32 %27, 1
  %29 = icmp ne i32 %28, 0
  br i1 %29, label %30, label %42

30:                                               ; preds = %21
  %31 = load i16, ptr @frameidx, align 2, !tbaa !5
  %32 = add i16 %31, 1
  store i16 %32, ptr @frameidx, align 2, !tbaa !5
  %33 = load i16, ptr @frameidx, align 2, !tbaa !5
  %34 = zext i16 %33 to i32
  %35 = and i32 %34, 3
  %36 = trunc i32 %35 to i16
  store i16 %36, ptr @frameidx, align 2, !tbaa !5
  %37 = load i16, ptr @frameidx, align 2, !tbaa !5
  %38 = zext i16 %37 to i64
  %39 = getelementptr inbounds [4 x i8], ptr @sprTiles, i64 0, i64 %38
  %40 = load i8, ptr %39, align 1, !tbaa !9
  %41 = sext i8 %40 to i16
  store i16 %41, ptr @frame, align 2, !tbaa !5
  br label %42

42:                                               ; preds = %30, %21
  br label %43

43:                                               ; preds = %42, %10
  %44 = load i16, ptr @pad0, align 2, !tbaa !5
  %45 = zext i16 %44 to i32
  %46 = and i32 %45, 256
  %47 = icmp ne i32 %46, 0
  br i1 %47, label %48, label %72

48:                                               ; preds = %43
  %49 = load i16, ptr @xloc, align 2, !tbaa !5
  %50 = add i16 %49, 1
  store i16 %50, ptr @xloc, align 2, !tbaa !5
  store i16 0, ptr @flipx, align 2, !tbaa !5
  %51 = load i16, ptr @xloc, align 2, !tbaa !5
  %52 = load i16, ptr @yloc, align 2, !tbaa !5
  call void @mapUpdateCamera(i16 noundef zeroext %51, i16 noundef zeroext %52)
  %53 = load i16, ptr @flip, align 2, !tbaa !5
  %54 = add i16 %53, 1
  store i16 %54, ptr @flip, align 2, !tbaa !5
  %55 = load i16, ptr @flip, align 2, !tbaa !5
  %56 = zext i16 %55 to i32
  %57 = and i32 %56, 1
  %58 = icmp ne i32 %57, 0
  br i1 %58, label %59, label %71

59:                                               ; preds = %48
  %60 = load i16, ptr @frameidx, align 2, !tbaa !5
  %61 = add i16 %60, 1
  store i16 %61, ptr @frameidx, align 2, !tbaa !5
  %62 = load i16, ptr @frameidx, align 2, !tbaa !5
  %63 = zext i16 %62 to i32
  %64 = and i32 %63, 3
  %65 = trunc i32 %64 to i16
  store i16 %65, ptr @frameidx, align 2, !tbaa !5
  %66 = load i16, ptr @frameidx, align 2, !tbaa !5
  %67 = zext i16 %66 to i64
  %68 = getelementptr inbounds [4 x i8], ptr @sprTiles, i64 0, i64 %67
  %69 = load i8, ptr %68, align 1, !tbaa !9
  %70 = sext i8 %69 to i16
  store i16 %70, ptr @frame, align 2, !tbaa !5
  br label %71

71:                                               ; preds = %59, %48
  br label %72

72:                                               ; preds = %71, %43
  br label %73

73:                                               ; preds = %72, %6
  %74 = load i16, ptr @xloc, align 2, !tbaa !5
  %75 = zext i16 %74 to i32
  %76 = load i16, ptr @x_pos, align 2, !tbaa !5
  %77 = zext i16 %76 to i32
  %78 = sub nsw i32 %75, %77
  %79 = trunc i32 %78 to i16
  %80 = load i16, ptr @yloc, align 2, !tbaa !5
  %81 = zext i16 %80 to i32
  %82 = load i16, ptr @y_pos, align 2, !tbaa !5
  %83 = zext i16 %82 to i32
  %84 = sub nsw i32 %81, %83
  %85 = trunc i32 %84 to i16
  %86 = load i16, ptr @flipx, align 2, !tbaa !5
  %87 = trunc i16 %86 to i8
  %88 = load i16, ptr @frame, align 2, !tbaa !5
  call void @oamSet(i16 noundef zeroext 0, i16 noundef zeroext %79, i16 noundef zeroext %85, i8 noundef zeroext 3, i8 noundef zeroext %87, i8 noundef zeroext 0, i16 noundef zeroext %88, i8 noundef zeroext 0)
  call void @mapUpdate()
  call void @WaitForVBlank()
  call void @mapVblank()
  br label %6
}

declare void @bgInitTileSet(i8 noundef zeroext, ptr noundef, ptr noundef, i8 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext) #1

declare void @bgSetMapPtr(i8 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext) #1

declare void @setMode(i8 noundef zeroext, i8 noundef zeroext) #1

declare void @bgSetDisable(i8 noundef zeroext) #1

declare void @oamInitGfxSet(ptr noundef, i16 noundef zeroext, ptr noundef, i16 noundef zeroext, i8 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext) #1

declare void @oamSet(i16 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext, i8 noundef zeroext, i8 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext) #1

declare void @oamSetEx(i16 noundef zeroext, i8 noundef zeroext, i8 noundef zeroext) #1

declare void @oamSetVisible(i16 noundef zeroext, i8 noundef zeroext) #1

declare void @setScreenOn() #1

declare void @mapLoad(ptr noundef, ptr noundef, ptr noundef) #1

declare void @mapUpdateCamera(i16 noundef zeroext, i16 noundef zeroext) #1

declare void @mapUpdate() #1

declare void @WaitForVBlank() #1

declare void @mapVblank() #1

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

!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 = !{!"short", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!7, !7, i64 0}


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

@sprTiles = external dso_local local_unnamed_addr constant [4 x i8], align 1
@tileset = external global i8, align 1
@tilesetpal = external global i8, align 1
@tilesetend = external global i8, align 1
@gfxsprite = external global i8, align 1
@gfxsprite_end = external global i8, align 1
@palsprite = external global i8, align 1
@xloc = external dso_local local_unnamed_addr global i16, align 2
@yloc = external dso_local local_unnamed_addr global i16, align 2
@flipx = external dso_local local_unnamed_addr global i16, align 2
@frame = external dso_local local_unnamed_addr global i16, align 2
@frameidx = external dso_local local_unnamed_addr global i16, align 2
@flip = external dso_local local_unnamed_addr global i16, align 2
@mapmario = external global i8, align 1
@tilesetdef = external global i8, align 1
@tilesetatt = external global i8, align 1
@pad_keys = external local_unnamed_addr global [5 x i16], align 2
@pad0 = external dso_local local_unnamed_addr global i16, align 2
@x_pos = external local_unnamed_addr global i16, align 2
@y_pos = external local_unnamed_addr global i16, align 2

; Function Attrs: noreturn nounwind uwtable
define dso_local noundef i32 @main() local_unnamed_addr #0 {
  tail call void @bgInitTileSet(i8 noundef zeroext 0, ptr noundef nonnull @tileset, ptr noundef nonnull @tilesetpal, i8 noundef zeroext 0, i16 noundef zeroext trunc (i64 sub (i64 ptrtoint (ptr @tilesetend to i64), i64 ptrtoint (ptr @tileset to i64)) to i16), i16 noundef zeroext 32, i16 noundef zeroext 16, i16 noundef zeroext 8192) #2
  tail call void @bgSetMapPtr(i8 noundef zeroext 0, i16 noundef zeroext 26624, i8 noundef zeroext 1) #2
  tail call void @setMode(i8 noundef zeroext 1, i8 noundef zeroext 0) #2
  tail call void @bgSetDisable(i8 noundef zeroext 1) #2
  tail call void @bgSetDisable(i8 noundef zeroext 2) #2
  tail call void @oamInitGfxSet(ptr noundef nonnull @gfxsprite, i16 noundef zeroext trunc (i64 sub (i64 ptrtoint (ptr @gfxsprite_end to i64), i64 ptrtoint (ptr @gfxsprite to i64)) to i16), ptr noundef nonnull @palsprite, i16 noundef zeroext 16, i8 noundef zeroext 0, i16 noundef zeroext 0, i8 noundef zeroext 96) #2
  store i16 0, ptr @xloc, align 2, !tbaa !5
  store i16 192, ptr @yloc, align 2, !tbaa !5
  store i16 0, ptr @flipx, align 2, !tbaa !5
  store i16 0, ptr @frame, align 2, !tbaa !5
  store i16 0, ptr @frameidx, align 2, !tbaa !5
  store i16 0, ptr @flip, align 2, !tbaa !5
  tail call void @oamSet(i16 noundef zeroext 0, i16 noundef zeroext 0, i16 noundef zeroext 192, i8 noundef zeroext 0, i8 noundef zeroext 0, i8 noundef zeroext 0, i16 noundef zeroext 0, i8 noundef zeroext 0) #2
  tail call void @oamSetEx(i16 noundef zeroext 0, i8 noundef zeroext 0, i8 noundef zeroext 0) #2
  tail call void @oamSetVisible(i16 noundef zeroext 0, i8 noundef zeroext 0) #2
  tail call void @setScreenOn() #2
  tail call void @mapLoad(ptr noundef nonnull @mapmario, ptr noundef nonnull @tilesetdef, ptr noundef nonnull @tilesetatt) #2
  %1 = load i16, ptr @xloc, align 2, !tbaa !5
  %2 = load i16, ptr @yloc, align 2, !tbaa !5
  tail call void @mapUpdateCamera(i16 noundef zeroext %1, i16 noundef zeroext %2) #2
  br label %3

3:                                                ; preds = %43, %0
  %4 = load i16, ptr @pad_keys, align 2, !tbaa !5
  store i16 %4, ptr @pad0, align 2, !tbaa !5
  %.not = icmp eq i16 %4, 0
  br i1 %.not, label %43, label %5

5:                                                ; preds = %3
  %6 = and i16 %4, 512
  %.not2 = icmp eq i16 %6, 0
  br i1 %.not2, label %25, label %7

7:                                                ; preds = %5
  %8 = load i16, ptr @xloc, align 2, !tbaa !5
  %.not3 = icmp eq i16 %8, 0
  br i1 %.not3, label %11, label %9

9:                                                ; preds = %7
  %10 = add i16 %8, -1
  store i16 %10, ptr @xloc, align 2, !tbaa !5
  br label %11

11:                                               ; preds = %9, %7
  %12 = phi i16 [ %10, %9 ], [ 0, %7 ]
  store i16 1, ptr @flipx, align 2, !tbaa !5
  %13 = load i16, ptr @yloc, align 2, !tbaa !5
  tail call void @mapUpdateCamera(i16 noundef zeroext %12, i16 noundef zeroext %13) #2
  %14 = load i16, ptr @flip, align 2, !tbaa !5
  %15 = add i16 %14, 1
  store i16 %15, ptr @flip, align 2, !tbaa !5
  %16 = and i16 %14, 1
  %.not4.not = icmp eq i16 %16, 0
  br i1 %.not4.not, label %17, label %25

17:                                               ; preds = %11
  %18 = load i16, ptr @frameidx, align 2, !tbaa !5
  %19 = add i16 %18, 1
  %20 = and i16 %19, 3
  store i16 %20, ptr @frameidx, align 2, !tbaa !5
  %21 = zext nneg i16 %20 to i64
  %22 = getelementptr inbounds [4 x i8], ptr @sprTiles, i64 0, i64 %21
  %23 = load i8, ptr %22, align 1, !tbaa !9
  %24 = sext i8 %23 to i16
  store i16 %24, ptr @frame, align 2, !tbaa !5
  br label %25

25:                                               ; preds = %11, %17, %5
  %26 = load i16, ptr @pad0, align 2, !tbaa !5
  %27 = and i16 %26, 256
  %.not5 = icmp eq i16 %27, 0
  br i1 %.not5, label %43, label %28

28:                                               ; preds = %25
  %29 = load i16, ptr @xloc, align 2, !tbaa !5
  %30 = add i16 %29, 1
  store i16 %30, ptr @xloc, align 2, !tbaa !5
  store i16 0, ptr @flipx, align 2, !tbaa !5
  %31 = load i16, ptr @yloc, align 2, !tbaa !5
  tail call void @mapUpdateCamera(i16 noundef zeroext %30, i16 noundef zeroext %31) #2
  %32 = load i16, ptr @flip, align 2, !tbaa !5
  %33 = add i16 %32, 1
  store i16 %33, ptr @flip, align 2, !tbaa !5
  %34 = and i16 %32, 1
  %.not6.not = icmp eq i16 %34, 0
  br i1 %.not6.not, label %35, label %43

35:                                               ; preds = %28
  %36 = load i16, ptr @frameidx, align 2, !tbaa !5
  %37 = add i16 %36, 1
  %38 = and i16 %37, 3
  store i16 %38, ptr @frameidx, align 2, !tbaa !5
  %39 = zext nneg i16 %38 to i64
  %40 = getelementptr inbounds [4 x i8], ptr @sprTiles, i64 0, i64 %39
  %41 = load i8, ptr %40, align 1, !tbaa !9
  %42 = sext i8 %41 to i16
  store i16 %42, ptr @frame, align 2, !tbaa !5
  br label %43

43:                                               ; preds = %25, %35, %28, %3
  %44 = load i16, ptr @xloc, align 2, !tbaa !5
  %45 = load i16, ptr @x_pos, align 2, !tbaa !5
  %46 = sub i16 %44, %45
  %47 = load i16, ptr @yloc, align 2, !tbaa !5
  %48 = load i16, ptr @y_pos, align 2, !tbaa !5
  %49 = sub i16 %47, %48
  %50 = load i16, ptr @flipx, align 2, !tbaa !5
  %51 = trunc i16 %50 to i8
  %52 = load i16, ptr @frame, align 2, !tbaa !5
  tail call void @oamSet(i16 noundef zeroext 0, i16 noundef zeroext %46, i16 noundef zeroext %49, i8 noundef zeroext 3, i8 noundef zeroext %51, i8 noundef zeroext 0, i16 noundef zeroext %52, i8 noundef zeroext 0) #2
  tail call void @mapUpdate() #2
  tail call void @WaitForVBlank() #2
  tail call void @mapVblank() #2
  br label %3
}

declare void @bgInitTileSet(i8 noundef zeroext, ptr noundef, ptr noundef, i8 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext) local_unnamed_addr #1

declare void @bgSetMapPtr(i8 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext) local_unnamed_addr #1

declare void @setMode(i8 noundef zeroext, i8 noundef zeroext) local_unnamed_addr #1

declare void @bgSetDisable(i8 noundef zeroext) local_unnamed_addr #1

declare void @oamInitGfxSet(ptr noundef, i16 noundef zeroext, ptr noundef, i16 noundef zeroext, i8 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext) local_unnamed_addr #1

declare void @oamSet(i16 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext, i8 noundef zeroext, i8 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext) local_unnamed_addr #1

declare void @oamSetEx(i16 noundef zeroext, i8 noundef zeroext, i8 noundef zeroext) local_unnamed_addr #1

declare void @oamSetVisible(i16 noundef zeroext, i8 noundef zeroext) local_unnamed_addr #1

declare void @setScreenOn() local_unnamed_addr #1

declare void @mapLoad(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

declare void @mapUpdateCamera(i16 noundef zeroext, i16 noundef zeroext) local_unnamed_addr #1

declare void @mapUpdate() local_unnamed_addr #1

declare void @WaitForVBlank() local_unnamed_addr #1

declare void @mapVblank() local_unnamed_addr #1

attributes #0 = { noreturn 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 = { 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 = !{!"short", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!7, !7, i64 0}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InstCombinePass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass,TailCallElimPass