; LLVM IR from ljm941004/HYPERCV_PUBLIC :: modules/highgui/src (draw)

; 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.RGB_data = type { i8, i8, i8 }
%struct.SIMPLE_MAT = type { i32, i32, i32, i32, i32, ptr }
%struct.point = type { i32, i32 }

@.str = external hidden unnamed_addr constant [8 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [29 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local void @draw_POINT(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, i24 %4, i32 noundef %5) #0 {
  %7 = alloca %struct.RGB_data, align 1
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %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 ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  store i24 %4, ptr %7, align 1
  store ptr %0, ptr %8, align 8, !tbaa !5
  store ptr %1, ptr %9, align 8, !tbaa !5
  store ptr %2, ptr %10, align 8, !tbaa !5
  store i32 %3, ptr %11, align 4, !tbaa !9
  store i32 %5, ptr %12, align 4, !tbaa !9
  %24 = load ptr, ptr %8, align 8, !tbaa !5
  %25 = icmp ne ptr %24, null
  br i1 %25, label %26, label %30

26:                                               ; preds = %6
  %27 = load ptr, ptr %9, align 8, !tbaa !5
  %28 = icmp ne ptr %27, null
  br i1 %28, label %29, label %30

29:                                               ; preds = %26
  br label %34

30:                                               ; preds = %26, %6
  %31 = call i32 (ptr, ...) @printf(ptr noundef @.str)
  %32 = call i32 (ptr, ...) @printf(ptr noundef @.str.1)
  %33 = call i32 (ptr, ...) @printf(ptr noundef @.str.2)
  call void @exit(i32 noundef 1) #5
  unreachable

34:                                               ; preds = %29
  %35 = load ptr, ptr %8, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %35, i32 0, i32 2
  %37 = load i32, ptr %36, align 8, !tbaa !11
  %38 = icmp eq i32 %37, 1
  br i1 %38, label %39, label %40

39:                                               ; preds = %34
  br label %44

40:                                               ; preds = %34
  %41 = call i32 (ptr, ...) @printf(ptr noundef @.str)
  %42 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  %43 = call i32 (ptr, ...) @printf(ptr noundef @.str.2)
  call void @exit(i32 noundef 1) #5
  unreachable

44:                                               ; preds = %39
  %45 = load ptr, ptr %8, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %45, i32 0, i32 0
  %47 = load i32, ptr %46, align 8, !tbaa !13
  %48 = load ptr, ptr %9, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %48, i32 0, i32 0
  %50 = load i32, ptr %49, align 8, !tbaa !13
  %51 = icmp eq i32 %47, %50
  br i1 %51, label %52, label %69

52:                                               ; preds = %44
  %53 = load ptr, ptr %8, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %53, i32 0, i32 1
  %55 = load i32, ptr %54, align 4, !tbaa !14
  %56 = load ptr, ptr %9, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %56, i32 0, i32 1
  %58 = load i32, ptr %57, align 4, !tbaa !14
  %59 = icmp eq i32 %55, %58
  br i1 %59, label %60, label %69

60:                                               ; preds = %52
  %61 = load ptr, ptr %8, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %61, i32 0, i32 3
  %63 = load i32, ptr %62, align 4, !tbaa !15
  %64 = load ptr, ptr %9, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %64, i32 0, i32 3
  %66 = load i32, ptr %65, align 4, !tbaa !15
  %67 = icmp eq i32 %63, %66
  br i1 %67, label %68, label %69

68:                                               ; preds = %60
  br label %73

69:                                               ; preds = %60, %52, %44
  %70 = call i32 (ptr, ...) @printf(ptr noundef @.str)
  %71 = call i32 (ptr, ...) @printf(ptr noundef @.str.4)
  %72 = call i32 (ptr, ...) @printf(ptr noundef @.str.2)
  call void @exit(i32 noundef 1) #5
  unreachable

73:                                               ; preds = %68
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #6
  %74 = load ptr, ptr %8, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %74, i32 0, i32 0
  %76 = load i32, ptr %75, align 8, !tbaa !13
  store i32 %76, ptr %13, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #6
  %77 = load ptr, ptr %8, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %77, i32 0, i32 1
  %79 = load i32, ptr %78, align 4, !tbaa !14
  store i32 %79, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #6
  %80 = load ptr, ptr %8, align 8, !tbaa !5
  %81 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %80, i32 0, i32 3
  %82 = load i32, ptr %81, align 4, !tbaa !15
  store i32 %82, ptr %15, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #6
  %83 = load ptr, ptr %8, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %83, i32 0, i32 5
  %85 = load ptr, ptr %84, align 8, !tbaa !16
  store ptr %85, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #6
  %86 = load ptr, ptr %9, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.SIMPLE_MAT, ptr %86, i32 0, i32 5
  %88 = load ptr, ptr %87, align 8, !tbaa !16
  store ptr %88, ptr %17, align 8, !tbaa !5
  %89 = load ptr, ptr %17, align 8, !tbaa !5
  %90 = load ptr, ptr %16, align 8, !tbaa !5
  %91 = load i32, ptr %13, align 4, !tbaa !9
  %92 = load i32, ptr %14, align 4, !tbaa !9
  %93 = mul nsw i32 %91, %92
  %94 = load i32, ptr %15, align 4, !tbaa !9
  %95 = mul nsw i32 %93, %94
  %96 = sext i32 %95 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %89, ptr align 1 %90, i64 %96, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #6
  store i32 0, ptr %18, align 4, !tbaa !9
  br label %97

97:                                               ; preds = %245, %73
  %98 = load i32, ptr %18, align 4, !tbaa !9
  %99 = load i32, ptr %11, align 4, !tbaa !9
  %100 = icmp slt i32 %98, %99
  br i1 %100, label %102, label %101

101:                                              ; preds = %97
  store i32 2, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #6
  br label %248

102:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #6
  %103 = load ptr, ptr %10, align 8, !tbaa !5
  %104 = load i32, ptr %18, align 4, !tbaa !9
  %105 = sext i32 %104 to i64
  %106 = getelementptr inbounds %struct.point, ptr %103, i64 %105
  %107 = getelementptr inbounds %struct.point, ptr %106, i32 0, i32 0
  %108 = load i32, ptr %107, align 4, !tbaa !17
  store i32 %108, ptr %20, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #6
  %109 = load ptr, ptr %10, align 8, !tbaa !5
  %110 = load i32, ptr %18, align 4, !tbaa !9
  %111 = sext i32 %110 to i64
  %112 = getelementptr inbounds %struct.point, ptr %109, i64 %111
  %113 = getelementptr inbounds %struct.point, ptr %112, i32 0, i32 1
  %114 = load i32, ptr %113, align 4, !tbaa !19
  store i32 %114, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #6
  %115 = load i32, ptr %12, align 4, !tbaa !9
  %116 = sub nsw i32 0, %115
  %117 = sdiv i32 %116, 2
  store i32 %117, ptr %22, align 4, !tbaa !9
  br label %118

118:                                              ; preds = %241, %102
  %119 = load i32, ptr %22, align 4, !tbaa !9
  %120 = load i32, ptr %12, align 4, !tbaa !9
  %121 = sdiv i32 %120, 2
  %122 = icmp sle i32 %119, %121
  br i1 %122, label %124, label %123

123:                                              ; preds = %118
  store i32 5, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #6
  br label %244

124:                                              ; preds = %118
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #6
  %125 = load i32, ptr %12, align 4, !tbaa !9
  %126 = sub nsw i32 0, %125
  %127 = sdiv i32 %126, 2
  store i32 %127, ptr %23, align 4, !tbaa !9
  br label %128

128:                                              ; preds = %237, %124
  %129 = load i32, ptr %23, align 4, !tbaa !9
  %130 = load i32, ptr %12, align 4, !tbaa !9
  %131 = sdiv i32 %130, 2
  %132 = icmp sle i32 %129, %131
  br i1 %132, label %134, label %133

133:                                              ; preds = %128
  store i32 8, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #6
  br label %240

134:                                              ; preds = %128
  %135 = load i32, ptr %20, align 4, !tbaa !9
  %136 = load i32, ptr %22, align 4, !tbaa !9
  %137 = add nsw i32 %135, %136
  %138 = icmp sge i32 %137, 0
  br i1 %138, label %139, label %236

139:                                              ; preds = %134
  %140 = load i32, ptr %20, align 4, !tbaa !9
  %141 = load i32, ptr %22, align 4, !tbaa !9
  %142 = add nsw i32 %140, %141
  %143 = load i32, ptr %14, align 4, !tbaa !9
  %144 = icmp slt i32 %142, %143
  br i1 %144, label %145, label %236

145:                                              ; preds = %139
  %146 = load i32, ptr %21, align 4, !tbaa !9
  %147 = load i32, ptr %23, align 4, !tbaa !9
  %148 = add nsw i32 %146, %147
  %149 = icmp sge i32 %148, 0
  br i1 %149, label %150, label %236

150:                                              ; preds = %145
  %151 = load i32, ptr %21, align 4, !tbaa !9
  %152 = load i32, ptr %23, align 4, !tbaa !9
  %153 = add nsw i32 %151, %152
  %154 = load i32, ptr %13, align 4, !tbaa !9
  %155 = icmp slt i32 %153, %154
  br i1 %155, label %156, label %236

156:                                              ; preds = %150
  %157 = load i32, ptr %15, align 4, !tbaa !9
  %158 = icmp eq i32 %157, 3
  br i1 %158, label %159, label %216

159:                                              ; preds = %156
  %160 = getelementptr inbounds %struct.RGB_data, ptr %7, i32 0, i32 2
  %161 = load i8, ptr %160, align 1, !tbaa !20
  %162 = load ptr, ptr %17, align 8, !tbaa !5
  %163 = load i32, ptr %21, align 4, !tbaa !9
  %164 = load i32, ptr %23, align 4, !tbaa !9
  %165 = add nsw i32 %163, %164
  %166 = load i32, ptr %14, align 4, !tbaa !9
  %167 = mul nsw i32 %165, %166
  %168 = load i32, ptr %15, align 4, !tbaa !9
  %169 = mul nsw i32 %167, %168
  %170 = load i32, ptr %20, align 4, !tbaa !9
  %171 = load i32, ptr %22, align 4, !tbaa !9
  %172 = add nsw i32 %170, %171
  %173 = load i32, ptr %15, align 4, !tbaa !9
  %174 = mul nsw i32 %172, %173
  %175 = add nsw i32 %169, %174
  %176 = sext i32 %175 to i64
  %177 = getelementptr inbounds i8, ptr %162, i64 %176
  store i8 %161, ptr %177, align 1, !tbaa !22
  %178 = getelementptr inbounds %struct.RGB_data, ptr %7, i32 0, i32 1
  %179 = load i8, ptr %178, align 1, !tbaa !23
  %180 = load ptr, ptr %17, align 8, !tbaa !5
  %181 = load i32, ptr %21, align 4, !tbaa !9
  %182 = load i32, ptr %23, align 4, !tbaa !9
  %183 = add nsw i32 %181, %182
  %184 = load i32, ptr %14, align 4, !tbaa !9
  %185 = mul nsw i32 %183, %184
  %186 = load i32, ptr %15, align 4, !tbaa !9
  %187 = mul nsw i32 %185, %186
  %188 = load i32, ptr %20, align 4, !tbaa !9
  %189 = load i32, ptr %22, align 4, !tbaa !9
  %190 = add nsw i32 %188, %189
  %191 = load i32, ptr %15, align 4, !tbaa !9
  %192 = mul nsw i32 %190, %191
  %193 = add nsw i32 %187, %192
  %194 = add nsw i32 %193, 1
  %195 = sext i32 %194 to i64
  %196 = getelementptr inbounds i8, ptr %180, i64 %195
  store i8 %179, ptr %196, align 1, !tbaa !22
  %197 = getelementptr inbounds %struct.RGB_data, ptr %7, i32 0, i32 0
  %198 = load i8, ptr %197, align 1, !tbaa !24
  %199 = load ptr, ptr %17, align 8, !tbaa !5
  %200 = load i32, ptr %21, align 4, !tbaa !9
  %201 = load i32, ptr %23, align 4, !tbaa !9
  %202 = add nsw i32 %200, %201
  %203 = load i32, ptr %14, align 4, !tbaa !9
  %204 = mul nsw i32 %202, %203
  %205 = load i32, ptr %15, align 4, !tbaa !9
  %206 = mul nsw i32 %204, %205
  %207 = load i32, ptr %20, align 4, !tbaa !9
  %208 = load i32, ptr %22, align 4, !tbaa !9
  %209 = add nsw i32 %207, %208
  %210 = load i32, ptr %15, align 4, !tbaa !9
  %211 = mul nsw i32 %209, %210
  %212 = add nsw i32 %206, %211
  %213 = add nsw i32 %212, 2
  %214 = sext i32 %213 to i64
  %215 = getelementptr inbounds i8, ptr %199, i64 %214
  store i8 %198, ptr %215, align 1, !tbaa !22
  br label %235

216:                                              ; preds = %156
  %217 = load i32, ptr %15, align 4, !tbaa !9
  %218 = icmp eq i32 %217, 1
  br i1 %218, label %219, label %234

219:                                              ; preds = %216
  %220 = getelementptr inbounds %struct.RGB_data, ptr %7, i32 0, i32 0
  %221 = load i8, ptr %220, align 1, !tbaa !24
  %222 = load ptr, ptr %17, align 8, !tbaa !5
  %223 = load i32, ptr %21, align 4, !tbaa !9
  %224 = load i32, ptr %23, align 4, !tbaa !9
  %225 = add nsw i32 %223, %224
  %226 = load i32, ptr %14, align 4, !tbaa !9
  %227 = mul nsw i32 %225, %226
  %228 = load i32, ptr %20, align 4, !tbaa !9
  %229 = load i32, ptr %22, align 4, !tbaa !9
  %230 = add nsw i32 %228, %229
  %231 = add nsw i32 %227, %230
  %232 = sext i32 %231 to i64
  %233 = getelementptr inbounds i8, ptr %222, i64 %232
  store i8 %221, ptr %233, align 1, !tbaa !22
  br label %234

234:                                              ; preds = %219, %216
  br label %235

235:                                              ; preds = %234, %159
  br label %236

236:                                              ; preds = %235, %150, %145, %139, %134
  br label %237

237:                                              ; preds = %236
  %238 = load i32, ptr %23, align 4, !tbaa !9
  %239 = add nsw i32 %238, 1
  store i32 %239, ptr %23, align 4, !tbaa !9
  br label %128, !llvm.loop !25

240:                                              ; preds = %133
  br label %241

241:                                              ; preds = %240
  %242 = load i32, ptr %22, align 4, !tbaa !9
  %243 = add nsw i32 %242, 1
  store i32 %243, ptr %22, align 4, !tbaa !9
  br label %118, !llvm.loop !27

244:                                              ; preds = %123
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #6
  br label %245

245:                                              ; preds = %244
  %246 = load i32, ptr %18, align 4, !tbaa !9
  %247 = add nsw i32 %246, 1
  store i32 %247, ptr %18, align 4, !tbaa !9
  br label %97, !llvm.loop !28

248:                                              ; preds = %101
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #6
  ret void
}

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

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) #2

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

; 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) #4

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

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 = { noreturn 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 #3 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { noreturn nounwind }
attributes #6 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !10, i64 8}
!12 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !6, i64 24}
!13 = !{!12, !10, i64 0}
!14 = !{!12, !10, i64 4}
!15 = !{!12, !10, i64 12}
!16 = !{!12, !6, i64 24}
!17 = !{!18, !10, i64 0}
!18 = !{!"point", !10, i64 0, !10, i64 4}
!19 = !{!18, !10, i64 4}
!20 = !{!21, !7, i64 2}
!21 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2}
!22 = !{!7, !7, i64 0}
!23 = !{!21, !7, i64 1}
!24 = !{!21, !7, i64 0}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = distinct !{!27, !26}
!28 = distinct !{!28, !26}


; 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.point = type { i32, i32 }

@.str = external hidden unnamed_addr constant [8 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [29 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local void @draw_POINT(ptr noundef readonly %0, ptr noundef readonly %1, ptr nocapture noundef readonly %2, i32 noundef %3, i24 %4, i32 noundef %5) local_unnamed_addr #0 {
  %.sroa.0.0.extract.trunc = trunc i24 %4 to i8
  %.sroa.3.0.extract.shift = lshr i24 %4, 8
  %.sroa.3.0.extract.trunc = trunc i24 %.sroa.3.0.extract.shift to i8
  %.sroa.4.0.extract.shift = lshr i24 %4, 16
  %.sroa.4.0.extract.trunc = trunc nuw i24 %.sroa.4.0.extract.shift to i8
  %7 = icmp ne ptr %0, null
  %8 = icmp ne ptr %1, null
  %or.cond = and i1 %7, %8
  br i1 %or.cond, label %13, label %9

9:                                                ; preds = %6
  %10 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str)
  %11 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.1)
  %12 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2)
  tail call void @exit(i32 noundef 1) #4
  unreachable

13:                                               ; preds = %6
  %14 = getelementptr inbounds i8, ptr %0, i64 8
  %15 = load i32, ptr %14, align 8, !tbaa !5
  %16 = icmp eq i32 %15, 1
  br i1 %16, label %21, label %17

17:                                               ; preds = %13
  %18 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str)
  %19 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  %20 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2)
  tail call void @exit(i32 noundef 1) #4
  unreachable

21:                                               ; preds = %13
  %22 = load i32, ptr %0, align 8, !tbaa !11
  %23 = load i32, ptr %1, align 8, !tbaa !11
  %24 = icmp eq i32 %22, %23
  br i1 %24, label %25, label %37

25:                                               ; preds = %21
  %26 = getelementptr inbounds i8, ptr %0, i64 4
  %27 = load i32, ptr %26, align 4, !tbaa !12
  %28 = getelementptr inbounds i8, ptr %1, i64 4
  %29 = load i32, ptr %28, align 4, !tbaa !12
  %30 = icmp eq i32 %27, %29
  br i1 %30, label %31, label %37

31:                                               ; preds = %25
  %32 = getelementptr inbounds i8, ptr %0, i64 12
  %33 = load i32, ptr %32, align 4, !tbaa !13
  %.fr = freeze i32 %33
  %34 = getelementptr inbounds i8, ptr %1, i64 12
  %35 = load i32, ptr %34, align 4, !tbaa !13
  %36 = icmp eq i32 %.fr, %35
  br i1 %36, label %41, label %37

37:                                               ; preds = %31, %25, %21
  %38 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str)
  %39 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.4)
  %40 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2)
  tail call void @exit(i32 noundef 1) #4
  unreachable

41:                                               ; preds = %31
  %42 = getelementptr inbounds i8, ptr %0, i64 24
  %43 = load ptr, ptr %42, align 8, !tbaa !14
  %44 = getelementptr inbounds i8, ptr %1, i64 24
  %45 = load ptr, ptr %44, align 8, !tbaa !14
  %46 = mul nsw i32 %27, %22
  %47 = mul nsw i32 %46, %.fr
  %48 = sext i32 %47 to i64
  tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %45, ptr align 1 %43, i64 %48, i1 false)
  %49 = icmp sgt i32 %3, 0
  br i1 %49, label %.lr.ph, label %._crit_edge101

.lr.ph:                                           ; preds = %41
  %50 = sdiv i32 %5, -2
  %51 = sdiv i32 %5, 2
  %.not96 = icmp sgt i32 %50, %51
  br i1 %.not96, label %._crit_edge101, label %.preheader.lr.ph.preheader

.preheader.lr.ph.preheader:                       ; preds = %.lr.ph
  %52 = add nsw i32 %51, 1
  %53 = sext i32 %50 to i64
  %54 = sext i32 %22 to i64
  %wide.trip.count = zext nneg i32 %3 to i64
  %55 = sub nsw i32 %51, %50
  %56 = shl i32 %50, 1
  %57 = add nsw i32 %51, 1
  %58 = sub i32 %57, %50
  %min.iters.check = icmp ult i32 %58, 8
  %ident.check = icmp ne i32 %27, 1
  %min.iters.check116 = icmp ult i32 %58, 16
  %n.vec = and i32 %58, -16
  %.splatinsert = insertelement <16 x i32> poison, i32 %50, i64 0
  %.splat = shufflevector <16 x i32> %.splatinsert, <16 x i32> poison, <16 x i32> zeroinitializer
  %induction = add <16 x i32> %.splat, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
  %broadcast.splatinsert117 = insertelement <16 x i32> poison, i32 %22, i64 0
  %broadcast.splat118 = shufflevector <16 x i32> %broadcast.splatinsert117, <16 x i32> poison, <16 x i32> zeroinitializer
  %ind.end = add i32 %50, %n.vec
  %cmp.n = icmp eq i32 %58, %n.vec
  %ind.end152 = add i32 %50, %n.vec
  %n.vec.remaining = and i32 %58, 8
  %min.epilog.iters.check.not.not = icmp eq i32 %n.vec.remaining, 0
  %n.vec150 = and i32 %58, -8
  %ind.end151 = add i32 %50, %n.vec150
  %broadcast.splatinsert162 = insertelement <8 x i32> poison, i32 %22, i64 0
  %broadcast.splat163 = shufflevector <8 x i32> %broadcast.splatinsert162, <8 x i32> poison, <8 x i32> zeroinitializer
  %cmp.n181 = icmp eq i32 %58, %n.vec150
  br label %.preheader.lr.ph

._crit_edge101:                                   ; preds = %._crit_edge98.split, %.lr.ph, %41
  ret void

.preheader.lr.ph:                                 ; preds = %.preheader.lr.ph.preheader, %._crit_edge98.split
  %indvars.iv110 = phi i64 [ 0, %.preheader.lr.ph.preheader ], [ %indvars.iv.next111, %._crit_edge98.split ]
  %59 = getelementptr inbounds %struct.point, ptr %2, i64 %indvars.iv110
  %60 = load i32, ptr %59, align 4, !tbaa !15
  %61 = getelementptr inbounds i8, ptr %59, i64 4
  %62 = load i32, ptr %61, align 4, !tbaa !17
  %63 = sext i32 %62 to i64
  %64 = add i32 %56, %62
  %65 = add i32 %64, %60
  %broadcast.splatinsert = insertelement <16 x i32> poison, i32 %62, i64 0
  %broadcast.splat = shufflevector <16 x i32> %broadcast.splatinsert, <16 x i32> poison, <16 x i32> zeroinitializer
  %broadcast.splatinsert160 = insertelement <8 x i32> poison, i32 %62, i64 0
  %broadcast.splat161 = shufflevector <8 x i32> %broadcast.splatinsert160, <8 x i32> poison, <8 x i32> zeroinitializer
  br label %.preheader

.preheader:                                       ; preds = %.preheader.lr.ph, %._crit_edge
  %indvar = phi i32 [ 0, %.preheader.lr.ph ], [ %indvar.next, %._crit_edge ]
  %.07797 = phi i32 [ %50, %.preheader.lr.ph ], [ %249, %._crit_edge ]
  %66 = add i32 %65, %indvar
  %67 = add nsw i32 %.07797, %60
  %68 = icmp sgt i32 %67, -1
  %69 = icmp slt i32 %67, %27
  %or.cond88 = and i1 %68, %69
  br i1 %or.cond88, label %.lr.ph.split.us, label %._crit_edge

.lr.ph.split.us:                                  ; preds = %.preheader
  switch i32 %.fr, label %._crit_edge [
    i32 3, label %.lr.ph.split.us.split.us
    i32 1, label %iter.check
  ]

iter.check:                                       ; preds = %.lr.ph.split.us
  br i1 %min.iters.check, label %.lr.ph.split.us.split.us92.preheader, label %vector.scevcheck

vector.scevcheck:                                 ; preds = %iter.check
  %70 = xor i32 %66, -1
  %71 = icmp ugt i32 %55, %70
  %72 = or i1 %ident.check, %71
  br i1 %72, label %.lr.ph.split.us.split.us92.preheader, label %vector.main.loop.iter.check

vector.main.loop.iter.check:                      ; preds = %vector.scevcheck
  br i1 %min.iters.check116, label %vec.epilog.ph, label %vector.body

vector.body:                                      ; preds = %vector.main.loop.iter.check, %pred.store.continue148
  %index = phi i32 [ %index.next, %pred.store.continue148 ], [ 0, %vector.main.loop.iter.check ]
  %vec.ind = phi <16 x i32> [ %vec.ind.next, %pred.store.continue148 ], [ %induction, %vector.main.loop.iter.check ]
  %73 = add nsw <16 x i32> %vec.ind, %broadcast.splat
  %74 = icmp sgt <16 x i32> %73, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
  %75 = icmp slt <16 x i32> %73, %broadcast.splat118
  %76 = and <16 x i1> %74, %75
  %77 = extractelement <16 x i1> %76, i64 0
  br i1 %77, label %pred.store.if, label %pred.store.continue

pred.store.if:                                    ; preds = %vector.body
  %78 = extractelement <16 x i32> %73, i64 0
  %79 = add nuw nsw i32 %78, %67
  %80 = zext nneg i32 %79 to i64
  %81 = getelementptr inbounds i8, ptr %45, i64 %80
  store i8 %.sroa.0.0.extract.trunc, ptr %81, align 1, !tbaa !18
  br label %pred.store.continue

pred.store.continue:                              ; preds = %pred.store.if, %vector.body
  %82 = extractelement <16 x i1> %76, i64 1
  br i1 %82, label %pred.store.if119, label %pred.store.continue120

pred.store.if119:                                 ; preds = %pred.store.continue
  %83 = extractelement <16 x i32> %73, i64 1
  %84 = add nuw nsw i32 %83, %67
  %85 = zext nneg i32 %84 to i64
  %86 = getelementptr inbounds i8, ptr %45, i64 %85
  store i8 %.sroa.0.0.extract.trunc, ptr %86, align 1, !tbaa !18
  br label %pred.store.continue120

pred.store.continue120:                           ; preds = %pred.store.if119, %pred.store.continue
  %87 = extractelement <16 x i1> %76, i64 2
  br i1 %87, label %pred.store.if121, label %pred.store.continue122

pred.store.if121:                                 ; preds = %pred.store.continue120
  %88 = extractelement <16 x i32> %73, i64 2
  %89 = add nuw nsw i32 %88, %67
  %90 = zext nneg i32 %89 to i64
  %91 = getelementptr inbounds i8, ptr %45, i64 %90
  store i8 %.sroa.0.0.extract.trunc, ptr %91, align 1, !tbaa !18
  br label %pred.store.continue122

pred.store.continue122:                           ; preds = %pred.store.if121, %pred.store.continue120
  %92 = extractelement <16 x i1> %76, i64 3
  br i1 %92, label %pred.store.if123, label %pred.store.continue124

pred.store.if123:                                 ; preds = %pred.store.continue122
  %93 = extractelement <16 x i32> %73, i64 3
  %94 = add nuw nsw i32 %93, %67
  %95 = zext nneg i32 %94 to i64
  %96 = getelementptr inbounds i8, ptr %45, i64 %95
  store i8 %.sroa.0.0.extract.trunc, ptr %96, align 1, !tbaa !18
  br label %pred.store.continue124

pred.store.continue124:                           ; preds = %pred.store.if123, %pred.store.continue122
  %97 = extractelement <16 x i1> %76, i64 4
  br i1 %97, label %pred.store.if125, label %pred.store.continue126

pred.store.if125:                                 ; preds = %pred.store.continue124
  %98 = extractelement <16 x i32> %73, i64 4
  %99 = add nuw nsw i32 %98, %67
  %100 = zext nneg i32 %99 to i64
  %101 = getelementptr inbounds i8, ptr %45, i64 %100
  store i8 %.sroa.0.0.extract.trunc, ptr %101, align 1, !tbaa !18
  br label %pred.store.continue126

pred.store.continue126:                           ; preds = %pred.store.if125, %pred.store.continue124
  %102 = extractelement <16 x i1> %76, i64 5
  br i1 %102, label %pred.store.if127, label %pred.store.continue128

pred.store.if127:                                 ; preds = %pred.store.continue126
  %103 = extractelement <16 x i32> %73, i64 5
  %104 = add nuw nsw i32 %103, %67
  %105 = zext nneg i32 %104 to i64
  %106 = getelementptr inbounds i8, ptr %45, i64 %105
  store i8 %.sroa.0.0.extract.trunc, ptr %106, align 1, !tbaa !18
  br label %pred.store.continue128

pred.store.continue128:                           ; preds = %pred.store.if127, %pred.store.continue126
  %107 = extractelement <16 x i1> %76, i64 6
  br i1 %107, label %pred.store.if129, label %pred.store.continue130

pred.store.if129:                                 ; preds = %pred.store.continue128
  %108 = extractelement <16 x i32> %73, i64 6
  %109 = add nuw nsw i32 %108, %67
  %110 = zext nneg i32 %109 to i64
  %111 = getelementptr inbounds i8, ptr %45, i64 %110
  store i8 %.sroa.0.0.extract.trunc, ptr %111, align 1, !tbaa !18
  br label %pred.store.continue130

pred.store.continue130:                           ; preds = %pred.store.if129, %pred.store.continue128
  %112 = extractelement <16 x i1> %76, i64 7
  br i1 %112, label %pred.store.if131, label %pred.store.continue132

pred.store.if131:                                 ; preds = %pred.store.continue130
  %113 = extractelement <16 x i32> %73, i64 7
  %114 = add nuw nsw i32 %113, %67
  %115 = zext nneg i32 %114 to i64
  %116 = getelementptr inbounds i8, ptr %45, i64 %115
  store i8 %.sroa.0.0.extract.trunc, ptr %116, align 1, !tbaa !18
  br label %pred.store.continue132

pred.store.continue132:                           ; preds = %pred.store.if131, %pred.store.continue130
  %117 = extractelement <16 x i1> %76, i64 8
  br i1 %117, label %pred.store.if133, label %pred.store.continue134

pred.store.if133:                                 ; preds = %pred.store.continue132
  %118 = extractelement <16 x i32> %73, i64 8
  %119 = add nuw nsw i32 %118, %67
  %120 = zext nneg i32 %119 to i64
  %121 = getelementptr inbounds i8, ptr %45, i64 %120
  store i8 %.sroa.0.0.extract.trunc, ptr %121, align 1, !tbaa !18
  br label %pred.store.continue134

pred.store.continue134:                           ; preds = %pred.store.if133, %pred.store.continue132
  %122 = extractelement <16 x i1> %76, i64 9
  br i1 %122, label %pred.store.if135, label %pred.store.continue136

pred.store.if135:                                 ; preds = %pred.store.continue134
  %123 = extractelement <16 x i32> %73, i64 9
  %124 = add nuw nsw i32 %123, %67
  %125 = zext nneg i32 %124 to i64
  %126 = getelementptr inbounds i8, ptr %45, i64 %125
  store i8 %.sroa.0.0.extract.trunc, ptr %126, align 1, !tbaa !18
  br label %pred.store.continue136

pred.store.continue136:                           ; preds = %pred.store.if135, %pred.store.continue134
  %127 = extractelement <16 x i1> %76, i64 10
  br i1 %127, label %pred.store.if137, label %pred.store.continue138

pred.store.if137:                                 ; preds = %pred.store.continue136
  %128 = extractelement <16 x i32> %73, i64 10
  %129 = add nuw nsw i32 %128, %67
  %130 = zext nneg i32 %129 to i64
  %131 = getelementptr inbounds i8, ptr %45, i64 %130
  store i8 %.sroa.0.0.extract.trunc, ptr %131, align 1, !tbaa !18
  br label %pred.store.continue138

pred.store.continue138:                           ; preds = %pred.store.if137, %pred.store.continue136
  %132 = extractelement <16 x i1> %76, i64 11
  br i1 %132, label %pred.store.if139, label %pred.store.continue140

pred.store.if139:                                 ; preds = %pred.store.continue138
  %133 = extractelement <16 x i32> %73, i64 11
  %134 = add nuw nsw i32 %133, %67
  %135 = zext nneg i32 %134 to i64
  %136 = getelementptr inbounds i8, ptr %45, i64 %135
  store i8 %.sroa.0.0.extract.trunc, ptr %136, align 1, !tbaa !18
  br label %pred.store.continue140

pred.store.continue140:                           ; preds = %pred.store.if139, %pred.store.continue138
  %137 = extractelement <16 x i1> %76, i64 12
  br i1 %137, label %pred.store.if141, label %pred.store.continue142

pred.store.if141:                                 ; preds = %pred.store.continue140
  %138 = extractelement <16 x i32> %73, i64 12
  %139 = add nuw nsw i32 %138, %67
  %140 = zext nneg i32 %139 to i64
  %141 = getelementptr inbounds i8, ptr %45, i64 %140
  store i8 %.sroa.0.0.extract.trunc, ptr %141, align 1, !tbaa !18
  br label %pred.store.continue142

pred.store.continue142:                           ; preds = %pred.store.if141, %pred.store.continue140
  %142 = extractelement <16 x i1> %76, i64 13
  br i1 %142, label %pred.store.if143, label %pred.store.continue144

pred.store.if143:                                 ; preds = %pred.store.continue142
  %143 = extractelement <16 x i32> %73, i64 13
  %144 = add nuw nsw i32 %143, %67
  %145 = zext nneg i32 %144 to i64
  %146 = getelementptr inbounds i8, ptr %45, i64 %145
  store i8 %.sroa.0.0.extract.trunc, ptr %146, align 1, !tbaa !18
  br label %pred.store.continue144

pred.store.continue144:                           ; preds = %pred.store.if143, %pred.store.continue142
  %147 = extractelement <16 x i1> %76, i64 14
  br i1 %147, label %pred.store.if145, label %pred.store.continue146

pred.store.if145:                                 ; preds = %pred.store.continue144
  %148 = extractelement <16 x i32> %73, i64 14
  %149 = add nuw nsw i32 %148, %67
  %150 = zext nneg i32 %149 to i64
  %151 = getelementptr inbounds i8, ptr %45, i64 %150
  store i8 %.sroa.0.0.extract.trunc, ptr %151, align 1, !tbaa !18
  br label %pred.store.continue146

pred.store.continue146:                           ; preds = %pred.store.if145, %pred.store.continue144
  %152 = extractelement <16 x i1> %76, i64 15
  br i1 %152, label %pred.store.if147, label %pred.store.continue148

pred.store.if147:                                 ; preds = %pred.store.continue146
  %153 = extractelement <16 x i32> %73, i64 15
  %154 = add nuw nsw i32 %153, %67
  %155 = zext nneg i32 %154 to i64
  %156 = getelementptr inbounds i8, ptr %45, i64 %155
  store i8 %.sroa.0.0.extract.trunc, ptr %156, align 1, !tbaa !18
  br label %pred.store.continue148

pred.store.continue148:                           ; preds = %pred.store.if147, %pred.store.continue146
  %index.next = add nuw i32 %index, 16
  %vec.ind.next = add <16 x i32> %vec.ind, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
  %157 = icmp eq i32 %index.next, %n.vec
  br i1 %157, label %middle.block, label %vector.body, !llvm.loop !19

middle.block:                                     ; preds = %pred.store.continue148
  br i1 %cmp.n, label %._crit_edge, label %vec.epilog.iter.check

vec.epilog.iter.check:                            ; preds = %middle.block
  br i1 %min.epilog.iters.check.not.not, label %.lr.ph.split.us.split.us92.preheader, label %vec.epilog.ph

.lr.ph.split.us.split.us92.preheader:             ; preds = %vec.epilog.middle.block, %vector.scevcheck, %iter.check, %vec.epilog.iter.check
  %.091.us.us93.ph = phi i32 [ %50, %iter.check ], [ %50, %vector.scevcheck ], [ %ind.end152, %vec.epilog.iter.check ], [ %ind.end151, %vec.epilog.middle.block ]
  %158 = add i32 %51, %.091.us.us93.ph
  %159 = and i32 %158, 1
  %lcmp.mod.not.not = icmp eq i32 %159, 0
  br i1 %lcmp.mod.not.not, label %.lr.ph.split.us.split.us92.prol, label %.lr.ph.split.us.split.us92.prol.loopexit

.lr.ph.split.us.split.us92.prol:                  ; preds = %.lr.ph.split.us.split.us92.preheader
  %160 = add nsw i32 %.091.us.us93.ph, %62
  %161 = icmp sgt i32 %160, -1
  %162 = icmp slt i32 %160, %22
  %or.cond89.us.us94.prol = and i1 %161, %162
  br i1 %or.cond89.us.us94.prol, label %163, label %.lr.ph.split.us.split.us92.prol.loopexit.unr-lcssa

163:                                              ; preds = %.lr.ph.split.us.split.us92.prol
  %164 = mul nsw i32 %160, %27
  %165 = add nuw nsw i32 %164, %67
  %166 = zext nneg i32 %165 to i64
  %167 = getelementptr inbounds i8, ptr %45, i64 %166
  store i8 %.sroa.0.0.extract.trunc, ptr %167, align 1, !tbaa !18
  br label %.lr.ph.split.us.split.us92.prol.loopexit.unr-lcssa

.lr.ph.split.us.split.us92.prol.loopexit.unr-lcssa: ; preds = %163, %.lr.ph.split.us.split.us92.prol
  %168 = add i32 %.091.us.us93.ph, 1
  br label %.lr.ph.split.us.split.us92.prol.loopexit

.lr.ph.split.us.split.us92.prol.loopexit:         ; preds = %.lr.ph.split.us.split.us92.prol.loopexit.unr-lcssa, %.lr.ph.split.us.split.us92.preheader
  %.091.us.us93.unr = phi i32 [ %.091.us.us93.ph, %.lr.ph.split.us.split.us92.preheader ], [ %168, %.lr.ph.split.us.split.us92.prol.loopexit.unr-lcssa ]
  %169 = icmp eq i32 %51, %.091.us.us93.ph
  br i1 %169, label %._crit_edge, label %.lr.ph.split.us.split.us92

vec.epilog.ph:                                    ; preds = %vector.main.loop.iter.check, %vec.epilog.iter.check
  %bc.resume.val = phi i32 [ %ind.end, %vec.epilog.iter.check ], [ %50, %vector.main.loop.iter.check ]
  %vec.epilog.resume.val = phi i32 [ %n.vec, %vec.epilog.iter.check ], [ 0, %vector.main.loop.iter.check ]
  %.splatinsert155 = insertelement <8 x i32> poison, i32 %bc.resume.val, i64 0
  %.splat156 = shufflevector <8 x i32> %.splatinsert155, <8 x i32> poison, <8 x i32> zeroinitializer
  %induction157 = add <8 x i32> %.splat156, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
  br label %vec.epilog.vector.body

vec.epilog.vector.body:                           ; preds = %pred.store.continue179, %vec.epilog.ph
  %index154 = phi i32 [ %vec.epilog.resume.val, %vec.epilog.ph ], [ %index.next180, %pred.store.continue179 ]
  %vec.ind158 = phi <8 x i32> [ %induction157, %vec.epilog.ph ], [ %vec.ind.next159, %pred.store.continue179 ]
  %170 = add nsw <8 x i32> %vec.ind158, %broadcast.splat161
  %171 = icmp sgt <8 x i32> %170, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
  %172 = icmp slt <8 x i32> %170, %broadcast.splat163
  %173 = and <8 x i1> %171, %172
  %174 = extractelement <8 x i1> %173, i64 0
  br i1 %174, label %pred.store.if164, label %pred.store.continue165

pred.store.if164:                                 ; preds = %vec.epilog.vector.body
  %175 = extractelement <8 x i32> %170, i64 0
  %176 = add nuw nsw i32 %175, %67
  %177 = zext nneg i32 %176 to i64
  %178 = getelementptr inbounds i8, ptr %45, i64 %177
  store i8 %.sroa.0.0.extract.trunc, ptr %178, align 1, !tbaa !18
  br label %pred.store.continue165

pred.store.continue165:                           ; preds = %pred.store.if164, %vec.epilog.vector.body
  %179 = extractelement <8 x i1> %173, i64 1
  br i1 %179, label %pred.store.if166, label %pred.store.continue167

pred.store.if166:                                 ; preds = %pred.store.continue165
  %180 = extractelement <8 x i32> %170, i64 1
  %181 = add nuw nsw i32 %180, %67
  %182 = zext nneg i32 %181 to i64
  %183 = getelementptr inbounds i8, ptr %45, i64 %182
  store i8 %.sroa.0.0.extract.trunc, ptr %183, align 1, !tbaa !18
  br label %pred.store.continue167

pred.store.continue167:                           ; preds = %pred.store.if166, %pred.store.continue165
  %184 = extractelement <8 x i1> %173, i64 2
  br i1 %184, label %pred.store.if168, label %pred.store.continue169

pred.store.if168:                                 ; preds = %pred.store.continue167
  %185 = extractelement <8 x i32> %170, i64 2
  %186 = add nuw nsw i32 %185, %67
  %187 = zext nneg i32 %186 to i64
  %188 = getelementptr inbounds i8, ptr %45, i64 %187
  store i8 %.sroa.0.0.extract.trunc, ptr %188, align 1, !tbaa !18
  br label %pred.store.continue169

pred.store.continue169:                           ; preds = %pred.store.if168, %pred.store.continue167
  %189 = extractelement <8 x i1> %173, i64 3
  br i1 %189, label %pred.store.if170, label %pred.store.continue171

pred.store.if170:                                 ; preds = %pred.store.continue169
  %190 = extractelement <8 x i32> %170, i64 3
  %191 = add nuw nsw i32 %190, %67
  %192 = zext nneg i32 %191 to i64
  %193 = getelementptr inbounds i8, ptr %45, i64 %192
  store i8 %.sroa.0.0.extract.trunc, ptr %193, align 1, !tbaa !18
  br label %pred.store.continue171

pred.store.continue171:                           ; preds = %pred.store.if170, %pred.store.continue169
  %194 = extractelement <8 x i1> %173, i64 4
  br i1 %194, label %pred.store.if172, label %pred.store.continue173

pred.store.if172:                                 ; preds = %pred.store.continue171
  %195 = extractelement <8 x i32> %170, i64 4
  %196 = add nuw nsw i32 %195, %67
  %197 = zext nneg i32 %196 to i64
  %198 = getelementptr inbounds i8, ptr %45, i64 %197
  store i8 %.sroa.0.0.extract.trunc, ptr %198, align 1, !tbaa !18
  br label %pred.store.continue173

pred.store.continue173:                           ; preds = %pred.store.if172, %pred.store.continue171
  %199 = extractelement <8 x i1> %173, i64 5
  br i1 %199, label %pred.store.if174, label %pred.store.continue175

pred.store.if174:                                 ; preds = %pred.store.continue173
  %200 = extractelement <8 x i32> %170, i64 5
  %201 = add nuw nsw i32 %200, %67
  %202 = zext nneg i32 %201 to i64
  %203 = getelementptr inbounds i8, ptr %45, i64 %202
  store i8 %.sroa.0.0.extract.trunc, ptr %203, align 1, !tbaa !18
  br label %pred.store.continue175

pred.store.continue175:                           ; preds = %pred.store.if174, %pred.store.continue173
  %204 = extractelement <8 x i1> %173, i64 6
  br i1 %204, label %pred.store.if176, label %pred.store.continue177

pred.store.if176:                                 ; preds = %pred.store.continue175
  %205 = extractelement <8 x i32> %170, i64 6
  %206 = add nuw nsw i32 %205, %67
  %207 = zext nneg i32 %206 to i64
  %208 = getelementptr inbounds i8, ptr %45, i64 %207
  store i8 %.sroa.0.0.extract.trunc, ptr %208, align 1, !tbaa !18
  br label %pred.store.continue177

pred.store.continue177:                           ; preds = %pred.store.if176, %pred.store.continue175
  %209 = extractelement <8 x i1> %173, i64 7
  br i1 %209, label %pred.store.if178, label %pred.store.continue179

pred.store.if178:                                 ; preds = %pred.store.continue177
  %210 = extractelement <8 x i32> %170, i64 7
  %211 = add nuw nsw i32 %210, %67
  %212 = zext nneg i32 %211 to i64
  %213 = getelementptr inbounds i8, ptr %45, i64 %212
  store i8 %.sroa.0.0.extract.trunc, ptr %213, align 1, !tbaa !18
  br label %pred.store.continue179

pred.store.continue179:                           ; preds = %pred.store.if178, %pred.store.continue177
  %index.next180 = add nuw i32 %index154, 8
  %vec.ind.next159 = add <8 x i32> %vec.ind158, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
  %214 = icmp eq i32 %index.next180, %n.vec150
  br i1 %214, label %vec.epilog.middle.block, label %vec.epilog.vector.body, !llvm.loop !23

vec.epilog.middle.block:                          ; preds = %pred.store.continue179
  br i1 %cmp.n181, label %._crit_edge, label %.lr.ph.split.us.split.us92.preheader

.lr.ph.split.us.split.us:                         ; preds = %.lr.ph.split.us, %229
  %indvars.iv = phi i64 [ %indvars.iv.next, %229 ], [ %53, %.lr.ph.split.us ]
  %215 = add nsw i64 %indvars.iv, %63
  %216 = icmp sgt i64 %215, -1
  %217 = icmp slt i64 %215, %54
  %or.cond89.us.us = and i1 %216, %217
  br i1 %or.cond89.us.us, label %218, label %229

218:                                              ; preds = %.lr.ph.split.us.split.us
  %219 = trunc i64 %215 to i32
  %220 = mul i32 %27, %219
  %221 = add i32 %220, %67
  %222 = mul i32 %221, 3
  %223 = zext nneg i32 %222 to i64
  %224 = getelementptr inbounds i8, ptr %45, i64 %223
  store i8 %.sroa.4.0.extract.trunc, ptr %224, align 1, !tbaa !18
  %225 = sext i32 %222 to i64
  %226 = getelementptr i8, ptr %45, i64 %225
  %227 = getelementptr i8, ptr %226, i64 1
  store i8 %.sroa.3.0.extract.trunc, ptr %227, align 1, !tbaa !18
  %228 = getelementptr i8, ptr %226, i64 2
  store i8 %.sroa.0.0.extract.trunc, ptr %228, align 1, !tbaa !18
  br label %229

229:                                              ; preds = %218, %.lr.ph.split.us.split.us
  %indvars.iv.next = add nsw i64 %indvars.iv, 1
  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  %exitcond108.not = icmp eq i32 %52, %lftr.wideiv
  br i1 %exitcond108.not, label %._crit_edge, label %.lr.ph.split.us.split.us, !llvm.loop !24

.lr.ph.split.us.split.us92:                       ; preds = %.lr.ph.split.us.split.us92.prol.loopexit, %247
  %.091.us.us93 = phi i32 [ %248, %247 ], [ %.091.us.us93.unr, %.lr.ph.split.us.split.us92.prol.loopexit ]
  %230 = add nsw i32 %.091.us.us93, %62
  %231 = icmp sgt i32 %230, -1
  %232 = icmp slt i32 %230, %22
  %or.cond89.us.us94 = and i1 %231, %232
  br i1 %or.cond89.us.us94, label %233, label %.lr.ph.split.us.split.us92.1

233:                                              ; preds = %.lr.ph.split.us.split.us92
  %234 = mul nsw i32 %230, %27
  %235 = add nuw nsw i32 %234, %67
  %236 = zext nneg i32 %235 to i64
  %237 = getelementptr inbounds i8, ptr %45, i64 %236
  store i8 %.sroa.0.0.extract.trunc, ptr %237, align 1, !tbaa !18
  br label %.lr.ph.split.us.split.us92.1

.lr.ph.split.us.split.us92.1:                     ; preds = %233, %.lr.ph.split.us.split.us92
  %238 = add i32 %.091.us.us93, 1
  %239 = add nsw i32 %238, %62
  %240 = icmp sgt i32 %239, -1
  %241 = icmp slt i32 %239, %22
  %or.cond89.us.us94.1 = and i1 %240, %241
  br i1 %or.cond89.us.us94.1, label %242, label %247

242:                                              ; preds = %.lr.ph.split.us.split.us92.1
  %243 = mul nsw i32 %239, %27
  %244 = add nuw nsw i32 %243, %67
  %245 = zext nneg i32 %244 to i64
  %246 = getelementptr inbounds i8, ptr %45, i64 %245
  store i8 %.sroa.0.0.extract.trunc, ptr %246, align 1, !tbaa !18
  br label %247

247:                                              ; preds = %242, %.lr.ph.split.us.split.us92.1
  %248 = add i32 %.091.us.us93, 2
  %exitcond.not.1 = icmp eq i32 %238, %51
  br i1 %exitcond.not.1, label %._crit_edge, label %.lr.ph.split.us.split.us92, !llvm.loop !25

._crit_edge98.split:                              ; preds = %._crit_edge
  %indvars.iv.next111 = add nuw nsw i64 %indvars.iv110, 1
  %exitcond113.not = icmp eq i64 %indvars.iv.next111, %wide.trip.count
  br i1 %exitcond113.not, label %._crit_edge101, label %.preheader.lr.ph, !llvm.loop !26

._crit_edge:                                      ; preds = %.lr.ph.split.us.split.us92.prol.loopexit, %247, %229, %middle.block, %vec.epilog.middle.block, %.lr.ph.split.us, %.preheader
  %249 = add i32 %.07797, 1
  %exitcond109.not = icmp eq i32 %.07797, %51
  %indvar.next = add i32 %indvar, 1
  br i1 %exitcond109.not, label %._crit_edge98.split, label %.preheader, !llvm.loop !27
}

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

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) local_unnamed_addr #2

; Function Attrs: mustprogress 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) #3

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 = { 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 = { noreturn 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 #3 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { noreturn 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, !7, i64 8}
!6 = !{!"", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !10, i64 24}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!6, !7, i64 0}
!12 = !{!6, !7, i64 4}
!13 = !{!6, !7, i64 12}
!14 = !{!6, !10, i64 24}
!15 = !{!16, !7, i64 0}
!16 = !{!"point", !7, i64 0, !7, i64 4}
!17 = !{!16, !7, i64 4}
!18 = !{!8, !8, i64 0}
!19 = distinct !{!19, !20, !21, !22}
!20 = !{!"llvm.loop.mustprogress"}
!21 = !{!"llvm.loop.isvectorized", i32 1}
!22 = !{!"llvm.loop.unroll.runtime.disable"}
!23 = distinct !{!23, !20, !21, !22}
!24 = distinct !{!24, !20}
!25 = distinct !{!25, !20, !21}
!26 = distinct !{!26, !20}
!27 = distinct !{!27, !20}


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