; LLVM IR from hanzohasashi33/Competetive_programming :: Snippets/DSA_PROBLEMS (multiply_2_big_integers)

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

@.str = external hidden unnamed_addr constant [18 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [3 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local i32 @main() #0 {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca ptr, align 8
  %4 = alloca i64, align 8
  %5 = alloca i64, align 8
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  store i32 0, ptr %1, align 4
  call void @llvm.lifetime.start.p0(i64 4, ptr %2) #5
  store i32 1000000, ptr %2, align 4, !tbaa !5
  %20 = load i32, ptr %2, align 4, !tbaa !5
  %21 = zext i32 %20 to i64
  %22 = call ptr @llvm.stacksave.p0()
  store ptr %22, ptr %3, align 8
  %23 = alloca i8, i64 %21, align 16
  store i64 %21, ptr %4, align 8
  %24 = load i32, ptr %2, align 4, !tbaa !5
  %25 = zext i32 %24 to i64
  %26 = alloca i8, i64 %25, align 16
  store i64 %25, ptr %5, align 8
  %27 = load i32, ptr %2, align 4, !tbaa !5
  %28 = zext i32 %27 to i64
  %29 = alloca i8, i64 %28, align 16
  store i64 %28, ptr %6, align 8
  %30 = load i32, ptr %2, align 4, !tbaa !5
  %31 = zext i32 %30 to i64
  %32 = alloca i8, i64 %31, align 16
  store i64 %31, ptr %7, align 8
  %33 = load i32, ptr %2, align 4, !tbaa !5
  %34 = mul nsw i32 2, %33
  %35 = zext i32 %34 to i64
  %36 = alloca i8, i64 %35, align 16
  store i64 %35, ptr %8, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #5
  store i32 0, ptr %9, align 4, !tbaa !5
  %37 = call i32 (ptr, ...) @printf(ptr noundef @.str)
  %38 = call i32 (ptr, ...) @__isoc99_scanf(ptr noundef @.str.1, ptr noundef %29)
  %39 = call i32 (ptr, ...) @printf(ptr noundef @.str.2)
  %40 = call i32 (ptr, ...) @__isoc99_scanf(ptr noundef @.str.1, ptr noundef %32)
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #5
  %41 = call i64 @strlen(ptr noundef %29) #6
  %42 = trunc i64 %41 to i32
  store i32 %42, ptr %10, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #5
  %43 = call i64 @strlen(ptr noundef %32) #6
  %44 = trunc i64 %43 to i32
  store i32 %44, ptr %11, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #5
  %45 = load i32, ptr %10, align 4, !tbaa !5
  %46 = sub nsw i32 %45, 1
  store i32 %46, ptr %13, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %47

47:                                               ; preds = %62, %0
  %48 = load i32, ptr %13, align 4, !tbaa !5
  %49 = icmp sge i32 %48, 0
  br i1 %49, label %51, label %50

50:                                               ; preds = %47
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #5
  br label %67

51:                                               ; preds = %47
  %52 = load i32, ptr %13, align 4, !tbaa !5
  %53 = sext i32 %52 to i64
  %54 = getelementptr inbounds i8, ptr %29, i64 %53
  %55 = load i8, ptr %54, align 1, !tbaa !9
  %56 = sext i8 %55 to i32
  %57 = sub nsw i32 %56, 48
  %58 = trunc i32 %57 to i8
  %59 = load i32, ptr %14, align 4, !tbaa !5
  %60 = sext i32 %59 to i64
  %61 = getelementptr inbounds i8, ptr %23, i64 %60
  store i8 %58, ptr %61, align 1, !tbaa !9
  br label %62

62:                                               ; preds = %51
  %63 = load i32, ptr %13, align 4, !tbaa !5
  %64 = add nsw i32 %63, -1
  store i32 %64, ptr %13, align 4, !tbaa !5
  %65 = load i32, ptr %14, align 4, !tbaa !5
  %66 = add nsw i32 %65, 1
  store i32 %66, ptr %14, align 4, !tbaa !5
  br label %47, !llvm.loop !10

67:                                               ; preds = %50
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #5
  %68 = load i32, ptr %11, align 4, !tbaa !5
  %69 = sub nsw i32 %68, 1
  store i32 %69, ptr %15, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #5
  store i32 0, ptr %16, align 4, !tbaa !5
  br label %70

70:                                               ; preds = %85, %67
  %71 = load i32, ptr %15, align 4, !tbaa !5
  %72 = icmp sge i32 %71, 0
  br i1 %72, label %74, label %73

73:                                               ; preds = %70
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #5
  br label %90

74:                                               ; preds = %70
  %75 = load i32, ptr %15, align 4, !tbaa !5
  %76 = sext i32 %75 to i64
  %77 = getelementptr inbounds i8, ptr %32, i64 %76
  %78 = load i8, ptr %77, align 1, !tbaa !9
  %79 = sext i8 %78 to i32
  %80 = sub nsw i32 %79, 48
  %81 = trunc i32 %80 to i8
  %82 = load i32, ptr %16, align 4, !tbaa !5
  %83 = sext i32 %82 to i64
  %84 = getelementptr inbounds i8, ptr %26, i64 %83
  store i8 %81, ptr %84, align 1, !tbaa !9
  br label %85

85:                                               ; preds = %74
  %86 = load i32, ptr %15, align 4, !tbaa !5
  %87 = add nsw i32 %86, -1
  store i32 %87, ptr %15, align 4, !tbaa !5
  %88 = load i32, ptr %16, align 4, !tbaa !5
  %89 = add nsw i32 %88, 1
  store i32 %89, ptr %16, align 4, !tbaa !5
  br label %70, !llvm.loop !12

90:                                               ; preds = %73
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #5
  store i32 0, ptr %17, align 4, !tbaa !5
  br label %91

91:                                               ; preds = %126, %90
  %92 = load i32, ptr %17, align 4, !tbaa !5
  %93 = load i32, ptr %11, align 4, !tbaa !5
  %94 = icmp slt i32 %92, %93
  br i1 %94, label %96, label %95

95:                                               ; preds = %91
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #5
  br label %129

96:                                               ; preds = %91
  store i32 0, ptr %12, align 4, !tbaa !5
  br label %97

97:                                               ; preds = %122, %96
  %98 = load i32, ptr %12, align 4, !tbaa !5
  %99 = load i32, ptr %10, align 4, !tbaa !5
  %100 = icmp slt i32 %98, %99
  br i1 %100, label %101, label %125

101:                                              ; preds = %97
  %102 = load i32, ptr %17, align 4, !tbaa !5
  %103 = sext i32 %102 to i64
  %104 = getelementptr inbounds i8, ptr %26, i64 %103
  %105 = load i8, ptr %104, align 1, !tbaa !9
  %106 = sext i8 %105 to i32
  %107 = load i32, ptr %12, align 4, !tbaa !5
  %108 = sext i32 %107 to i64
  %109 = getelementptr inbounds i8, ptr %23, i64 %108
  %110 = load i8, ptr %109, align 1, !tbaa !9
  %111 = sext i8 %110 to i32
  %112 = mul nsw i32 %106, %111
  %113 = load i32, ptr %17, align 4, !tbaa !5
  %114 = load i32, ptr %12, align 4, !tbaa !5
  %115 = add nsw i32 %113, %114
  %116 = sext i32 %115 to i64
  %117 = getelementptr inbounds i8, ptr %36, i64 %116
  %118 = load i8, ptr %117, align 1, !tbaa !9
  %119 = sext i8 %118 to i32
  %120 = add nsw i32 %119, %112
  %121 = trunc i32 %120 to i8
  store i8 %121, ptr %117, align 1, !tbaa !9
  br label %122

122:                                              ; preds = %101
  %123 = load i32, ptr %12, align 4, !tbaa !5
  %124 = add nsw i32 %123, 1
  store i32 %124, ptr %12, align 4, !tbaa !5
  br label %97, !llvm.loop !13

125:                                              ; preds = %97
  br label %126

126:                                              ; preds = %125
  %127 = load i32, ptr %17, align 4, !tbaa !5
  %128 = add nsw i32 %127, 1
  store i32 %128, ptr %17, align 4, !tbaa !5
  br label %91, !llvm.loop !14

129:                                              ; preds = %95
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #5
  store i32 0, ptr %18, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #5
  store i32 0, ptr %19, align 4, !tbaa !5
  br label %130

130:                                              ; preds = %163, %129
  %131 = load i32, ptr %19, align 4, !tbaa !5
  %132 = load i32, ptr %10, align 4, !tbaa !5
  %133 = load i32, ptr %11, align 4, !tbaa !5
  %134 = add nsw i32 %132, %133
  %135 = icmp slt i32 %131, %134
  br i1 %135, label %137, label %136

136:                                              ; preds = %130
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #5
  br label %166

137:                                              ; preds = %130
  %138 = load i32, ptr %19, align 4, !tbaa !5
  %139 = sext i32 %138 to i64
  %140 = getelementptr inbounds i8, ptr %36, i64 %139
  %141 = load i8, ptr %140, align 1, !tbaa !9
  %142 = sext i8 %141 to i32
  %143 = sdiv i32 %142, 10
  store i32 %143, ptr %18, align 4, !tbaa !5
  %144 = load i32, ptr %19, align 4, !tbaa !5
  %145 = sext i32 %144 to i64
  %146 = getelementptr inbounds i8, ptr %36, i64 %145
  %147 = load i8, ptr %146, align 1, !tbaa !9
  %148 = sext i8 %147 to i32
  %149 = srem i32 %148, 10
  %150 = trunc i32 %149 to i8
  %151 = load i32, ptr %19, align 4, !tbaa !5
  %152 = sext i32 %151 to i64
  %153 = getelementptr inbounds i8, ptr %36, i64 %152
  store i8 %150, ptr %153, align 1, !tbaa !9
  %154 = load i32, ptr %18, align 4, !tbaa !5
  %155 = load i32, ptr %19, align 4, !tbaa !5
  %156 = add nsw i32 %155, 1
  %157 = sext i32 %156 to i64
  %158 = getelementptr inbounds i8, ptr %36, i64 %157
  %159 = load i8, ptr %158, align 1, !tbaa !9
  %160 = sext i8 %159 to i32
  %161 = add nsw i32 %160, %154
  %162 = trunc i32 %161 to i8
  store i8 %162, ptr %158, align 1, !tbaa !9
  br label %163

163:                                              ; preds = %137
  %164 = load i32, ptr %19, align 4, !tbaa !5
  %165 = add nsw i32 %164, 1
  store i32 %165, ptr %19, align 4, !tbaa !5
  br label %130, !llvm.loop !15

166:                                              ; preds = %136
  %167 = load i32, ptr %10, align 4, !tbaa !5
  %168 = load i32, ptr %11, align 4, !tbaa !5
  %169 = add nsw i32 %167, %168
  store i32 %169, ptr %9, align 4, !tbaa !5
  br label %170

170:                                              ; preds = %182, %166
  %171 = load i32, ptr %9, align 4, !tbaa !5
  %172 = icmp sge i32 %171, 0
  br i1 %172, label %173, label %185

173:                                              ; preds = %170
  %174 = load i32, ptr %9, align 4, !tbaa !5
  %175 = sext i32 %174 to i64
  %176 = getelementptr inbounds i8, ptr %36, i64 %175
  %177 = load i8, ptr %176, align 1, !tbaa !9
  %178 = sext i8 %177 to i32
  %179 = icmp sgt i32 %178, 0
  br i1 %179, label %180, label %181

180:                                              ; preds = %173
  br label %185

181:                                              ; preds = %173
  br label %182

182:                                              ; preds = %181
  %183 = load i32, ptr %9, align 4, !tbaa !5
  %184 = add nsw i32 %183, -1
  store i32 %184, ptr %9, align 4, !tbaa !5
  br label %170, !llvm.loop !16

185:                                              ; preds = %180, %170
  %186 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  br label %187

187:                                              ; preds = %197, %185
  %188 = load i32, ptr %9, align 4, !tbaa !5
  %189 = icmp sge i32 %188, 0
  br i1 %189, label %190, label %200

190:                                              ; preds = %187
  %191 = load i32, ptr %9, align 4, !tbaa !5
  %192 = sext i32 %191 to i64
  %193 = getelementptr inbounds i8, ptr %36, i64 %192
  %194 = load i8, ptr %193, align 1, !tbaa !9
  %195 = sext i8 %194 to i32
  %196 = call i32 (ptr, ...) @printf(ptr noundef @.str.4, i32 noundef %195)
  br label %197

197:                                              ; preds = %190
  %198 = load i32, ptr %9, align 4, !tbaa !5
  %199 = add nsw i32 %198, -1
  store i32 %199, ptr %9, align 4, !tbaa !5
  br label %187, !llvm.loop !17

200:                                              ; preds = %187
  store i32 0, ptr %1, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #5
  %201 = load ptr, ptr %3, align 8
  call void @llvm.stackrestore.p0(ptr %201)
  call void @llvm.lifetime.end.p0(i64 4, ptr %2) #5
  %202 = load i32, ptr %1, align 4
  ret i32 %202
}

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

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #2

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

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

; Function Attrs: nounwind willreturn memory(read)
declare i64 @strlen(ptr noundef) #4

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

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nocallback nofree nosync nounwind willreturn }
attributes #3 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind willreturn memory(read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { nounwind }
attributes #6 = { nounwind willreturn memory(read) }

!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 = !{!7, !7, i64 0}
!10 = distinct !{!10, !11}
!11 = !{!"llvm.loop.mustprogress"}
!12 = distinct !{!12, !11}
!13 = distinct !{!13, !11}
!14 = distinct !{!14, !11}
!15 = distinct !{!15, !11}
!16 = distinct !{!16, !11}
!17 = distinct !{!17, !11}


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

@.str = external hidden unnamed_addr constant [18 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [3 x i8], align 1

; Function Attrs: nofree nounwind uwtable
define dso_local noundef i32 @main() local_unnamed_addr #0 {
  %1 = alloca [1000000 x i8], align 16
  %2 = alloca [1000000 x i8], align 16
  %3 = alloca [1000000 x i8], align 16
  %4 = alloca [1000000 x i8], align 16
  %5 = alloca [2000000 x i8], align 16
  %6 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str)
  %7 = call i32 (ptr, ...) @__isoc99_scanf(ptr noundef nonnull @.str.1, ptr noundef nonnull %3)
  %8 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2)
  %9 = call i32 (ptr, ...) @__isoc99_scanf(ptr noundef nonnull @.str.1, ptr noundef nonnull %4)
  %10 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %3) #3
  %11 = trunc i64 %10 to i32
  %12 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %4) #3
  %13 = trunc i64 %12 to i32
  %14 = icmp slt i32 %11, 1
  br i1 %14, label %.preheader59, label %iter.check

iter.check:                                       ; preds = %0
  %15 = and i64 %10, 2147483647
  %min.iters.check = icmp ult i64 %15, 8
  br i1 %min.iters.check, label %.lr.ph.preheader, label %vector.main.loop.iter.check

vector.main.loop.iter.check:                      ; preds = %iter.check
  %min.iters.check116 = icmp ult i64 %15, 32
  br i1 %min.iters.check116, label %vec.epilog.ph, label %vector.ph

vector.ph:                                        ; preds = %vector.main.loop.iter.check
  %n.mod.vf = and i64 %10, 31
  %n.vec = sub nsw i64 %15, %n.mod.vf
  %16 = getelementptr i8, ptr %3, i64 %15
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %17 = xor i64 %index, -1
  %18 = getelementptr i8, ptr %16, i64 %17
  %19 = getelementptr inbounds i8, ptr %18, i64 -15
  %20 = getelementptr inbounds i8, ptr %18, i64 -31
  %wide.load = load <16 x i8>, ptr %19, align 1, !tbaa !5
  %wide.load117 = load <16 x i8>, ptr %20, align 1, !tbaa !5
  %21 = add <16 x i8> %wide.load, <i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48>
  %22 = shufflevector <16 x i8> %21, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %23 = add <16 x i8> %wide.load117, <i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48>
  %24 = shufflevector <16 x i8> %23, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %25 = getelementptr inbounds i8, ptr %1, i64 %index
  %26 = getelementptr inbounds i8, ptr %25, i64 16
  store <16 x i8> %22, ptr %25, align 16, !tbaa !5
  store <16 x i8> %24, ptr %26, align 16, !tbaa !5
  %index.next = add nuw i64 %index, 32
  %27 = icmp eq i64 %index.next, %n.vec
  br i1 %27, label %middle.block, label %vector.body, !llvm.loop !8

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.mod.vf, 0
  br i1 %cmp.n, label %.preheader59, label %vec.epilog.iter.check

vec.epilog.iter.check:                            ; preds = %middle.block
  %min.epilog.iters.check = icmp ult i64 %n.mod.vf, 8
  br i1 %min.epilog.iters.check, label %.lr.ph.preheader, label %vec.epilog.ph

.lr.ph.preheader:                                 ; preds = %vec.epilog.middle.block, %iter.check, %vec.epilog.iter.check
  %indvars.iv80.ph = phi i64 [ %15, %iter.check ], [ %n.mod.vf, %vec.epilog.iter.check ], [ %n.mod.vf119, %vec.epilog.middle.block ]
  %indvars.iv.ph = phi i64 [ 0, %iter.check ], [ %n.vec, %vec.epilog.iter.check ], [ %n.vec120, %vec.epilog.middle.block ]
  br label %.lr.ph

vec.epilog.ph:                                    ; preds = %vector.main.loop.iter.check, %vec.epilog.iter.check
  %vec.epilog.resume.val = phi i64 [ %n.vec, %vec.epilog.iter.check ], [ 0, %vector.main.loop.iter.check ]
  %n.mod.vf119 = and i64 %10, 7
  %n.vec120 = sub nsw i64 %15, %n.mod.vf119
  %28 = getelementptr i8, ptr %3, i64 %15
  %invariant.gep204 = getelementptr i8, ptr %28, i64 -7
  br label %vec.epilog.vector.body

vec.epilog.vector.body:                           ; preds = %vec.epilog.vector.body, %vec.epilog.ph
  %index123 = phi i64 [ %vec.epilog.resume.val, %vec.epilog.ph ], [ %index.next127, %vec.epilog.vector.body ]
  %29 = xor i64 %index123, -1
  %gep205 = getelementptr i8, ptr %invariant.gep204, i64 %29
  %wide.load125 = load <8 x i8>, ptr %gep205, align 1, !tbaa !5
  %30 = add <8 x i8> %wide.load125, <i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48>
  %31 = shufflevector <8 x i8> %30, <8 x i8> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %32 = getelementptr inbounds i8, ptr %1, i64 %index123
  store <8 x i8> %31, ptr %32, align 1, !tbaa !5
  %index.next127 = add nuw i64 %index123, 8
  %33 = icmp eq i64 %index.next127, %n.vec120
  br i1 %33, label %vec.epilog.middle.block, label %vec.epilog.vector.body, !llvm.loop !12

vec.epilog.middle.block:                          ; preds = %vec.epilog.vector.body
  %cmp.n128 = icmp eq i64 %n.mod.vf119, 0
  br i1 %cmp.n128, label %.preheader59, label %.lr.ph.preheader

.preheader59:                                     ; preds = %.lr.ph, %middle.block, %vec.epilog.middle.block, %0
  %34 = icmp slt i32 %13, 1
  br i1 %34, label %.preheader56, label %iter.check132

iter.check132:                                    ; preds = %.preheader59
  %35 = and i64 %12, 2147483647
  %min.iters.check130 = icmp ult i64 %35, 8
  br i1 %min.iters.check130, label %.lr.ph64.preheader, label %vector.main.loop.iter.check134

vector.main.loop.iter.check134:                   ; preds = %iter.check132
  %min.iters.check133 = icmp ult i64 %35, 32
  br i1 %min.iters.check133, label %vec.epilog.ph149, label %vector.ph135

vector.ph135:                                     ; preds = %vector.main.loop.iter.check134
  %n.mod.vf136 = and i64 %12, 31
  %n.vec137 = sub nsw i64 %35, %n.mod.vf136
  %36 = getelementptr i8, ptr %4, i64 %35
  br label %vector.body138

vector.body138:                                   ; preds = %vector.body138, %vector.ph135
  %index139 = phi i64 [ 0, %vector.ph135 ], [ %index.next145, %vector.body138 ]
  %37 = xor i64 %index139, -1
  %38 = getelementptr i8, ptr %36, i64 %37
  %39 = getelementptr inbounds i8, ptr %38, i64 -15
  %40 = getelementptr inbounds i8, ptr %38, i64 -31
  %wide.load141 = load <16 x i8>, ptr %39, align 1, !tbaa !5
  %wide.load143 = load <16 x i8>, ptr %40, align 1, !tbaa !5
  %41 = add <16 x i8> %wide.load141, <i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48>
  %42 = shufflevector <16 x i8> %41, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %43 = add <16 x i8> %wide.load143, <i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48>
  %44 = shufflevector <16 x i8> %43, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %45 = getelementptr inbounds i8, ptr %2, i64 %index139
  %46 = getelementptr inbounds i8, ptr %45, i64 16
  store <16 x i8> %42, ptr %45, align 16, !tbaa !5
  store <16 x i8> %44, ptr %46, align 16, !tbaa !5
  %index.next145 = add nuw i64 %index139, 32
  %47 = icmp eq i64 %index.next145, %n.vec137
  br i1 %47, label %middle.block129, label %vector.body138, !llvm.loop !13

middle.block129:                                  ; preds = %vector.body138
  %cmp.n146 = icmp eq i64 %n.mod.vf136, 0
  br i1 %cmp.n146, label %.preheader58, label %vec.epilog.iter.check150

vec.epilog.iter.check150:                         ; preds = %middle.block129
  %min.epilog.iters.check152 = icmp ult i64 %n.mod.vf136, 8
  br i1 %min.epilog.iters.check152, label %.lr.ph64.preheader, label %vec.epilog.ph149

.lr.ph64.preheader:                               ; preds = %vec.epilog.middle.block147, %iter.check132, %vec.epilog.iter.check150
  %indvars.iv87.ph = phi i64 [ %35, %iter.check132 ], [ %n.mod.vf136, %vec.epilog.iter.check150 ], [ %n.mod.vf154, %vec.epilog.middle.block147 ]
  %indvars.iv85.ph = phi i64 [ 0, %iter.check132 ], [ %n.vec137, %vec.epilog.iter.check150 ], [ %n.vec155, %vec.epilog.middle.block147 ]
  br label %.lr.ph64

vec.epilog.ph149:                                 ; preds = %vector.main.loop.iter.check134, %vec.epilog.iter.check150
  %vec.epilog.resume.val153 = phi i64 [ %n.vec137, %vec.epilog.iter.check150 ], [ 0, %vector.main.loop.iter.check134 ]
  %n.mod.vf154 = and i64 %12, 7
  %n.vec155 = sub nsw i64 %35, %n.mod.vf154
  %48 = getelementptr i8, ptr %4, i64 %35
  %invariant.gep206 = getelementptr i8, ptr %48, i64 -7
  br label %vec.epilog.vector.body160

vec.epilog.vector.body160:                        ; preds = %vec.epilog.vector.body160, %vec.epilog.ph149
  %index161 = phi i64 [ %vec.epilog.resume.val153, %vec.epilog.ph149 ], [ %index.next165, %vec.epilog.vector.body160 ]
  %49 = xor i64 %index161, -1
  %gep207 = getelementptr i8, ptr %invariant.gep206, i64 %49
  %wide.load163 = load <8 x i8>, ptr %gep207, align 1, !tbaa !5
  %50 = add <8 x i8> %wide.load163, <i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48>
  %51 = shufflevector <8 x i8> %50, <8 x i8> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
  %52 = getelementptr inbounds i8, ptr %2, i64 %index161
  store <8 x i8> %51, ptr %52, align 1, !tbaa !5
  %index.next165 = add nuw i64 %index161, 8
  %53 = icmp eq i64 %index.next165, %n.vec155
  br i1 %53, label %vec.epilog.middle.block147, label %vec.epilog.vector.body160, !llvm.loop !14

vec.epilog.middle.block147:                       ; preds = %vec.epilog.vector.body160
  %cmp.n166 = icmp eq i64 %n.mod.vf154, 0
  br i1 %cmp.n166, label %.preheader58, label %.lr.ph64.preheader

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %indvars.iv80 = phi i64 [ %indvars.iv.next81, %.lr.ph ], [ %indvars.iv80.ph, %.lr.ph.preheader ]
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %indvars.iv.ph, %.lr.ph.preheader ]
  %indvars.iv.next81 = add nsw i64 %indvars.iv80, -1
  %54 = getelementptr inbounds i8, ptr %3, i64 %indvars.iv.next81
  %55 = load i8, ptr %54, align 1, !tbaa !5
  %56 = add i8 %55, -48
  %57 = getelementptr inbounds i8, ptr %1, i64 %indvars.iv
  store i8 %56, ptr %57, align 1, !tbaa !5
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %15
  br i1 %exitcond.not, label %.preheader59, label %.lr.ph, !llvm.loop !15

.preheader58:                                     ; preds = %.lr.ph64, %vec.epilog.middle.block147, %middle.block129
  %brmerge = or i1 %34, %14
  br i1 %brmerge, label %.preheader56, label %.preheader57.us.preheader

.preheader57.us.preheader:                        ; preds = %.preheader58
  %wide.trip.count102 = and i64 %12, 2147483647
  %wide.trip.count97 = and i64 %10, 2147483647
  %min.iters.check168 = icmp ult i64 %wide.trip.count97, 8
  %min.iters.check171 = icmp ult i64 %wide.trip.count97, 32
  %n.mod.vf174 = and i64 %10, 31
  %n.vec175 = sub nsw i64 %wide.trip.count97, %n.mod.vf174
  %cmp.n183 = icmp eq i64 %n.mod.vf174, 0
  %min.epilog.iters.check189 = icmp ult i64 %n.mod.vf174, 8
  %n.mod.vf191 = and i64 %10, 7
  %n.vec192 = sub nsw i64 %wide.trip.count97, %n.mod.vf191
  %cmp.n201 = icmp eq i64 %n.mod.vf191, 0
  br label %iter.check170

iter.check170:                                    ; preds = %.preheader57.us.preheader, %._crit_edge.us
  %indvars.iv99 = phi i64 [ 0, %.preheader57.us.preheader ], [ %indvars.iv.next100, %._crit_edge.us ]
  %58 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv99
  %59 = load i8, ptr %58, align 1, !tbaa !5
  %invariant.gep = getelementptr inbounds i8, ptr %5, i64 %indvars.iv99
  br i1 %min.iters.check168, label %vec.epilog.scalar.ph185.preheader, label %vector.main.loop.iter.check172

vector.main.loop.iter.check172:                   ; preds = %iter.check170
  br i1 %min.iters.check171, label %vec.epilog.ph186, label %vector.ph173

vector.ph173:                                     ; preds = %vector.main.loop.iter.check172
  %broadcast.splatinsert = insertelement <16 x i8> poison, i8 %59, i64 0
  %broadcast.splat = shufflevector <16 x i8> %broadcast.splatinsert, <16 x i8> poison, <16 x i32> zeroinitializer
  br label %vector.body176

vector.body176:                                   ; preds = %vector.body176, %vector.ph173
  %index177 = phi i64 [ 0, %vector.ph173 ], [ %index.next182, %vector.body176 ]
  %60 = getelementptr inbounds i8, ptr %1, i64 %index177
  %61 = getelementptr inbounds i8, ptr %60, i64 16
  %wide.load178 = load <16 x i8>, ptr %60, align 16, !tbaa !5
  %wide.load179 = load <16 x i8>, ptr %61, align 16, !tbaa !5
  %62 = mul <16 x i8> %wide.load178, %broadcast.splat
  %63 = mul <16 x i8> %wide.load179, %broadcast.splat
  %64 = getelementptr inbounds i8, ptr %invariant.gep, i64 %index177
  %65 = getelementptr inbounds i8, ptr %64, i64 16
  %wide.load180 = load <16 x i8>, ptr %64, align 1, !tbaa !5
  %wide.load181 = load <16 x i8>, ptr %65, align 1, !tbaa !5
  %66 = add <16 x i8> %62, %wide.load180
  %67 = add <16 x i8> %63, %wide.load181
  store <16 x i8> %66, ptr %64, align 1, !tbaa !5
  store <16 x i8> %67, ptr %65, align 1, !tbaa !5
  %index.next182 = add nuw i64 %index177, 32
  %68 = icmp eq i64 %index.next182, %n.vec175
  br i1 %68, label %middle.block167, label %vector.body176, !llvm.loop !16

middle.block167:                                  ; preds = %vector.body176
  br i1 %cmp.n183, label %._crit_edge.us, label %vec.epilog.iter.check187

vec.epilog.iter.check187:                         ; preds = %middle.block167
  br i1 %min.epilog.iters.check189, label %vec.epilog.scalar.ph185.preheader, label %vec.epilog.ph186

vec.epilog.ph186:                                 ; preds = %vector.main.loop.iter.check172, %vec.epilog.iter.check187
  %vec.epilog.resume.val190 = phi i64 [ %n.vec175, %vec.epilog.iter.check187 ], [ 0, %vector.main.loop.iter.check172 ]
  %broadcast.splatinsert197 = insertelement <8 x i8> poison, i8 %59, i64 0
  %broadcast.splat198 = shufflevector <8 x i8> %broadcast.splatinsert197, <8 x i8> poison, <8 x i32> zeroinitializer
  br label %vec.epilog.vector.body194

vec.epilog.vector.body194:                        ; preds = %vec.epilog.vector.body194, %vec.epilog.ph186
  %index195 = phi i64 [ %vec.epilog.resume.val190, %vec.epilog.ph186 ], [ %index.next200, %vec.epilog.vector.body194 ]
  %69 = getelementptr inbounds i8, ptr %1, i64 %index195
  %wide.load196 = load <8 x i8>, ptr %69, align 1, !tbaa !5
  %70 = mul <8 x i8> %wide.load196, %broadcast.splat198
  %71 = getelementptr inbounds i8, ptr %invariant.gep, i64 %index195
  %wide.load199 = load <8 x i8>, ptr %71, align 1, !tbaa !5
  %72 = add <8 x i8> %70, %wide.load199
  store <8 x i8> %72, ptr %71, align 1, !tbaa !5
  %index.next200 = add nuw i64 %index195, 8
  %73 = icmp eq i64 %index.next200, %n.vec192
  br i1 %73, label %vec.epilog.middle.block184, label %vec.epilog.vector.body194, !llvm.loop !17

vec.epilog.middle.block184:                       ; preds = %vec.epilog.vector.body194
  br i1 %cmp.n201, label %._crit_edge.us, label %vec.epilog.scalar.ph185.preheader

vec.epilog.scalar.ph185.preheader:                ; preds = %vec.epilog.middle.block184, %iter.check170, %vec.epilog.iter.check187
  %indvars.iv94.ph = phi i64 [ 0, %iter.check170 ], [ %n.vec175, %vec.epilog.iter.check187 ], [ %n.vec192, %vec.epilog.middle.block184 ]
  br label %vec.epilog.scalar.ph185

vec.epilog.scalar.ph185:                          ; preds = %vec.epilog.scalar.ph185.preheader, %vec.epilog.scalar.ph185
  %indvars.iv94 = phi i64 [ %indvars.iv.next95, %vec.epilog.scalar.ph185 ], [ %indvars.iv94.ph, %vec.epilog.scalar.ph185.preheader ]
  %74 = getelementptr inbounds i8, ptr %1, i64 %indvars.iv94
  %75 = load i8, ptr %74, align 1, !tbaa !5
  %76 = mul i8 %75, %59
  %gep = getelementptr inbounds i8, ptr %invariant.gep, i64 %indvars.iv94
  %77 = load i8, ptr %gep, align 1, !tbaa !5
  %78 = add i8 %76, %77
  store i8 %78, ptr %gep, align 1, !tbaa !5
  %indvars.iv.next95 = add nuw nsw i64 %indvars.iv94, 1
  %exitcond98.not = icmp eq i64 %indvars.iv.next95, %wide.trip.count97
  br i1 %exitcond98.not, label %._crit_edge.us, label %vec.epilog.scalar.ph185, !llvm.loop !18

._crit_edge.us:                                   ; preds = %vec.epilog.scalar.ph185, %vec.epilog.middle.block184, %middle.block167
  %indvars.iv.next100 = add nuw nsw i64 %indvars.iv99, 1
  %exitcond103.not = icmp eq i64 %indvars.iv.next100, %wide.trip.count102
  br i1 %exitcond103.not, label %.preheader56, label %iter.check170, !llvm.loop !19

.lr.ph64:                                         ; preds = %.lr.ph64.preheader, %.lr.ph64
  %indvars.iv87 = phi i64 [ %indvars.iv.next88, %.lr.ph64 ], [ %indvars.iv87.ph, %.lr.ph64.preheader ]
  %indvars.iv85 = phi i64 [ %indvars.iv.next86, %.lr.ph64 ], [ %indvars.iv85.ph, %.lr.ph64.preheader ]
  %indvars.iv.next88 = add nsw i64 %indvars.iv87, -1
  %79 = getelementptr inbounds i8, ptr %4, i64 %indvars.iv.next88
  %80 = load i8, ptr %79, align 1, !tbaa !5
  %81 = add i8 %80, -48
  %82 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv85
  store i8 %81, ptr %82, align 1, !tbaa !5
  %indvars.iv.next86 = add nuw nsw i64 %indvars.iv85, 1
  %exitcond93.not = icmp eq i64 %indvars.iv.next86, %35
  br i1 %exitcond93.not, label %.preheader58, label %.lr.ph64, !llvm.loop !20

.preheader56:                                     ; preds = %._crit_edge.us, %.preheader58, %.preheader59
  %83 = add nsw i32 %13, %11
  %84 = icmp sgt i32 %83, 0
  br i1 %84, label %.lr.ph69.preheader, label %.preheader

.lr.ph69.preheader:                               ; preds = %.preheader56
  %wide.trip.count107 = zext nneg i32 %83 to i64
  %.pre = load i8, ptr %5, align 16, !tbaa !5
  br label %.lr.ph69

.preheader:                                       ; preds = %.lr.ph69, %.preheader56
  %85 = icmp sgt i32 %83, -1
  br i1 %85, label %.lr.ph71, label %._crit_edge.thread

.lr.ph69:                                         ; preds = %.lr.ph69.preheader, %.lr.ph69
  %86 = phi i8 [ %.pre, %.lr.ph69.preheader ], [ %92, %.lr.ph69 ]
  %indvars.iv104 = phi i64 [ 0, %.lr.ph69.preheader ], [ %indvars.iv.next105, %.lr.ph69 ]
  %87 = getelementptr inbounds i8, ptr %5, i64 %indvars.iv104
  %88 = sdiv i8 %86, 10
  %89 = srem i8 %86, 10
  store i8 %89, ptr %87, align 1, !tbaa !5
  %indvars.iv.next105 = add nuw nsw i64 %indvars.iv104, 1
  %90 = getelementptr inbounds i8, ptr %5, i64 %indvars.iv.next105
  %91 = load i8, ptr %90, align 1, !tbaa !5
  %92 = add i8 %91, %88
  store i8 %92, ptr %90, align 1, !tbaa !5
  %exitcond108.not = icmp eq i64 %indvars.iv.next105, %wide.trip.count107
  br i1 %exitcond108.not, label %.preheader, label %.lr.ph69, !llvm.loop !21

.lr.ph71:                                         ; preds = %.preheader, %97
  %.05170 = phi i32 [ %98, %97 ], [ %83, %.preheader ]
  %93 = zext nneg i32 %.05170 to i64
  %94 = getelementptr inbounds i8, ptr %5, i64 %93
  %95 = load i8, ptr %94, align 1, !tbaa !5
  %96 = icmp sgt i8 %95, 0
  br i1 %96, label %.lr.ph77.preheader, label %97

97:                                               ; preds = %.lr.ph71
  %98 = add nsw i32 %.05170, -1
  %99 = icmp sgt i32 %.05170, 0
  br i1 %99, label %.lr.ph71, label %._crit_edge.thread, !llvm.loop !22

._crit_edge.thread:                               ; preds = %97, %.preheader
  %100 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  br label %._crit_edge78

.lr.ph77.preheader:                               ; preds = %.lr.ph71
  %101 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  %102 = zext nneg i32 %.05170 to i64
  br label %.lr.ph77

.lr.ph77:                                         ; preds = %.lr.ph77.preheader, %.lr.ph77
  %indvars.iv109 = phi i64 [ %102, %.lr.ph77.preheader ], [ %indvars.iv.next110, %.lr.ph77 ]
  %103 = getelementptr inbounds i8, ptr %5, i64 %indvars.iv109
  %104 = load i8, ptr %103, align 1, !tbaa !5
  %105 = sext i8 %104 to i32
  %106 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.4, i32 noundef %105)
  %indvars.iv.next110 = add nsw i64 %indvars.iv109, -1
  %.not = icmp eq i64 %indvars.iv109, 0
  br i1 %.not, label %._crit_edge78, label %.lr.ph77, !llvm.loop !23

._crit_edge78:                                    ; preds = %.lr.ph77, %._crit_edge.thread
  ret i32 0
}

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

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare i64 @strlen(ptr nocapture noundef) local_unnamed_addr #2

attributes #0 = { nofree 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 = { nofree nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { mustprogress nofree nounwind willreturn memory(argmem: read) "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 willreturn memory(read) }

!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 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C/C++ TBAA"}
!8 = distinct !{!8, !9, !10, !11}
!9 = !{!"llvm.loop.mustprogress"}
!10 = !{!"llvm.loop.isvectorized", i32 1}
!11 = !{!"llvm.loop.unroll.runtime.disable"}
!12 = distinct !{!12, !9, !10, !11}
!13 = distinct !{!13, !9, !10, !11}
!14 = distinct !{!14, !9, !10, !11}
!15 = distinct !{!15, !9, !11, !10}
!16 = distinct !{!16, !9, !10, !11}
!17 = distinct !{!17, !9, !10, !11}
!18 = distinct !{!18, !9, !11, !10}
!19 = distinct !{!19, !9}
!20 = distinct !{!20, !9, !11, !10}
!21 = distinct !{!21, !9}
!22 = distinct !{!22, !9}
!23 = distinct !{!23, !9}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass