; LLVM IR from lfarcaro/ARINC653_ARMV7A_AM335X :: Hardware (cpsw)

; 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.cpswContext = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [3 x i32], [3072 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [8192 x i32] }

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

; 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 memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: nounwind uwtable
define dso_local void @CPSWContextRestore(ptr noundef %0) #0 {
  %2 = alloca ptr, align 8
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #2
  %5 = load ptr, ptr %2, align 8, !tbaa !5
  %6 = getelementptr inbounds %struct.cpswContext, ptr %5, i32 0, i32 5
  %7 = load i32, ptr %6, align 4, !tbaa !9
  %8 = zext i32 %7 to i64
  %9 = inttoptr i64 %8 to ptr
  store ptr %9, ptr %4, align 8, !tbaa !5
  store i32 0, ptr %3, align 4, !tbaa !12
  br label %10

10:                                               ; preds = %21, %1
  %11 = load i32, ptr %3, align 4, !tbaa !12
  %12 = icmp ult i32 %11, 2048
  br i1 %12, label %13, label %26

13:                                               ; preds = %10
  %14 = load ptr, ptr %2, align 8, !tbaa !5
  %15 = getelementptr inbounds %struct.cpswContext, ptr %14, i32 0, i32 31
  %16 = load i32, ptr %3, align 4, !tbaa !12
  %17 = zext i32 %16 to i64
  %18 = getelementptr inbounds [8192 x i32], ptr %15, i64 0, i64 %17
  %19 = load i32, ptr %18, align 4, !tbaa !12
  %20 = load ptr, ptr %4, align 8, !tbaa !5
  store i32 %19, ptr %20, align 4, !tbaa !12
  br label %21

21:                                               ; preds = %13
  %22 = load i32, ptr %3, align 4, !tbaa !12
  %23 = add i32 %22, 1
  store i32 %23, ptr %3, align 4, !tbaa !12
  %24 = load ptr, ptr %4, align 8, !tbaa !5
  %25 = getelementptr inbounds i32, ptr %24, i32 1
  store ptr %25, ptr %4, align 8, !tbaa !5
  br label %10, !llvm.loop !13

26:                                               ; preds = %10
  %27 = load ptr, ptr %2, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.cpswContext, ptr %27, i32 0, i32 9
  %29 = load i32, ptr %28, align 4, !tbaa !15
  %30 = load ptr, ptr %2, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.cpswContext, ptr %30, i32 0, i32 0
  %32 = load i32, ptr %31, align 4, !tbaa !16
  %33 = add i32 %32, 8
  %34 = zext i32 %33 to i64
  %35 = inttoptr i64 %34 to ptr
  store volatile i32 %29, ptr %35, align 4, !tbaa !12
  %36 = load ptr, ptr %2, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.cpswContext, ptr %36, i32 0, i32 10
  %38 = getelementptr inbounds [3 x i32], ptr %37, i64 0, i64 0
  %39 = load i32, ptr %38, align 4, !tbaa !12
  %40 = load ptr, ptr %2, align 8, !tbaa !5
  %41 = getelementptr inbounds %struct.cpswContext, ptr %40, i32 0, i32 0
  %42 = load i32, ptr %41, align 4, !tbaa !16
  %43 = add i32 %42, 64
  %44 = zext i32 %43 to i64
  %45 = inttoptr i64 %44 to ptr
  store volatile i32 %39, ptr %45, align 4, !tbaa !12
  %46 = load ptr, ptr %2, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.cpswContext, ptr %46, i32 0, i32 10
  %48 = getelementptr inbounds [3 x i32], ptr %47, i64 0, i64 1
  %49 = load i32, ptr %48, align 4, !tbaa !12
  %50 = load ptr, ptr %2, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.cpswContext, ptr %50, i32 0, i32 0
  %52 = load i32, ptr %51, align 4, !tbaa !16
  %53 = add i32 %52, 68
  %54 = zext i32 %53 to i64
  %55 = inttoptr i64 %54 to ptr
  store volatile i32 %49, ptr %55, align 4, !tbaa !12
  %56 = load ptr, ptr %2, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.cpswContext, ptr %56, i32 0, i32 10
  %58 = getelementptr inbounds [3 x i32], ptr %57, i64 0, i64 2
  %59 = load i32, ptr %58, align 4, !tbaa !12
  %60 = load ptr, ptr %2, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.cpswContext, ptr %60, i32 0, i32 0
  %62 = load i32, ptr %61, align 4, !tbaa !16
  %63 = add i32 %62, 72
  %64 = zext i32 %63 to i64
  %65 = inttoptr i64 %64 to ptr
  store volatile i32 %59, ptr %65, align 4, !tbaa !12
  store i32 0, ptr %3, align 4, !tbaa !12
  br label %66

66:                                               ; preds = %80, %26
  %67 = load i32, ptr %3, align 4, !tbaa !12
  %68 = icmp ult i32 %67, 1024
  br i1 %68, label %69, label %83

69:                                               ; preds = %66
  %70 = load ptr, ptr %2, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.cpswContext, ptr %70, i32 0, i32 0
  %72 = load i32, ptr %71, align 4, !tbaa !16
  %73 = load i32, ptr %3, align 4, !tbaa !12
  %74 = load ptr, ptr %2, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct.cpswContext, ptr %74, i32 0, i32 11
  %76 = load i32, ptr %3, align 4, !tbaa !12
  %77 = mul i32 %76, 3
  %78 = zext i32 %77 to i64
  %79 = getelementptr inbounds [3072 x i32], ptr %75, i64 0, i64 %78
  call void @CPSWALETableEntrySet(i32 noundef %72, i32 noundef %73, ptr noundef %79)
  br label %80

80:                                               ; preds = %69
  %81 = load i32, ptr %3, align 4, !tbaa !12
  %82 = add i32 %81, 1
  store i32 %82, ptr %3, align 4, !tbaa !12
  br label %66, !llvm.loop !17

83:                                               ; preds = %66
  %84 = load ptr, ptr %2, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.cpswContext, ptr %84, i32 0, i32 12
  %86 = load i32, ptr %85, align 4, !tbaa !18
  %87 = load ptr, ptr %2, align 8, !tbaa !5
  %88 = getelementptr inbounds %struct.cpswContext, ptr %87, i32 0, i32 1
  %89 = load i32, ptr %88, align 4, !tbaa !19
  %90 = add i32 %89, 12
  %91 = zext i32 %90 to i64
  %92 = inttoptr i64 %91 to ptr
  store volatile i32 %86, ptr %92, align 4, !tbaa !12
  %93 = load ptr, ptr %2, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.cpswContext, ptr %93, i32 0, i32 13
  %95 = load i32, ptr %94, align 4, !tbaa !20
  %96 = load ptr, ptr %2, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.cpswContext, ptr %96, i32 0, i32 2
  %98 = load i32, ptr %97, align 4, !tbaa !21
  %99 = add i32 %98, 36
  %100 = zext i32 %99 to i64
  %101 = inttoptr i64 %100 to ptr
  store volatile i32 %95, ptr %101, align 4, !tbaa !12
  %102 = load ptr, ptr %2, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct.cpswContext, ptr %102, i32 0, i32 14
  %104 = load i32, ptr %103, align 4, !tbaa !22
  %105 = load ptr, ptr %2, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.cpswContext, ptr %105, i32 0, i32 2
  %107 = load i32, ptr %106, align 4, !tbaa !21
  %108 = add i32 %107, 32
  %109 = zext i32 %108 to i64
  %110 = inttoptr i64 %109 to ptr
  store volatile i32 %104, ptr %110, align 4, !tbaa !12
  %111 = load ptr, ptr %2, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.cpswContext, ptr %111, i32 0, i32 15
  %113 = load i32, ptr %112, align 4, !tbaa !23
  %114 = load ptr, ptr %2, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.cpswContext, ptr %114, i32 0, i32 3
  %116 = load i32, ptr %115, align 4, !tbaa !24
  %117 = add i32 %116, 36
  %118 = zext i32 %117 to i64
  %119 = inttoptr i64 %118 to ptr
  store volatile i32 %113, ptr %119, align 4, !tbaa !12
  %120 = load ptr, ptr %2, align 8, !tbaa !5
  %121 = getelementptr inbounds %struct.cpswContext, ptr %120, i32 0, i32 16
  %122 = load i32, ptr %121, align 4, !tbaa !25
  %123 = load ptr, ptr %2, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct.cpswContext, ptr %123, i32 0, i32 3
  %125 = load i32, ptr %124, align 4, !tbaa !24
  %126 = add i32 %125, 32
  %127 = zext i32 %126 to i64
  %128 = inttoptr i64 %127 to ptr
  store volatile i32 %122, ptr %128, align 4, !tbaa !12
  %129 = load ptr, ptr %2, align 8, !tbaa !5
  %130 = getelementptr inbounds %struct.cpswContext, ptr %129, i32 0, i32 17
  %131 = load i32, ptr %130, align 4, !tbaa !26
  %132 = load ptr, ptr %2, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.cpswContext, ptr %132, i32 0, i32 2
  %134 = load i32, ptr %133, align 4, !tbaa !21
  %135 = add i32 %134, 16
  %136 = zext i32 %135 to i64
  %137 = inttoptr i64 %136 to ptr
  store volatile i32 %131, ptr %137, align 4, !tbaa !12
  %138 = load ptr, ptr %2, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.cpswContext, ptr %138, i32 0, i32 19
  %140 = load i32, ptr %139, align 4, !tbaa !27
  %141 = load ptr, ptr %2, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.cpswContext, ptr %141, i32 0, i32 3
  %143 = load i32, ptr %142, align 4, !tbaa !24
  %144 = add i32 %143, 16
  %145 = zext i32 %144 to i64
  %146 = inttoptr i64 %145 to ptr
  store volatile i32 %140, ptr %146, align 4, !tbaa !12
  %147 = load ptr, ptr %2, align 8, !tbaa !5
  %148 = getelementptr inbounds %struct.cpswContext, ptr %147, i32 0, i32 18
  %149 = load i32, ptr %148, align 4, !tbaa !28
  %150 = load ptr, ptr %2, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.cpswContext, ptr %150, i32 0, i32 2
  %152 = load i32, ptr %151, align 4, !tbaa !21
  %153 = add i32 %152, 20
  %154 = zext i32 %153 to i64
  %155 = inttoptr i64 %154 to ptr
  store volatile i32 %149, ptr %155, align 4, !tbaa !12
  %156 = load ptr, ptr %2, align 8, !tbaa !5
  %157 = getelementptr inbounds %struct.cpswContext, ptr %156, i32 0, i32 20
  %158 = load i32, ptr %157, align 4, !tbaa !29
  %159 = load ptr, ptr %2, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.cpswContext, ptr %159, i32 0, i32 3
  %161 = load i32, ptr %160, align 4, !tbaa !24
  %162 = add i32 %161, 20
  %163 = zext i32 %162 to i64
  %164 = inttoptr i64 %163 to ptr
  store volatile i32 %158, ptr %164, align 4, !tbaa !12
  %165 = load ptr, ptr %2, align 8, !tbaa !5
  %166 = getelementptr inbounds %struct.cpswContext, ptr %165, i32 0, i32 21
  %167 = load i32, ptr %166, align 4, !tbaa !30
  %168 = load ptr, ptr %2, align 8, !tbaa !5
  %169 = getelementptr inbounds %struct.cpswContext, ptr %168, i32 0, i32 4
  %170 = load i32, ptr %169, align 4, !tbaa !31
  %171 = add i32 %170, 224
  %172 = zext i32 %171 to i64
  %173 = inttoptr i64 %172 to ptr
  store volatile i32 %167, ptr %173, align 4, !tbaa !12
  %174 = load ptr, ptr %2, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.cpswContext, ptr %174, i32 0, i32 22
  %176 = load i32, ptr %175, align 4, !tbaa !32
  %177 = load ptr, ptr %2, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.cpswContext, ptr %177, i32 0, i32 4
  %179 = load i32, ptr %178, align 4, !tbaa !31
  %180 = add i32 %179, 4
  %181 = zext i32 %180 to i64
  %182 = inttoptr i64 %181 to ptr
  store volatile i32 %176, ptr %182, align 4, !tbaa !12
  %183 = load ptr, ptr %2, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.cpswContext, ptr %183, i32 0, i32 23
  %185 = load i32, ptr %184, align 4, !tbaa !33
  %186 = load ptr, ptr %2, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct.cpswContext, ptr %186, i32 0, i32 4
  %188 = load i32, ptr %187, align 4, !tbaa !31
  %189 = add i32 %188, 20
  %190 = zext i32 %189 to i64
  %191 = inttoptr i64 %190 to ptr
  store volatile i32 %185, ptr %191, align 4, !tbaa !12
  %192 = load ptr, ptr %2, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.cpswContext, ptr %192, i32 0, i32 24
  %194 = load i32, ptr %193, align 4, !tbaa !34
  %195 = load ptr, ptr %2, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.cpswContext, ptr %195, i32 0, i32 4
  %197 = load i32, ptr %196, align 4, !tbaa !31
  %198 = add i32 %197, 544
  %199 = zext i32 %198 to i64
  %200 = inttoptr i64 %199 to ptr
  store volatile i32 %194, ptr %200, align 4, !tbaa !12
  %201 = load ptr, ptr %2, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.cpswContext, ptr %201, i32 0, i32 25
  %203 = load i32, ptr %202, align 4, !tbaa !35
  %204 = load ptr, ptr %2, align 8, !tbaa !5
  %205 = getelementptr inbounds %struct.cpswContext, ptr %204, i32 0, i32 4
  %206 = load i32, ptr %205, align 4, !tbaa !31
  %207 = add i32 %206, 136
  %208 = zext i32 %207 to i64
  %209 = inttoptr i64 %208 to ptr
  store volatile i32 %203, ptr %209, align 4, !tbaa !12
  %210 = load ptr, ptr %2, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.cpswContext, ptr %210, i32 0, i32 27
  %212 = load i32, ptr %211, align 4, !tbaa !36
  %213 = load ptr, ptr %2, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.cpswContext, ptr %213, i32 0, i32 6
  %215 = load i32, ptr %214, align 4, !tbaa !37
  %216 = add i32 %215, 16
  %217 = add i32 %216, 4
  %218 = zext i32 %217 to i64
  %219 = inttoptr i64 %218 to ptr
  store volatile i32 %212, ptr %219, align 4, !tbaa !12
  %220 = load ptr, ptr %2, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.cpswContext, ptr %220, i32 0, i32 26
  %222 = load i32, ptr %221, align 4, !tbaa !38
  %223 = load ptr, ptr %2, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.cpswContext, ptr %223, i32 0, i32 4
  %225 = load i32, ptr %224, align 4, !tbaa !31
  %226 = add i32 %225, 168
  %227 = zext i32 %226 to i64
  %228 = inttoptr i64 %227 to ptr
  store volatile i32 %222, ptr %228, align 4, !tbaa !12
  %229 = load ptr, ptr %2, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.cpswContext, ptr %229, i32 0, i32 28
  %231 = load i32, ptr %230, align 4, !tbaa !39
  %232 = load ptr, ptr %2, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.cpswContext, ptr %232, i32 0, i32 6
  %234 = load i32, ptr %233, align 4, !tbaa !37
  %235 = add i32 %234, 16
  %236 = add i32 %235, 8
  %237 = zext i32 %236 to i64
  %238 = inttoptr i64 %237 to ptr
  store volatile i32 %231, ptr %238, align 4, !tbaa !12
  %239 = load ptr, ptr %2, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.cpswContext, ptr %239, i32 0, i32 29
  %241 = load i32, ptr %240, align 4, !tbaa !40
  %242 = load ptr, ptr %2, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.cpswContext, ptr %242, i32 0, i32 7
  %244 = load i32, ptr %243, align 4, !tbaa !41
  %245 = add i32 %244, 4
  %246 = zext i32 %245 to i64
  %247 = inttoptr i64 %246 to ptr
  store volatile i32 %241, ptr %247, align 4, !tbaa !12
  %248 = load ptr, ptr %2, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.cpswContext, ptr %248, i32 0, i32 30
  %250 = load i32, ptr %249, align 4, !tbaa !42
  %251 = load ptr, ptr %2, align 8, !tbaa !5
  %252 = getelementptr inbounds %struct.cpswContext, ptr %251, i32 0, i32 8
  %253 = load i32, ptr %252, align 4, !tbaa !43
  %254 = add i32 %253, 4
  %255 = zext i32 %254 to i64
  %256 = inttoptr i64 %255 to ptr
  store volatile i32 %250, ptr %256, align 4, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #2
  ret void
}

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 = { 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, !11, i64 20}
!10 = !{!"cpswContext", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !7, i64 40, !7, i64 52, !11, i64 12340, !11, i64 12344, !11, i64 12348, !11, i64 12352, !11, i64 12356, !11, i64 12360, !11, i64 12364, !11, i64 12368, !11, i64 12372, !11, i64 12376, !11, i64 12380, !11, i64 12384, !11, i64 12388, !11, i64 12392, !11, i64 12396, !11, i64 12400, !11, i64 12404, !11, i64 12408, !11, i64 12412, !7, i64 12416}
!11 = !{!"int", !7, i64 0}
!12 = !{!11, !11, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!10, !11, i64 36}
!16 = !{!10, !11, i64 0}
!17 = distinct !{!17, !14}
!18 = !{!10, !11, i64 12340}
!19 = !{!10, !11, i64 4}
!20 = !{!10, !11, i64 12344}
!21 = !{!10, !11, i64 8}
!22 = !{!10, !11, i64 12348}
!23 = !{!10, !11, i64 12352}
!24 = !{!10, !11, i64 12}
!25 = !{!10, !11, i64 12356}
!26 = !{!10, !11, i64 12360}
!27 = !{!10, !11, i64 12368}
!28 = !{!10, !11, i64 12364}
!29 = !{!10, !11, i64 12372}
!30 = !{!10, !11, i64 12376}
!31 = !{!10, !11, i64 16}
!32 = !{!10, !11, i64 12380}
!33 = !{!10, !11, i64 12384}
!34 = !{!10, !11, i64 12388}
!35 = !{!10, !11, i64 12392}
!36 = !{!10, !11, i64 12400}
!37 = !{!10, !11, i64 24}
!38 = !{!10, !11, i64 12396}
!39 = !{!10, !11, i64 12404}
!40 = !{!10, !11, i64 12408}
!41 = !{!10, !11, i64 28}
!42 = !{!10, !11, i64 12412}
!43 = !{!10, !11, i64 32}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

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

; Function Attrs: nounwind uwtable
define dso_local void @CPSWContextRestore(ptr noundef %0) local_unnamed_addr #0 {
vector.memcheck:
  %1 = getelementptr inbounds i8, ptr %0, i64 20
  %2 = load i32, ptr %1, align 4, !tbaa !5
  %3 = zext i32 %2 to i64
  %4 = inttoptr i64 %3 to ptr
  %5 = getelementptr inbounds i8, ptr %0, i64 12416
  %6 = ptrtoint ptr %0 to i64
  %7 = add nsw i64 %3, -12416
  %8 = sub i64 %7, %6
  %diff.check = icmp ult i64 %8, 32
  br i1 %diff.check, label %scalar.ph, label %vector.body

vector.body:                                      ; preds = %vector.memcheck, %vector.body
  %index = phi i64 [ %index.next.1, %vector.body ], [ 0, %vector.memcheck ]
  %offset.idx = shl i64 %index, 2
  %next.gep = getelementptr i8, ptr %4, i64 %offset.idx
  %9 = getelementptr inbounds [8192 x i32], ptr %5, i64 0, i64 %index
  %10 = getelementptr inbounds i8, ptr %9, i64 16
  %wide.load = load <4 x i32>, ptr %9, align 4, !tbaa !10
  %wide.load69 = load <4 x i32>, ptr %10, align 4, !tbaa !10
  %11 = getelementptr i8, ptr %next.gep, i64 16
  store <4 x i32> %wide.load, ptr %next.gep, align 4, !tbaa !10
  store <4 x i32> %wide.load69, ptr %11, align 4, !tbaa !10
  %index.next = or disjoint i64 %index, 8
  %offset.idx.1 = shl i64 %index.next, 2
  %next.gep.1 = getelementptr i8, ptr %4, i64 %offset.idx.1
  %12 = getelementptr inbounds [8192 x i32], ptr %5, i64 0, i64 %index.next
  %13 = getelementptr inbounds i8, ptr %12, i64 16
  %wide.load.1 = load <4 x i32>, ptr %12, align 4, !tbaa !10
  %wide.load69.1 = load <4 x i32>, ptr %13, align 4, !tbaa !10
  %14 = getelementptr i8, ptr %next.gep.1, i64 16
  store <4 x i32> %wide.load.1, ptr %next.gep.1, align 4, !tbaa !10
  store <4 x i32> %wide.load69.1, ptr %14, align 4, !tbaa !10
  %index.next.1 = add nuw nsw i64 %index, 16
  %15 = icmp eq i64 %index.next.1, 2048
  br i1 %15, label %middle.block, label %vector.body, !llvm.loop !11

scalar.ph:                                        ; preds = %vector.memcheck, %scalar.ph
  %indvars.iv = phi i64 [ %indvars.iv.next.7, %scalar.ph ], [ 0, %vector.memcheck ]
  %.060 = phi ptr [ %39, %scalar.ph ], [ %4, %vector.memcheck ]
  %16 = getelementptr inbounds [8192 x i32], ptr %5, i64 0, i64 %indvars.iv
  %17 = load i32, ptr %16, align 4, !tbaa !10
  store i32 %17, ptr %.060, align 4, !tbaa !10
  %indvars.iv.next = or disjoint i64 %indvars.iv, 1
  %18 = getelementptr inbounds i8, ptr %.060, i64 4
  %19 = getelementptr inbounds [8192 x i32], ptr %5, i64 0, i64 %indvars.iv.next
  %20 = load i32, ptr %19, align 4, !tbaa !10
  store i32 %20, ptr %18, align 4, !tbaa !10
  %indvars.iv.next.1 = or disjoint i64 %indvars.iv, 2
  %21 = getelementptr inbounds i8, ptr %.060, i64 8
  %22 = getelementptr inbounds [8192 x i32], ptr %5, i64 0, i64 %indvars.iv.next.1
  %23 = load i32, ptr %22, align 4, !tbaa !10
  store i32 %23, ptr %21, align 4, !tbaa !10
  %indvars.iv.next.2 = or disjoint i64 %indvars.iv, 3
  %24 = getelementptr inbounds i8, ptr %.060, i64 12
  %25 = getelementptr inbounds [8192 x i32], ptr %5, i64 0, i64 %indvars.iv.next.2
  %26 = load i32, ptr %25, align 4, !tbaa !10
  store i32 %26, ptr %24, align 4, !tbaa !10
  %indvars.iv.next.3 = or disjoint i64 %indvars.iv, 4
  %27 = getelementptr inbounds i8, ptr %.060, i64 16
  %28 = getelementptr inbounds [8192 x i32], ptr %5, i64 0, i64 %indvars.iv.next.3
  %29 = load i32, ptr %28, align 4, !tbaa !10
  store i32 %29, ptr %27, align 4, !tbaa !10
  %indvars.iv.next.4 = or disjoint i64 %indvars.iv, 5
  %30 = getelementptr inbounds i8, ptr %.060, i64 20
  %31 = getelementptr inbounds [8192 x i32], ptr %5, i64 0, i64 %indvars.iv.next.4
  %32 = load i32, ptr %31, align 4, !tbaa !10
  store i32 %32, ptr %30, align 4, !tbaa !10
  %indvars.iv.next.5 = or disjoint i64 %indvars.iv, 6
  %33 = getelementptr inbounds i8, ptr %.060, i64 24
  %34 = getelementptr inbounds [8192 x i32], ptr %5, i64 0, i64 %indvars.iv.next.5
  %35 = load i32, ptr %34, align 4, !tbaa !10
  store i32 %35, ptr %33, align 4, !tbaa !10
  %indvars.iv.next.6 = or disjoint i64 %indvars.iv, 7
  %36 = getelementptr inbounds i8, ptr %.060, i64 28
  %37 = getelementptr inbounds [8192 x i32], ptr %5, i64 0, i64 %indvars.iv.next.6
  %38 = load i32, ptr %37, align 4, !tbaa !10
  store i32 %38, ptr %36, align 4, !tbaa !10
  %indvars.iv.next.7 = add nuw nsw i64 %indvars.iv, 8
  %39 = getelementptr inbounds i8, ptr %.060, i64 32
  %exitcond.not.7 = icmp eq i64 %indvars.iv.next.7, 2048
  br i1 %exitcond.not.7, label %middle.block, label %scalar.ph, !llvm.loop !15

middle.block:                                     ; preds = %vector.body, %scalar.ph
  %40 = getelementptr inbounds i8, ptr %0, i64 36
  %41 = load i32, ptr %40, align 4, !tbaa !16
  %42 = load i32, ptr %0, align 4, !tbaa !17
  %43 = add i32 %42, 8
  %44 = zext i32 %43 to i64
  %45 = inttoptr i64 %44 to ptr
  store volatile i32 %41, ptr %45, align 4, !tbaa !10
  %46 = getelementptr inbounds i8, ptr %0, i64 40
  %47 = load i32, ptr %46, align 4, !tbaa !10
  %48 = load i32, ptr %0, align 4, !tbaa !17
  %49 = add i32 %48, 64
  %50 = zext i32 %49 to i64
  %51 = inttoptr i64 %50 to ptr
  store volatile i32 %47, ptr %51, align 4, !tbaa !10
  %52 = getelementptr inbounds i8, ptr %0, i64 44
  %53 = load i32, ptr %52, align 4, !tbaa !10
  %54 = load i32, ptr %0, align 4, !tbaa !17
  %55 = add i32 %54, 68
  %56 = zext i32 %55 to i64
  %57 = inttoptr i64 %56 to ptr
  store volatile i32 %53, ptr %57, align 4, !tbaa !10
  %58 = getelementptr inbounds i8, ptr %0, i64 48
  %59 = load i32, ptr %58, align 4, !tbaa !10
  %60 = load i32, ptr %0, align 4, !tbaa !17
  %61 = add i32 %60, 72
  %62 = zext i32 %61 to i64
  %63 = inttoptr i64 %62 to ptr
  store volatile i32 %59, ptr %63, align 4, !tbaa !10
  %64 = getelementptr inbounds i8, ptr %0, i64 52
  br label %65

65:                                               ; preds = %middle.block, %65
  %indvars.iv63 = phi i64 [ 0, %middle.block ], [ %indvars.iv.next64, %65 ]
  %66 = load i32, ptr %0, align 4, !tbaa !17
  %67 = mul nuw nsw i64 %indvars.iv63, 3
  %68 = getelementptr inbounds [3072 x i32], ptr %64, i64 0, i64 %67
  %69 = trunc nuw nsw i64 %indvars.iv63 to i32
  tail call void @CPSWALETableEntrySet(i32 noundef %66, i32 noundef %69, ptr noundef nonnull %68)
  %indvars.iv.next64 = add nuw nsw i64 %indvars.iv63, 1
  %exitcond66.not = icmp eq i64 %indvars.iv.next64, 1024
  br i1 %exitcond66.not, label %70, label %65, !llvm.loop !18

70:                                               ; preds = %65
  %71 = getelementptr inbounds i8, ptr %0, i64 12340
  %72 = load i32, ptr %71, align 4, !tbaa !19
  %73 = getelementptr inbounds i8, ptr %0, i64 4
  %74 = load i32, ptr %73, align 4, !tbaa !20
  %75 = add i32 %74, 12
  %76 = zext i32 %75 to i64
  %77 = inttoptr i64 %76 to ptr
  store volatile i32 %72, ptr %77, align 4, !tbaa !10
  %78 = getelementptr inbounds i8, ptr %0, i64 12344
  %79 = load i32, ptr %78, align 4, !tbaa !21
  %80 = getelementptr inbounds i8, ptr %0, i64 8
  %81 = load i32, ptr %80, align 4, !tbaa !22
  %82 = add i32 %81, 36
  %83 = zext i32 %82 to i64
  %84 = inttoptr i64 %83 to ptr
  store volatile i32 %79, ptr %84, align 4, !tbaa !10
  %85 = getelementptr inbounds i8, ptr %0, i64 12348
  %86 = load i32, ptr %85, align 4, !tbaa !23
  %87 = load i32, ptr %80, align 4, !tbaa !22
  %88 = add i32 %87, 32
  %89 = zext i32 %88 to i64
  %90 = inttoptr i64 %89 to ptr
  store volatile i32 %86, ptr %90, align 4, !tbaa !10
  %91 = getelementptr inbounds i8, ptr %0, i64 12352
  %92 = load i32, ptr %91, align 4, !tbaa !24
  %93 = getelementptr inbounds i8, ptr %0, i64 12
  %94 = load i32, ptr %93, align 4, !tbaa !25
  %95 = add i32 %94, 36
  %96 = zext i32 %95 to i64
  %97 = inttoptr i64 %96 to ptr
  store volatile i32 %92, ptr %97, align 4, !tbaa !10
  %98 = getelementptr inbounds i8, ptr %0, i64 12356
  %99 = load i32, ptr %98, align 4, !tbaa !26
  %100 = load i32, ptr %93, align 4, !tbaa !25
  %101 = add i32 %100, 32
  %102 = zext i32 %101 to i64
  %103 = inttoptr i64 %102 to ptr
  store volatile i32 %99, ptr %103, align 4, !tbaa !10
  %104 = getelementptr inbounds i8, ptr %0, i64 12360
  %105 = load i32, ptr %104, align 4, !tbaa !27
  %106 = load i32, ptr %80, align 4, !tbaa !22
  %107 = add i32 %106, 16
  %108 = zext i32 %107 to i64
  %109 = inttoptr i64 %108 to ptr
  store volatile i32 %105, ptr %109, align 4, !tbaa !10
  %110 = getelementptr inbounds i8, ptr %0, i64 12368
  %111 = load i32, ptr %110, align 4, !tbaa !28
  %112 = load i32, ptr %93, align 4, !tbaa !25
  %113 = add i32 %112, 16
  %114 = zext i32 %113 to i64
  %115 = inttoptr i64 %114 to ptr
  store volatile i32 %111, ptr %115, align 4, !tbaa !10
  %116 = getelementptr inbounds i8, ptr %0, i64 12364
  %117 = load i32, ptr %116, align 4, !tbaa !29
  %118 = load i32, ptr %80, align 4, !tbaa !22
  %119 = add i32 %118, 20
  %120 = zext i32 %119 to i64
  %121 = inttoptr i64 %120 to ptr
  store volatile i32 %117, ptr %121, align 4, !tbaa !10
  %122 = getelementptr inbounds i8, ptr %0, i64 12372
  %123 = load i32, ptr %122, align 4, !tbaa !30
  %124 = load i32, ptr %93, align 4, !tbaa !25
  %125 = add i32 %124, 20
  %126 = zext i32 %125 to i64
  %127 = inttoptr i64 %126 to ptr
  store volatile i32 %123, ptr %127, align 4, !tbaa !10
  %128 = getelementptr inbounds i8, ptr %0, i64 12376
  %129 = load i32, ptr %128, align 4, !tbaa !31
  %130 = getelementptr inbounds i8, ptr %0, i64 16
  %131 = load i32, ptr %130, align 4, !tbaa !32
  %132 = add i32 %131, 224
  %133 = zext i32 %132 to i64
  %134 = inttoptr i64 %133 to ptr
  store volatile i32 %129, ptr %134, align 4, !tbaa !10
  %135 = getelementptr inbounds i8, ptr %0, i64 12380
  %136 = load i32, ptr %135, align 4, !tbaa !33
  %137 = load i32, ptr %130, align 4, !tbaa !32
  %138 = add i32 %137, 4
  %139 = zext i32 %138 to i64
  %140 = inttoptr i64 %139 to ptr
  store volatile i32 %136, ptr %140, align 4, !tbaa !10
  %141 = getelementptr inbounds i8, ptr %0, i64 12384
  %142 = load i32, ptr %141, align 4, !tbaa !34
  %143 = load i32, ptr %130, align 4, !tbaa !32
  %144 = add i32 %143, 20
  %145 = zext i32 %144 to i64
  %146 = inttoptr i64 %145 to ptr
  store volatile i32 %142, ptr %146, align 4, !tbaa !10
  %147 = getelementptr inbounds i8, ptr %0, i64 12388
  %148 = load i32, ptr %147, align 4, !tbaa !35
  %149 = load i32, ptr %130, align 4, !tbaa !32
  %150 = add i32 %149, 544
  %151 = zext i32 %150 to i64
  %152 = inttoptr i64 %151 to ptr
  store volatile i32 %148, ptr %152, align 4, !tbaa !10
  %153 = getelementptr inbounds i8, ptr %0, i64 12392
  %154 = load i32, ptr %153, align 4, !tbaa !36
  %155 = load i32, ptr %130, align 4, !tbaa !32
  %156 = add i32 %155, 136
  %157 = zext i32 %156 to i64
  %158 = inttoptr i64 %157 to ptr
  store volatile i32 %154, ptr %158, align 4, !tbaa !10
  %159 = getelementptr inbounds i8, ptr %0, i64 12400
  %160 = load i32, ptr %159, align 4, !tbaa !37
  %161 = getelementptr inbounds i8, ptr %0, i64 24
  %162 = load i32, ptr %161, align 4, !tbaa !38
  %163 = add i32 %162, 20
  %164 = zext i32 %163 to i64
  %165 = inttoptr i64 %164 to ptr
  store volatile i32 %160, ptr %165, align 4, !tbaa !10
  %166 = getelementptr inbounds i8, ptr %0, i64 12396
  %167 = load i32, ptr %166, align 4, !tbaa !39
  %168 = load i32, ptr %130, align 4, !tbaa !32
  %169 = add i32 %168, 168
  %170 = zext i32 %169 to i64
  %171 = inttoptr i64 %170 to ptr
  store volatile i32 %167, ptr %171, align 4, !tbaa !10
  %172 = getelementptr inbounds i8, ptr %0, i64 12404
  %173 = load i32, ptr %172, align 4, !tbaa !40
  %174 = load i32, ptr %161, align 4, !tbaa !38
  %175 = add i32 %174, 24
  %176 = zext i32 %175 to i64
  %177 = inttoptr i64 %176 to ptr
  store volatile i32 %173, ptr %177, align 4, !tbaa !10
  %178 = getelementptr inbounds i8, ptr %0, i64 12408
  %179 = load i32, ptr %178, align 4, !tbaa !41
  %180 = getelementptr inbounds i8, ptr %0, i64 28
  %181 = load i32, ptr %180, align 4, !tbaa !42
  %182 = add i32 %181, 4
  %183 = zext i32 %182 to i64
  %184 = inttoptr i64 %183 to ptr
  store volatile i32 %179, ptr %184, align 4, !tbaa !10
  %185 = getelementptr inbounds i8, ptr %0, i64 12412
  %186 = load i32, ptr %185, align 4, !tbaa !43
  %187 = getelementptr inbounds i8, ptr %0, i64 32
  %188 = load i32, ptr %187, align 4, !tbaa !44
  %189 = add i32 %188, 4
  %190 = zext i32 %189 to i64
  %191 = inttoptr i64 %190 to ptr
  store volatile i32 %186, ptr %191, align 4, !tbaa !10
  ret void
}

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

!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 20}
!6 = !{!"cpswContext", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !8, i64 40, !8, i64 52, !7, i64 12340, !7, i64 12344, !7, i64 12348, !7, i64 12352, !7, i64 12356, !7, i64 12360, !7, i64 12364, !7, i64 12368, !7, i64 12372, !7, i64 12376, !7, i64 12380, !7, i64 12384, !7, i64 12388, !7, i64 12392, !7, i64 12396, !7, i64 12400, !7, i64 12404, !7, i64 12408, !7, i64 12412, !8, i64 12416}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!7, !7, i64 0}
!11 = distinct !{!11, !12, !13, !14}
!12 = !{!"llvm.loop.mustprogress"}
!13 = !{!"llvm.loop.isvectorized", i32 1}
!14 = !{!"llvm.loop.unroll.runtime.disable"}
!15 = distinct !{!15, !12, !13}
!16 = !{!6, !7, i64 36}
!17 = !{!6, !7, i64 0}
!18 = distinct !{!18, !12}
!19 = !{!6, !7, i64 12340}
!20 = !{!6, !7, i64 4}
!21 = !{!6, !7, i64 12344}
!22 = !{!6, !7, i64 8}
!23 = !{!6, !7, i64 12348}
!24 = !{!6, !7, i64 12352}
!25 = !{!6, !7, i64 12}
!26 = !{!6, !7, i64 12356}
!27 = !{!6, !7, i64 12360}
!28 = !{!6, !7, i64 12368}
!29 = !{!6, !7, i64 12364}
!30 = !{!6, !7, i64 12372}
!31 = !{!6, !7, i64 12376}
!32 = !{!6, !7, i64 16}
!33 = !{!6, !7, i64 12380}
!34 = !{!6, !7, i64 12384}
!35 = !{!6, !7, i64 12388}
!36 = !{!6, !7, i64 12392}
!37 = !{!6, !7, i64 12400}
!38 = !{!6, !7, i64 24}
!39 = !{!6, !7, i64 12396}
!40 = !{!6, !7, i64 12404}
!41 = !{!6, !7, i64 12408}
!42 = !{!6, !7, i64 28}
!43 = !{!6, !7, i64 12412}
!44 = !{!6, !7, i64 32}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopUnrollPass,LoopVectorizePass,SROAPass,SimplifyCFGPass,TailCallElimPass