; LLVM IR from EntityFX/anybench :: src/benchmarks/generic/lloops (lloops)

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

%struct.Parameters = type { i64, i64, i64, double, [3 x [25 x double]], [3 x [25 x i64]], [3 x [25 x double]], [3 x [25 x double]], [3 x [25 x double]], [25 x i64], [3 x [25 x i64]], [3 x [25 x i64]], double, double, double, i64, i64, i64, [3 x [25 x i64]], i64, i64, i64, i64, i64, i64, double, i64 }

@reliability = external dso_local global i32, align 4
@nsRes = external dso_local global i32, align 4
@compareFail = external dso_local global i32, align 4
@as2 = external dso_local global %struct.Parameters, align 8
@__const.checkOut.sumsOut = external hidden unnamed_addr constant [3 x [25 x double]], align 16
@failCount = external dso_local global i32, align 4
@sumscomp = external dso_local global [3 x [25 x double]], align 16
@.str.29 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [71 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [68 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [61 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [61 x i8], align 1

; 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 nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #1

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

; Function Attrs: nounwind uwtable
define dso_local void @checkOut(i32 noundef %0) #3 {
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca [30 x i8], align 16
  %7 = alloca [30 x i8], align 16
  %8 = alloca [3 x [25 x double]], align 16
  store i32 %0, ptr %2, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #6
  store i32 0, ptr %5, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 30, ptr %6) #6
  call void @llvm.lifetime.start.p0(i64 30, ptr %7) #6
  call void @llvm.lifetime.start.p0(i64 600, ptr %8) #6
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %8, ptr align 16 @__const.checkOut.sumsOut, i64 600, i1 false)
  %9 = load i32, ptr @reliability, align 4, !tbaa !5
  %10 = icmp ne i32 %9, 0
  br i1 %10, label %11, label %121

11:                                               ; preds = %1
  %12 = load i64, ptr getelementptr inbounds (%struct.Parameters, ptr @as2, i32 0, i32 23), align 8, !tbaa !9
  %13 = trunc i64 %12 to i32
  store i32 %13, ptr %3, align 4, !tbaa !5
  %14 = load i32, ptr %2, align 4, !tbaa !5
  store i32 %14, ptr %4, align 4, !tbaa !5
  %15 = load i64, ptr getelementptr inbounds (%struct.Parameters, ptr @as2, i32 0, i32 16), align 8, !tbaa !13
  %16 = icmp eq i64 %15, 1
  br i1 %16, label %17, label %75

17:                                               ; preds = %11
  store i32 0, ptr @failCount, align 4, !tbaa !5
  %18 = load i32, ptr %3, align 4, !tbaa !5
  %19 = sext i32 %18 to i64
  %20 = getelementptr inbounds [3 x [25 x double]], ptr %8, i64 0, i64 %19
  %21 = load i32, ptr %4, align 4, !tbaa !5
  %22 = sext i32 %21 to i64
  %23 = getelementptr inbounds [25 x double], ptr %20, i64 0, i64 %22
  %24 = load double, ptr %23, align 8, !tbaa !14
  %25 = load i32, ptr %3, align 4, !tbaa !5
  %26 = sext i32 %25 to i64
  %27 = getelementptr inbounds [3 x [25 x double]], ptr @sumscomp, i64 0, i64 %26
  %28 = load i32, ptr %4, align 4, !tbaa !5
  %29 = sext i32 %28 to i64
  %30 = getelementptr inbounds [25 x double], ptr %27, i64 0, i64 %29
  store double %24, ptr %30, align 8, !tbaa !14
  %31 = getelementptr inbounds [30 x i8], ptr %6, i64 0, i64 0
  %32 = load i32, ptr %3, align 4, !tbaa !5
  %33 = sext i32 %32 to i64
  %34 = getelementptr inbounds [3 x [25 x double]], ptr getelementptr inbounds (%struct.Parameters, ptr @as2, i32 0, i32 4), i64 0, i64 %33
  %35 = load i32, ptr %4, align 4, !tbaa !5
  %36 = sext i32 %35 to i64
  %37 = getelementptr inbounds [25 x double], ptr %34, i64 0, i64 %36
  %38 = load double, ptr %37, align 8, !tbaa !14
  %39 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %31, ptr noundef @.str.29, double noundef %38) #6
  %40 = getelementptr inbounds [30 x i8], ptr %7, i64 0, i64 0
  %41 = load i32, ptr %3, align 4, !tbaa !5
  %42 = sext i32 %41 to i64
  %43 = getelementptr inbounds [3 x [25 x double]], ptr @sumscomp, i64 0, i64 %42
  %44 = load i32, ptr %4, align 4, !tbaa !5
  %45 = sext i32 %44 to i64
  %46 = getelementptr inbounds [25 x double], ptr %43, i64 0, i64 %45
  %47 = load double, ptr %46, align 8, !tbaa !14
  %48 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %40, ptr noundef @.str.29, double noundef %47) #6
  %49 = getelementptr inbounds [30 x i8], ptr %6, i64 0, i64 0
  %50 = getelementptr inbounds [30 x i8], ptr %7, i64 0, i64 0
  %51 = call i32 @strcmp(ptr noundef %49, ptr noundef %50) #7
  %52 = icmp ne i32 %51, 0
  br i1 %52, label %53, label %74

53:                                               ; preds = %17
  store i32 1, ptr @nsRes, align 4, !tbaa !5
  %54 = load i32, ptr %3, align 4, !tbaa !5
  %55 = sext i32 %54 to i64
  %56 = getelementptr inbounds [3 x [25 x double]], ptr getelementptr inbounds (%struct.Parameters, ptr @as2, i32 0, i32 4), i64 0, i64 %55
  %57 = load i32, ptr %4, align 4, !tbaa !5
  %58 = sext i32 %57 to i64
  %59 = getelementptr inbounds [25 x double], ptr %56, i64 0, i64 %58
  %60 = load double, ptr %59, align 8, !tbaa !14
  %61 = load i32, ptr %3, align 4, !tbaa !5
  %62 = sext i32 %61 to i64
  %63 = getelementptr inbounds [3 x [25 x double]], ptr @sumscomp, i64 0, i64 %62
  %64 = load i32, ptr %4, align 4, !tbaa !5
  %65 = sext i32 %64 to i64
  %66 = getelementptr inbounds [25 x double], ptr %63, i64 0, i64 %65
  store double %60, ptr %66, align 8, !tbaa !14
  %67 = load i32, ptr %3, align 4, !tbaa !5
  %68 = add nsw i32 %67, 1
  %69 = load i32, ptr %4, align 4, !tbaa !5
  %70 = load i64, ptr getelementptr inbounds (%struct.Parameters, ptr @as2, i32 0, i32 16), align 8, !tbaa !13
  %71 = getelementptr inbounds [30 x i8], ptr %6, i64 0, i64 0
  %72 = getelementptr inbounds [30 x i8], ptr %7, i64 0, i64 0
  %73 = call i32 (ptr, ...) @printf(ptr noundef @.str.30, i32 noundef %68, i32 noundef %69, i64 noundef %70, ptr noundef %71, ptr noundef %72)
  br label %74

74:                                               ; preds = %53, %17
  br label %120

75:                                               ; preds = %11
  %76 = getelementptr inbounds [30 x i8], ptr %6, i64 0, i64 0
  %77 = load i32, ptr %3, align 4, !tbaa !5
  %78 = sext i32 %77 to i64
  %79 = getelementptr inbounds [3 x [25 x double]], ptr getelementptr inbounds (%struct.Parameters, ptr @as2, i32 0, i32 4), i64 0, i64 %78
  %80 = load i32, ptr %4, align 4, !tbaa !5
  %81 = sext i32 %80 to i64
  %82 = getelementptr inbounds [25 x double], ptr %79, i64 0, i64 %81
  %83 = load double, ptr %82, align 8, !tbaa !14
  %84 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %76, ptr noundef @.str.29, double noundef %83) #6
  %85 = getelementptr inbounds [30 x i8], ptr %7, i64 0, i64 0
  %86 = load i32, ptr %3, align 4, !tbaa !5
  %87 = sext i32 %86 to i64
  %88 = getelementptr inbounds [3 x [25 x double]], ptr @sumscomp, i64 0, i64 %87
  %89 = load i32, ptr %4, align 4, !tbaa !5
  %90 = sext i32 %89 to i64
  %91 = getelementptr inbounds [25 x double], ptr %88, i64 0, i64 %90
  %92 = load double, ptr %91, align 8, !tbaa !14
  %93 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %85, ptr noundef @.str.29, double noundef %92) #6
  %94 = getelementptr inbounds [30 x i8], ptr %6, i64 0, i64 0
  %95 = getelementptr inbounds [30 x i8], ptr %7, i64 0, i64 0
  %96 = call i32 @strcmp(ptr noundef %94, ptr noundef %95) #7
  %97 = icmp ne i32 %96, 0
  br i1 %97, label %98, label %119

98:                                               ; preds = %75
  %99 = load i32, ptr @compareFail, align 4, !tbaa !5
  %100 = add nsw i32 %99, 1
  store i32 %100, ptr @compareFail, align 4, !tbaa !5
  %101 = load i32, ptr @failCount, align 4, !tbaa !5
  %102 = add nsw i32 %101, 1
  store i32 %102, ptr @failCount, align 4, !tbaa !5
  %103 = load i32, ptr @compareFail, align 4, !tbaa !5
  %104 = icmp eq i32 %103, 1
  br i1 %104, label %105, label %107

105:                                              ; preds = %98
  %106 = call i32 (ptr, ...) @printf(ptr noundef @.str.31)
  br label %107

107:                                              ; preds = %105, %98
  %108 = load i32, ptr @failCount, align 4, !tbaa !5
  %109 = icmp slt i32 %108, 6
  br i1 %109, label %110, label %118

110:                                              ; preds = %107
  %111 = load i32, ptr %3, align 4, !tbaa !5
  %112 = add nsw i32 %111, 1
  %113 = load i32, ptr %4, align 4, !tbaa !5
  %114 = load i64, ptr getelementptr inbounds (%struct.Parameters, ptr @as2, i32 0, i32 16), align 8, !tbaa !13
  %115 = getelementptr inbounds [30 x i8], ptr %6, i64 0, i64 0
  %116 = getelementptr inbounds [30 x i8], ptr %7, i64 0, i64 0
  %117 = call i32 (ptr, ...) @printf(ptr noundef @.str.32, i32 noundef %112, i32 noundef %113, i64 noundef %114, ptr noundef %115, ptr noundef %116)
  br label %118

118:                                              ; preds = %110, %107
  br label %119

119:                                              ; preds = %118, %75
  br label %120

120:                                              ; preds = %119, %74
  br label %177

121:                                              ; preds = %1
  store i32 0, ptr %3, align 4, !tbaa !5
  br label %122

122:                                              ; preds = %166, %121
  %123 = load i32, ptr %3, align 4, !tbaa !5
  %124 = icmp slt i32 %123, 3
  br i1 %124, label %125, label %169

125:                                              ; preds = %122
  store i32 1, ptr %4, align 4, !tbaa !5
  br label %126

126:                                              ; preds = %162, %125
  %127 = load i32, ptr %4, align 4, !tbaa !5
  %128 = icmp slt i32 %127, 25
  br i1 %128, label %129, label %165

129:                                              ; preds = %126
  %130 = getelementptr inbounds [30 x i8], ptr %6, i64 0, i64 0
  %131 = load i32, ptr %3, align 4, !tbaa !5
  %132 = sext i32 %131 to i64
  %133 = getelementptr inbounds [3 x [25 x double]], ptr getelementptr inbounds (%struct.Parameters, ptr @as2, i32 0, i32 4), i64 0, i64 %132
  %134 = load i32, ptr %4, align 4, !tbaa !5
  %135 = sext i32 %134 to i64
  %136 = getelementptr inbounds [25 x double], ptr %133, i64 0, i64 %135
  %137 = load double, ptr %136, align 8, !tbaa !14
  %138 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %130, ptr noundef @.str.29, double noundef %137) #6
  %139 = getelementptr inbounds [30 x i8], ptr %7, i64 0, i64 0
  %140 = load i32, ptr %3, align 4, !tbaa !5
  %141 = sext i32 %140 to i64
  %142 = getelementptr inbounds [3 x [25 x double]], ptr %8, i64 0, i64 %141
  %143 = load i32, ptr %4, align 4, !tbaa !5
  %144 = sext i32 %143 to i64
  %145 = getelementptr inbounds [25 x double], ptr %142, i64 0, i64 %144
  %146 = load double, ptr %145, align 8, !tbaa !14
  %147 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %139, ptr noundef @.str.29, double noundef %146) #6
  %148 = getelementptr inbounds [30 x i8], ptr %6, i64 0, i64 0
  %149 = getelementptr inbounds [30 x i8], ptr %7, i64 0, i64 0
  %150 = call i32 @strcmp(ptr noundef %148, ptr noundef %149) #7
  %151 = icmp ne i32 %150, 0
  br i1 %151, label %152, label %161

152:                                              ; preds = %129
  %153 = load i32, ptr %5, align 4, !tbaa !5
  %154 = add nsw i32 %153, 1
  store i32 %154, ptr %5, align 4, !tbaa !5
  %155 = load i32, ptr %3, align 4, !tbaa !5
  %156 = add nsw i32 %155, 1
  %157 = load i32, ptr %4, align 4, !tbaa !5
  %158 = getelementptr inbounds [30 x i8], ptr %6, i64 0, i64 0
  %159 = getelementptr inbounds [30 x i8], ptr %7, i64 0, i64 0
  %160 = call i32 (ptr, ...) @printf(ptr noundef @.str.33, i32 noundef %156, i32 noundef %157, ptr noundef %158, ptr noundef %159)
  br label %161

161:                                              ; preds = %152, %129
  br label %162

162:                                              ; preds = %161
  %163 = load i32, ptr %4, align 4, !tbaa !5
  %164 = add nsw i32 %163, 1
  store i32 %164, ptr %4, align 4, !tbaa !5
  br label %126, !llvm.loop !15

165:                                              ; preds = %126
  br label %166

166:                                              ; preds = %165
  %167 = load i32, ptr %3, align 4, !tbaa !5
  %168 = add nsw i32 %167, 1
  store i32 %168, ptr %3, align 4, !tbaa !5
  br label %122, !llvm.loop !17

169:                                              ; preds = %122
  %170 = load i32, ptr %5, align 4, !tbaa !5
  %171 = icmp eq i32 %170, 0
  br i1 %171, label %172, label %174

172:                                              ; preds = %169
  %173 = call i32 (ptr, ...) @printf(ptr noundef @.str.34)
  br label %176

174:                                              ; preds = %169
  %175 = call i32 (ptr, ...) @printf(ptr noundef @.str.35)
  br label %176

176:                                              ; preds = %174, %172
  br label %177

177:                                              ; preds = %176, %120
  call void @llvm.lifetime.end.p0(i64 600, ptr %8) #6
  call void @llvm.lifetime.end.p0(i64 30, ptr %7) #6
  call void @llvm.lifetime.end.p0(i64 30, ptr %6) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #6
  ret void
}

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

; Function Attrs: nounwind
declare i32 @sprintf(ptr noundef, ptr noundef, ...) #4

; Function Attrs: nounwind willreturn memory(read)
declare i32 @strcmp(ptr noundef, ptr noundef) #5

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 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 #4 = { 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 #5 = { 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 #6 = { nounwind }
attributes #7 = { 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 = !{!10, !11, i64 5112}
!10 = !{!"Parameters", !11, i64 0, !11, i64 8, !11, i64 16, !12, i64 24, !7, i64 32, !7, i64 632, !7, i64 1232, !7, i64 1832, !7, i64 2432, !7, i64 3032, !7, i64 3232, !7, i64 3832, !12, i64 4432, !12, i64 4440, !12, i64 4448, !11, i64 4456, !11, i64 4464, !11, i64 4472, !7, i64 4480, !11, i64 5080, !11, i64 5088, !11, i64 5096, !11, i64 5104, !11, i64 5112, !11, i64 5120, !12, i64 5128, !11, i64 5136}
!11 = !{!"long", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!10, !11, i64 4464}
!14 = !{!12, !12, i64 0}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}
!17 = distinct !{!17, !16}


; 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.Parameters = type { i64, i64, i64, double, [3 x [25 x double]], [3 x [25 x i64]], [3 x [25 x double]], [3 x [25 x double]], [3 x [25 x double]], [25 x i64], [3 x [25 x i64]], [3 x [25 x i64]], double, double, double, i64, i64, i64, [3 x [25 x i64]], i64, i64, i64, i64, i64, i64, double, i64 }

@reliability = external dso_local local_unnamed_addr global i32, align 4
@nsRes = external dso_local local_unnamed_addr global i32, align 4
@compareFail = external dso_local local_unnamed_addr global i32, align 4
@as2 = external dso_local local_unnamed_addr global %struct.Parameters, align 8
@__const.checkOut.sumsOut = external hidden unnamed_addr constant [3 x [25 x double]], align 16
@failCount = external dso_local local_unnamed_addr global i32, align 4
@sumscomp = external dso_local local_unnamed_addr global [3 x [25 x double]], align 16
@.str.29 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [71 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [68 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [61 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [61 x i8], align 1

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

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

; Function Attrs: nofree nounwind uwtable
define dso_local void @checkOut(i32 noundef %0) local_unnamed_addr #2 {
  %2 = alloca [30 x i8], align 16
  %3 = alloca [30 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 30, ptr nonnull %2) #4
  call void @llvm.lifetime.start.p0(i64 30, ptr nonnull %3) #4
  %4 = load i32, ptr @reliability, align 4, !tbaa !5
  %.not = icmp eq i32 %4, 0
  br i1 %.not, label %.preheader.preheader, label %5

5:                                                ; preds = %1
  %6 = load i64, ptr getelementptr inbounds (i8, ptr @as2, i64 5112), align 8, !tbaa !9
  %7 = trunc i64 %6 to i32
  %8 = load i64, ptr getelementptr inbounds (i8, ptr @as2, i64 4464), align 8, !tbaa !13
  %9 = icmp eq i64 %8, 1
  br i1 %9, label %10, label %27

10:                                               ; preds = %5
  store i32 0, ptr @failCount, align 4, !tbaa !5
  %sext37 = shl i64 %6, 32
  %11 = ashr exact i64 %sext37, 32
  %12 = sext i32 %0 to i64
  %13 = getelementptr inbounds [3 x [25 x double]], ptr @__const.checkOut.sumsOut, i64 0, i64 %11, i64 %12
  %14 = load double, ptr %13, align 8, !tbaa !14
  %15 = getelementptr inbounds [3 x [25 x double]], ptr @sumscomp, i64 0, i64 %11, i64 %12
  store double %14, ptr %15, align 8, !tbaa !14
  %16 = getelementptr inbounds [3 x [25 x double]], ptr getelementptr inbounds (i8, ptr @as2, i64 32), i64 0, i64 %11, i64 %12
  %17 = load double, ptr %16, align 8, !tbaa !14
  %18 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %17) #4
  %19 = load double, ptr %15, align 8, !tbaa !14
  %20 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %19) #4
  %21 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) %3) #5
  %.not38 = icmp eq i32 %21, 0
  br i1 %.not38, label %94, label %22

22:                                               ; preds = %10
  store i32 1, ptr @nsRes, align 4, !tbaa !5
  %23 = load double, ptr %16, align 8, !tbaa !14
  store double %23, ptr %15, align 8, !tbaa !14
  %24 = add nsw i32 %7, 1
  %25 = load i64, ptr getelementptr inbounds (i8, ptr @as2, i64 4464), align 8, !tbaa !13
  %26 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.30, i32 noundef %24, i32 noundef %0, i64 noundef %25, ptr noundef nonnull %2, ptr noundef nonnull %3)
  br label %94

27:                                               ; preds = %5
  %sext = shl i64 %6, 32
  %28 = ashr exact i64 %sext, 32
  %29 = sext i32 %0 to i64
  %30 = getelementptr inbounds [3 x [25 x double]], ptr getelementptr inbounds (i8, ptr @as2, i64 32), i64 0, i64 %28, i64 %29
  %31 = load double, ptr %30, align 8, !tbaa !14
  %32 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %31) #4
  %33 = getelementptr inbounds [3 x [25 x double]], ptr @sumscomp, i64 0, i64 %28, i64 %29
  %34 = load double, ptr %33, align 8, !tbaa !14
  %35 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %34) #4
  %36 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) %3) #5
  %.not36 = icmp eq i32 %36, 0
  br i1 %.not36, label %94, label %37

37:                                               ; preds = %27
  %38 = load i32, ptr @compareFail, align 4, !tbaa !5
  %39 = add nsw i32 %38, 1
  store i32 %39, ptr @compareFail, align 4, !tbaa !5
  %40 = load i32, ptr @failCount, align 4, !tbaa !5
  %41 = add nsw i32 %40, 1
  store i32 %41, ptr @failCount, align 4, !tbaa !5
  %42 = icmp eq i32 %38, 0
  br i1 %42, label %43, label %45

43:                                               ; preds = %37
  %44 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.31)
  %.pr = load i32, ptr @failCount, align 4, !tbaa !5
  br label %45

45:                                               ; preds = %43, %37
  %46 = phi i32 [ %.pr, %43 ], [ %41, %37 ]
  %47 = icmp slt i32 %46, 6
  br i1 %47, label %48, label %94

48:                                               ; preds = %45
  %49 = add nsw i32 %7, 1
  %50 = load i64, ptr getelementptr inbounds (i8, ptr @as2, i64 4464), align 8, !tbaa !13
  %51 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.32, i32 noundef %49, i32 noundef %0, i64 noundef %50, ptr noundef nonnull %2, ptr noundef nonnull %3)
  br label %94

.preheader.preheader:                             ; preds = %1, %63
  %indvars.iv = phi i64 [ %indvars.iv.next, %63 ], [ 1, %1 ]
  %.141 = phi i32 [ %.2, %63 ], [ 0, %1 ]
  %52 = getelementptr inbounds [3 x [25 x double]], ptr getelementptr inbounds (i8, ptr @as2, i64 32), i64 0, i64 0, i64 %indvars.iv
  %53 = load double, ptr %52, align 8, !tbaa !14
  %54 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %53) #4
  %55 = getelementptr inbounds [3 x [25 x double]], ptr @__const.checkOut.sumsOut, i64 0, i64 0, i64 %indvars.iv
  %56 = load double, ptr %55, align 8, !tbaa !14
  %57 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %56) #4
  %58 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) %3) #5
  %.not35 = icmp eq i32 %58, 0
  br i1 %.not35, label %63, label %59

59:                                               ; preds = %.preheader.preheader
  %60 = add nsw i32 %.141, 1
  %61 = trunc nuw nsw i64 %indvars.iv to i32
  %62 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.33, i32 noundef 1, i32 noundef %61, ptr noundef nonnull %2, ptr noundef nonnull %3)
  br label %63

63:                                               ; preds = %.preheader.preheader, %59
  %.2 = phi i32 [ %60, %59 ], [ %.141, %.preheader.preheader ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, 25
  br i1 %exitcond.not, label %.preheader.1, label %.preheader.preheader, !llvm.loop !15

.preheader.1:                                     ; preds = %63, %75
  %indvars.iv.1 = phi i64 [ %indvars.iv.next.1, %75 ], [ 1, %63 ]
  %.141.1 = phi i32 [ %.2.1, %75 ], [ %.2, %63 ]
  %64 = getelementptr inbounds [3 x [25 x double]], ptr getelementptr inbounds (i8, ptr @as2, i64 32), i64 0, i64 1, i64 %indvars.iv.1
  %65 = load double, ptr %64, align 8, !tbaa !14
  %66 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %65) #4
  %67 = getelementptr inbounds [3 x [25 x double]], ptr @__const.checkOut.sumsOut, i64 0, i64 1, i64 %indvars.iv.1
  %68 = load double, ptr %67, align 8, !tbaa !14
  %69 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %68) #4
  %70 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) %3) #5
  %.not35.1 = icmp eq i32 %70, 0
  br i1 %.not35.1, label %75, label %71

71:                                               ; preds = %.preheader.1
  %72 = add nsw i32 %.141.1, 1
  %73 = trunc nuw nsw i64 %indvars.iv.1 to i32
  %74 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.33, i32 noundef 2, i32 noundef %73, ptr noundef nonnull %2, ptr noundef nonnull %3)
  br label %75

75:                                               ; preds = %71, %.preheader.1
  %.2.1 = phi i32 [ %72, %71 ], [ %.141.1, %.preheader.1 ]
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.1, 1
  %exitcond.1.not = icmp eq i64 %indvars.iv.next.1, 25
  br i1 %exitcond.1.not, label %.preheader.2, label %.preheader.1, !llvm.loop !15

.preheader.2:                                     ; preds = %75, %87
  %indvars.iv.2 = phi i64 [ %indvars.iv.next.2, %87 ], [ 1, %75 ]
  %.141.2 = phi i32 [ %.2.2, %87 ], [ %.2.1, %75 ]
  %76 = getelementptr inbounds [3 x [25 x double]], ptr getelementptr inbounds (i8, ptr @as2, i64 32), i64 0, i64 2, i64 %indvars.iv.2
  %77 = load double, ptr %76, align 8, !tbaa !14
  %78 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %77) #4
  %79 = getelementptr inbounds [3 x [25 x double]], ptr @__const.checkOut.sumsOut, i64 0, i64 2, i64 %indvars.iv.2
  %80 = load double, ptr %79, align 8, !tbaa !14
  %81 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %80) #4
  %82 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) %3) #5
  %.not35.2 = icmp eq i32 %82, 0
  br i1 %.not35.2, label %87, label %83

83:                                               ; preds = %.preheader.2
  %84 = add nsw i32 %.141.2, 1
  %85 = trunc nuw nsw i64 %indvars.iv.2 to i32
  %86 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.33, i32 noundef 3, i32 noundef %85, ptr noundef nonnull %2, ptr noundef nonnull %3)
  br label %87

87:                                               ; preds = %83, %.preheader.2
  %.2.2 = phi i32 [ %84, %83 ], [ %.141.2, %.preheader.2 ]
  %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.2, 1
  %exitcond.2.not = icmp eq i64 %indvars.iv.next.2, 25
  br i1 %exitcond.2.not, label %88, label %.preheader.2, !llvm.loop !15

88:                                               ; preds = %87
  %89 = icmp eq i32 %.2.2, 0
  br i1 %89, label %90, label %92

90:                                               ; preds = %88
  %91 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.34)
  br label %94

92:                                               ; preds = %88
  %93 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.35)
  br label %94

94:                                               ; preds = %90, %92, %22, %10, %45, %48, %27
  call void @llvm.lifetime.end.p0(i64 30, ptr nonnull %3) #4
  call void @llvm.lifetime.end.p0(i64 30, ptr nonnull %2) #4
  ret void
}

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

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare i32 @strcmp(ptr nocapture noundef, ptr nocapture noundef) local_unnamed_addr #3

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { 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 #3 = { 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 #4 = { nounwind }
attributes #5 = { 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 = !{!10, !11, i64 5112}
!10 = !{!"Parameters", !11, i64 0, !11, i64 8, !11, i64 16, !12, i64 24, !7, i64 32, !7, i64 632, !7, i64 1232, !7, i64 1832, !7, i64 2432, !7, i64 3032, !7, i64 3232, !7, i64 3832, !12, i64 4432, !12, i64 4440, !12, i64 4448, !11, i64 4456, !11, i64 4464, !11, i64 4472, !7, i64 4480, !11, i64 5080, !11, i64 5088, !11, i64 5096, !11, i64 5104, !11, i64 5112, !11, i64 5120, !12, i64 5128, !11, i64 5136}
!11 = !{!"long", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!10, !11, i64 4464}
!14 = !{!12, !12, i64 0}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass,TailCallElimPass