; LLVM IR from Stephane-D/SGDK :: src (sprite_eng)

; 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.VDPSprite = type { i16, %union.anon, %union.anon.1, i16 }
%union.anon = type { %struct.anon }
%struct.anon = type { i16 }
%union.anon.1 = type { i16 }
%struct.anon.0 = type { i8, i8 }
%struct.Sprite = type { i16, i16, ptr, ptr, ptr, ptr, i16, i16, i16, i16, i16, i16, i16, i64, ptr, ptr }
%struct.AnimationFrame = type { i8, i8, ptr, ptr, [0 x %struct.FrameVDPSprite] }
%struct.FrameVDPSprite = type { i8, i8, i8, i8, i8, i8 }

@firstSprite = external dso_local global ptr, align 8
@vdpSpriteCache = external global [96 x %struct.VDPSprite], align 16
@SPR_update.visibilityMask = external hidden constant [17 x i16], align 16
@slist_addr = external global i16, align 2

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

; Function Attrs: nounwind uwtable
declare dso_local void @SPR_nextFrame(ptr noundef) #1

; Function Attrs: nounwind uwtable
declare hidden zeroext i16 @updateFrame(ptr noundef, i16 noundef zeroext) #1

; Function Attrs: nounwind uwtable
declare hidden zeroext i16 @updateVisibility(ptr noundef, i16 noundef zeroext) #1

; Function Attrs: noinline nounwind uwtable
define dso_local void @SPR_update() #2 {
  %1 = alloca ptr, align 8
  %2 = alloca ptr, align 8
  %3 = alloca i8, align 1
  %4 = alloca i16, align 2
  %5 = alloca i16, align 2
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i16, align 2
  %9 = alloca i8, align 1
  %10 = alloca i16, align 2
  call void @llvm.lifetime.start.p0(i64 8, ptr %1) #4
  %11 = load ptr, ptr @firstSprite, align 8, !tbaa !5
  store ptr %11, ptr %1, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %2) #4
  store ptr @vdpSpriteCache, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %3) #4
  store i8 1, ptr %3, align 1, !tbaa !9
  %12 = call zeroext i8 (...) @SYS_getShowFrameLoad()
  %13 = icmp ne i8 %12, 0
  br i1 %13, label %14, label %22

14:                                               ; preds = %0
  %15 = load i8, ptr %3, align 1, !tbaa !9
  %16 = add i8 %15, 1
  store i8 %16, ptr %3, align 1, !tbaa !9
  %17 = load ptr, ptr %2, align 8, !tbaa !5
  %18 = getelementptr inbounds %struct.VDPSprite, ptr %17, i32 0, i32 1
  %19 = getelementptr inbounds %struct.anon.0, ptr %18, i32 0, i32 1
  store i8 %15, ptr %19, align 1, !tbaa !9
  %20 = load ptr, ptr %2, align 8, !tbaa !5
  %21 = getelementptr inbounds %struct.VDPSprite, ptr %20, i32 1
  store ptr %21, ptr %2, align 8, !tbaa !5
  br label %22

22:                                               ; preds = %14, %0
  br label %23

23:                                               ; preds = %412, %22
  %24 = load ptr, ptr %1, align 8, !tbaa !5
  %25 = icmp ne ptr %24, null
  br i1 %25, label %26, label %419

26:                                               ; preds = %23
  call void @llvm.lifetime.start.p0(i64 2, ptr %4) #4
  %27 = load ptr, ptr %1, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.Sprite, ptr %27, i32 0, i32 8
  %29 = load i16, ptr %28, align 4, !tbaa !10
  store i16 %29, ptr %4, align 2, !tbaa !14
  %30 = load i16, ptr %4, align 2, !tbaa !14
  %31 = sext i16 %30 to i32
  %32 = icmp sgt i32 %31, 0
  br i1 %32, label %33, label %45

33:                                               ; preds = %26
  %34 = load i16, ptr %4, align 2, !tbaa !14
  %35 = add i16 %34, -1
  store i16 %35, ptr %4, align 2, !tbaa !14
  %36 = sext i16 %35 to i32
  %37 = icmp eq i32 %36, 0
  br i1 %37, label %38, label %40

38:                                               ; preds = %33
  %39 = load ptr, ptr %1, align 8, !tbaa !5
  call void @SPR_nextFrame(ptr noundef %39)
  br label %44

40:                                               ; preds = %33
  %41 = load i16, ptr %4, align 2, !tbaa !14
  %42 = load ptr, ptr %1, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct.Sprite, ptr %42, i32 0, i32 8
  store i16 %41, ptr %43, align 4, !tbaa !10
  br label %44

44:                                               ; preds = %40, %38
  br label %45

45:                                               ; preds = %44, %26
  call void @llvm.lifetime.start.p0(i64 2, ptr %5) #4
  %46 = load ptr, ptr %1, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.Sprite, ptr %46, i32 0, i32 0
  %48 = load i16, ptr %47, align 8, !tbaa !15
  store i16 %48, ptr %5, align 2, !tbaa !14
  %49 = load i16, ptr %5, align 2, !tbaa !14
  %50 = zext i16 %49 to i32
  %51 = and i32 %50, 2
  %52 = icmp ne i32 %51, 0
  br i1 %52, label %53, label %57

53:                                               ; preds = %45
  %54 = load ptr, ptr %1, align 8, !tbaa !5
  %55 = load i16, ptr %5, align 2, !tbaa !14
  %56 = call zeroext i16 @updateFrame(ptr noundef %54, i16 noundef zeroext %55)
  store i16 %56, ptr %5, align 2, !tbaa !14
  br label %57

57:                                               ; preds = %53, %45
  %58 = load i16, ptr %5, align 2, !tbaa !14
  %59 = zext i16 %58 to i32
  %60 = and i32 %59, 1
  %61 = icmp ne i32 %60, 0
  br i1 %61, label %62, label %66

62:                                               ; preds = %57
  %63 = load ptr, ptr %1, align 8, !tbaa !5
  %64 = load i16, ptr %5, align 2, !tbaa !14
  %65 = call zeroext i16 @updateVisibility(ptr noundef %63, i16 noundef zeroext %64)
  store i16 %65, ptr %5, align 2, !tbaa !14
  br label %66

66:                                               ; preds = %62, %57
  %67 = load ptr, ptr %1, align 8, !tbaa !5
  %68 = getelementptr inbounds %struct.Sprite, ptr %67, i32 0, i32 1
  %69 = load i16, ptr %68, align 2, !tbaa !16
  %70 = zext i16 %69 to i32
  %71 = icmp ne i32 %70, 0
  br i1 %71, label %72, label %412

72:                                               ; preds = %66
  %73 = load i16, ptr %5, align 2, !tbaa !14
  %74 = zext i16 %73 to i32
  %75 = and i32 %74, 32768
  %76 = icmp ne i32 %75, 0
  br i1 %76, label %77, label %412

77:                                               ; preds = %72
  %78 = load i8, ptr %3, align 1, !tbaa !9
  %79 = zext i8 %78 to i32
  %80 = icmp sle i32 %79, 80
  br i1 %80, label %81, label %412

81:                                               ; preds = %77
  %82 = load i16, ptr %5, align 2, !tbaa !14
  %83 = zext i16 %82 to i32
  %84 = and i32 %83, 4
  %85 = icmp ne i32 %84, 0
  br i1 %85, label %86, label %92

86:                                               ; preds = %81
  %87 = load ptr, ptr %1, align 8, !tbaa !5
  call void @loadTiles(ptr noundef %87)
  %88 = load i16, ptr %5, align 2, !tbaa !14
  %89 = zext i16 %88 to i32
  %90 = and i32 %89, -5
  %91 = trunc i32 %90 to i16
  store i16 %91, ptr %5, align 2, !tbaa !14
  br label %92

92:                                               ; preds = %86, %81
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #4
  %93 = load ptr, ptr %1, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.Sprite, ptr %93, i32 0, i32 5
  %95 = load ptr, ptr %94, align 8, !tbaa !17
  store ptr %95, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #4
  %96 = load ptr, ptr %6, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.AnimationFrame, ptr %96, i32 0, i32 4
  %98 = getelementptr inbounds [0 x %struct.FrameVDPSprite], ptr %97, i64 0, i64 0
  store ptr %98, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %8) #4
  %99 = load ptr, ptr %1, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.Sprite, ptr %99, i32 0, i32 12
  %101 = load i16, ptr %100, align 4, !tbaa !18
  store i16 %101, ptr %8, align 2, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 1, ptr %9) #4
  %102 = load ptr, ptr %6, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct.AnimationFrame, ptr %102, i32 0, i32 0
  %104 = load i8, ptr %103, align 8, !tbaa !9
  store i8 %104, ptr %9, align 1, !tbaa !9
  %105 = load i8, ptr %9, align 1, !tbaa !9
  %106 = sext i8 %105 to i32
  %107 = icmp slt i32 %106, 0
  br i1 %107, label %108, label %135

108:                                              ; preds = %92
  %109 = load ptr, ptr %1, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.Sprite, ptr %109, i32 0, i32 10
  %111 = load i16, ptr %110, align 8, !tbaa !19
  %112 = load ptr, ptr %2, align 8, !tbaa !5
  %113 = getelementptr inbounds %struct.VDPSprite, ptr %112, i32 0, i32 0
  store i16 %111, ptr %113, align 2, !tbaa !20
  %114 = load ptr, ptr %7, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.FrameVDPSprite, ptr %114, i32 0, i32 2
  %116 = load i8, ptr %115, align 1, !tbaa !22
  %117 = load ptr, ptr %2, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct.VDPSprite, ptr %117, i32 0, i32 1
  %119 = getelementptr inbounds %struct.anon.0, ptr %118, i32 0, i32 0
  store i8 %116, ptr %119, align 2, !tbaa !9
  %120 = load i8, ptr %3, align 1, !tbaa !9
  %121 = add i8 %120, 1
  store i8 %121, ptr %3, align 1, !tbaa !9
  %122 = load ptr, ptr %2, align 8, !tbaa !5
  %123 = getelementptr inbounds %struct.VDPSprite, ptr %122, i32 0, i32 1
  %124 = getelementptr inbounds %struct.anon.0, ptr %123, i32 0, i32 1
  store i8 %120, ptr %124, align 1, !tbaa !9
  %125 = load i16, ptr %8, align 2, !tbaa !14
  %126 = load ptr, ptr %2, align 8, !tbaa !5
  %127 = getelementptr inbounds %struct.VDPSprite, ptr %126, i32 0, i32 2
  store i16 %125, ptr %127, align 2, !tbaa !9
  %128 = load ptr, ptr %1, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.Sprite, ptr %128, i32 0, i32 9
  %130 = load i16, ptr %129, align 2, !tbaa !24
  %131 = load ptr, ptr %2, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.VDPSprite, ptr %131, i32 0, i32 3
  store i16 %130, ptr %132, align 2, !tbaa !25
  %133 = load ptr, ptr %2, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.VDPSprite, ptr %133, i32 1
  store ptr %134, ptr %2, align 8, !tbaa !5
  br label %411

135:                                              ; preds = %92
  call void @llvm.lifetime.start.p0(i64 2, ptr %10) #4
  %136 = load ptr, ptr %1, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.Sprite, ptr %136, i32 0, i32 1
  %138 = load i16, ptr %137, align 2, !tbaa !16
  %139 = zext i16 %138 to i32
  %140 = load i8, ptr %9, align 1, !tbaa !9
  %141 = zext i8 %140 to i64
  %142 = getelementptr inbounds [17 x i16], ptr @SPR_update.visibilityMask, i64 0, i64 %141
  %143 = load i16, ptr %142, align 2, !tbaa !14
  %144 = zext i16 %143 to i32
  %145 = and i32 %139, %144
  %146 = trunc i32 %145 to i16
  store i16 %146, ptr %10, align 2, !tbaa !14
  %147 = load i16, ptr %8, align 2, !tbaa !14
  %148 = zext i16 %147 to i32
  %149 = and i32 %148, 6144
  switch i32 %149, label %410 [
    i32 0, label %150
    i32 2048, label %215
    i32 4096, label %280
    i32 6144, label %345
  ]

150:                                              ; preds = %135
  br label %151

151:                                              ; preds = %199, %150
  %152 = load i16, ptr %10, align 2, !tbaa !14
  %153 = icmp ne i16 %152, 0
  br i1 %153, label %154, label %214

154:                                              ; preds = %151
  %155 = load i16, ptr %10, align 2, !tbaa !14
  %156 = sext i16 %155 to i32
  %157 = icmp slt i32 %156, 0
  br i1 %157, label %158, label %199

158:                                              ; preds = %154
  %159 = load ptr, ptr %1, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.Sprite, ptr %159, i32 0, i32 10
  %161 = load i16, ptr %160, align 8, !tbaa !19
  %162 = sext i16 %161 to i32
  %163 = load ptr, ptr %7, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.FrameVDPSprite, ptr %163, i32 0, i32 0
  %165 = load i8, ptr %164, align 1, !tbaa !26
  %166 = zext i8 %165 to i32
  %167 = add nsw i32 %162, %166
  %168 = trunc i32 %167 to i16
  %169 = load ptr, ptr %2, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.VDPSprite, ptr %169, i32 0, i32 0
  store i16 %168, ptr %170, align 2, !tbaa !20
  %171 = load ptr, ptr %7, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.FrameVDPSprite, ptr %171, i32 0, i32 2
  %173 = load i8, ptr %172, align 1, !tbaa !22
  %174 = load ptr, ptr %2, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.VDPSprite, ptr %174, i32 0, i32 1
  %176 = getelementptr inbounds %struct.anon.0, ptr %175, i32 0, i32 0
  store i8 %173, ptr %176, align 2, !tbaa !9
  %177 = load i8, ptr %3, align 1, !tbaa !9
  %178 = add i8 %177, 1
  store i8 %178, ptr %3, align 1, !tbaa !9
  %179 = load ptr, ptr %2, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.VDPSprite, ptr %179, i32 0, i32 1
  %181 = getelementptr inbounds %struct.anon.0, ptr %180, i32 0, i32 1
  store i8 %177, ptr %181, align 1, !tbaa !9
  %182 = load i16, ptr %8, align 2, !tbaa !14
  %183 = load ptr, ptr %2, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.VDPSprite, ptr %183, i32 0, i32 2
  store i16 %182, ptr %184, align 2, !tbaa !9
  %185 = load ptr, ptr %1, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.Sprite, ptr %185, i32 0, i32 9
  %187 = load i16, ptr %186, align 2, !tbaa !24
  %188 = sext i16 %187 to i32
  %189 = load ptr, ptr %7, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct.FrameVDPSprite, ptr %189, i32 0, i32 3
  %191 = load i8, ptr %190, align 1, !tbaa !27
  %192 = zext i8 %191 to i32
  %193 = add nsw i32 %188, %192
  %194 = trunc i32 %193 to i16
  %195 = load ptr, ptr %2, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.VDPSprite, ptr %195, i32 0, i32 3
  store i16 %194, ptr %196, align 2, !tbaa !25
  %197 = load ptr, ptr %2, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct.VDPSprite, ptr %197, i32 1
  store ptr %198, ptr %2, align 8, !tbaa !5
  br label %199

199:                                              ; preds = %158, %154
  %200 = load ptr, ptr %7, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct.FrameVDPSprite, ptr %200, i32 0, i32 5
  %202 = load i8, ptr %201, align 1, !tbaa !28
  %203 = zext i8 %202 to i32
  %204 = load i16, ptr %8, align 2, !tbaa !14
  %205 = zext i16 %204 to i32
  %206 = add nsw i32 %205, %203
  %207 = trunc i32 %206 to i16
  store i16 %207, ptr %8, align 2, !tbaa !14
  %208 = load ptr, ptr %7, align 8, !tbaa !5
  %209 = getelementptr inbounds %struct.FrameVDPSprite, ptr %208, i32 1
  store ptr %209, ptr %7, align 8, !tbaa !5
  %210 = load i16, ptr %10, align 2, !tbaa !14
  %211 = sext i16 %210 to i32
  %212 = shl i32 %211, 1
  %213 = trunc i32 %212 to i16
  store i16 %213, ptr %10, align 2, !tbaa !14
  br label %151, !llvm.loop !29

214:                                              ; preds = %151
  br label %410

215:                                              ; preds = %135
  br label %216

216:                                              ; preds = %264, %215
  %217 = load i16, ptr %10, align 2, !tbaa !14
  %218 = icmp ne i16 %217, 0
  br i1 %218, label %219, label %279

219:                                              ; preds = %216
  %220 = load i16, ptr %10, align 2, !tbaa !14
  %221 = sext i16 %220 to i32
  %222 = icmp slt i32 %221, 0
  br i1 %222, label %223, label %264

223:                                              ; preds = %219
  %224 = load ptr, ptr %1, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.Sprite, ptr %224, i32 0, i32 10
  %226 = load i16, ptr %225, align 8, !tbaa !19
  %227 = sext i16 %226 to i32
  %228 = load ptr, ptr %7, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.FrameVDPSprite, ptr %228, i32 0, i32 0
  %230 = load i8, ptr %229, align 1, !tbaa !26
  %231 = zext i8 %230 to i32
  %232 = add nsw i32 %227, %231
  %233 = trunc i32 %232 to i16
  %234 = load ptr, ptr %2, align 8, !tbaa !5
  %235 = getelementptr inbounds %struct.VDPSprite, ptr %234, i32 0, i32 0
  store i16 %233, ptr %235, align 2, !tbaa !20
  %236 = load ptr, ptr %7, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.FrameVDPSprite, ptr %236, i32 0, i32 2
  %238 = load i8, ptr %237, align 1, !tbaa !22
  %239 = load ptr, ptr %2, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.VDPSprite, ptr %239, i32 0, i32 1
  %241 = getelementptr inbounds %struct.anon.0, ptr %240, i32 0, i32 0
  store i8 %238, ptr %241, align 2, !tbaa !9
  %242 = load i8, ptr %3, align 1, !tbaa !9
  %243 = add i8 %242, 1
  store i8 %243, ptr %3, align 1, !tbaa !9
  %244 = load ptr, ptr %2, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.VDPSprite, ptr %244, i32 0, i32 1
  %246 = getelementptr inbounds %struct.anon.0, ptr %245, i32 0, i32 1
  store i8 %242, ptr %246, align 1, !tbaa !9
  %247 = load i16, ptr %8, align 2, !tbaa !14
  %248 = load ptr, ptr %2, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.VDPSprite, ptr %248, i32 0, i32 2
  store i16 %247, ptr %249, align 2, !tbaa !9
  %250 = load ptr, ptr %1, align 8, !tbaa !5
  %251 = getelementptr inbounds %struct.Sprite, ptr %250, i32 0, i32 9
  %252 = load i16, ptr %251, align 2, !tbaa !24
  %253 = sext i16 %252 to i32
  %254 = load ptr, ptr %7, align 8, !tbaa !5
  %255 = getelementptr inbounds %struct.FrameVDPSprite, ptr %254, i32 0, i32 4
  %256 = load i8, ptr %255, align 1, !tbaa !31
  %257 = zext i8 %256 to i32
  %258 = add nsw i32 %253, %257
  %259 = trunc i32 %258 to i16
  %260 = load ptr, ptr %2, align 8, !tbaa !5
  %261 = getelementptr inbounds %struct.VDPSprite, ptr %260, i32 0, i32 3
  store i16 %259, ptr %261, align 2, !tbaa !25
  %262 = load ptr, ptr %2, align 8, !tbaa !5
  %263 = getelementptr inbounds %struct.VDPSprite, ptr %262, i32 1
  store ptr %263, ptr %2, align 8, !tbaa !5
  br label %264

264:                                              ; preds = %223, %219
  %265 = load ptr, ptr %7, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.FrameVDPSprite, ptr %265, i32 0, i32 5
  %267 = load i8, ptr %266, align 1, !tbaa !28
  %268 = zext i8 %267 to i32
  %269 = load i16, ptr %8, align 2, !tbaa !14
  %270 = zext i16 %269 to i32
  %271 = add nsw i32 %270, %268
  %272 = trunc i32 %271 to i16
  store i16 %272, ptr %8, align 2, !tbaa !14
  %273 = load ptr, ptr %7, align 8, !tbaa !5
  %274 = getelementptr inbounds %struct.FrameVDPSprite, ptr %273, i32 1
  store ptr %274, ptr %7, align 8, !tbaa !5
  %275 = load i16, ptr %10, align 2, !tbaa !14
  %276 = sext i16 %275 to i32
  %277 = shl i32 %276, 1
  %278 = trunc i32 %277 to i16
  store i16 %278, ptr %10, align 2, !tbaa !14
  br label %216, !llvm.loop !32

279:                                              ; preds = %216
  br label %410

280:                                              ; preds = %135
  br label %281

281:                                              ; preds = %329, %280
  %282 = load i16, ptr %10, align 2, !tbaa !14
  %283 = icmp ne i16 %282, 0
  br i1 %283, label %284, label %344

284:                                              ; preds = %281
  %285 = load i16, ptr %10, align 2, !tbaa !14
  %286 = sext i16 %285 to i32
  %287 = icmp slt i32 %286, 0
  br i1 %287, label %288, label %329

288:                                              ; preds = %284
  %289 = load ptr, ptr %1, align 8, !tbaa !5
  %290 = getelementptr inbounds %struct.Sprite, ptr %289, i32 0, i32 10
  %291 = load i16, ptr %290, align 8, !tbaa !19
  %292 = sext i16 %291 to i32
  %293 = load ptr, ptr %7, align 8, !tbaa !5
  %294 = getelementptr inbounds %struct.FrameVDPSprite, ptr %293, i32 0, i32 1
  %295 = load i8, ptr %294, align 1, !tbaa !33
  %296 = zext i8 %295 to i32
  %297 = add nsw i32 %292, %296
  %298 = trunc i32 %297 to i16
  %299 = load ptr, ptr %2, align 8, !tbaa !5
  %300 = getelementptr inbounds %struct.VDPSprite, ptr %299, i32 0, i32 0
  store i16 %298, ptr %300, align 2, !tbaa !20
  %301 = load ptr, ptr %7, align 8, !tbaa !5
  %302 = getelementptr inbounds %struct.FrameVDPSprite, ptr %301, i32 0, i32 2
  %303 = load i8, ptr %302, align 1, !tbaa !22
  %304 = load ptr, ptr %2, align 8, !tbaa !5
  %305 = getelementptr inbounds %struct.VDPSprite, ptr %304, i32 0, i32 1
  %306 = getelementptr inbounds %struct.anon.0, ptr %305, i32 0, i32 0
  store i8 %303, ptr %306, align 2, !tbaa !9
  %307 = load i8, ptr %3, align 1, !tbaa !9
  %308 = add i8 %307, 1
  store i8 %308, ptr %3, align 1, !tbaa !9
  %309 = load ptr, ptr %2, align 8, !tbaa !5
  %310 = getelementptr inbounds %struct.VDPSprite, ptr %309, i32 0, i32 1
  %311 = getelementptr inbounds %struct.anon.0, ptr %310, i32 0, i32 1
  store i8 %307, ptr %311, align 1, !tbaa !9
  %312 = load i16, ptr %8, align 2, !tbaa !14
  %313 = load ptr, ptr %2, align 8, !tbaa !5
  %314 = getelementptr inbounds %struct.VDPSprite, ptr %313, i32 0, i32 2
  store i16 %312, ptr %314, align 2, !tbaa !9
  %315 = load ptr, ptr %1, align 8, !tbaa !5
  %316 = getelementptr inbounds %struct.Sprite, ptr %315, i32 0, i32 9
  %317 = load i16, ptr %316, align 2, !tbaa !24
  %318 = sext i16 %317 to i32
  %319 = load ptr, ptr %7, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.FrameVDPSprite, ptr %319, i32 0, i32 3
  %321 = load i8, ptr %320, align 1, !tbaa !27
  %322 = zext i8 %321 to i32
  %323 = add nsw i32 %318, %322
  %324 = trunc i32 %323 to i16
  %325 = load ptr, ptr %2, align 8, !tbaa !5
  %326 = getelementptr inbounds %struct.VDPSprite, ptr %325, i32 0, i32 3
  store i16 %324, ptr %326, align 2, !tbaa !25
  %327 = load ptr, ptr %2, align 8, !tbaa !5
  %328 = getelementptr inbounds %struct.VDPSprite, ptr %327, i32 1
  store ptr %328, ptr %2, align 8, !tbaa !5
  br label %329

329:                                              ; preds = %288, %284
  %330 = load ptr, ptr %7, align 8, !tbaa !5
  %331 = getelementptr inbounds %struct.FrameVDPSprite, ptr %330, i32 0, i32 5
  %332 = load i8, ptr %331, align 1, !tbaa !28
  %333 = zext i8 %332 to i32
  %334 = load i16, ptr %8, align 2, !tbaa !14
  %335 = zext i16 %334 to i32
  %336 = add nsw i32 %335, %333
  %337 = trunc i32 %336 to i16
  store i16 %337, ptr %8, align 2, !tbaa !14
  %338 = load ptr, ptr %7, align 8, !tbaa !5
  %339 = getelementptr inbounds %struct.FrameVDPSprite, ptr %338, i32 1
  store ptr %339, ptr %7, align 8, !tbaa !5
  %340 = load i16, ptr %10, align 2, !tbaa !14
  %341 = sext i16 %340 to i32
  %342 = shl i32 %341, 1
  %343 = trunc i32 %342 to i16
  store i16 %343, ptr %10, align 2, !tbaa !14
  br label %281, !llvm.loop !34

344:                                              ; preds = %281
  br label %410

345:                                              ; preds = %135
  br label %346

346:                                              ; preds = %394, %345
  %347 = load i16, ptr %10, align 2, !tbaa !14
  %348 = icmp ne i16 %347, 0
  br i1 %348, label %349, label %409

349:                                              ; preds = %346
  %350 = load i16, ptr %10, align 2, !tbaa !14
  %351 = sext i16 %350 to i32
  %352 = icmp slt i32 %351, 0
  br i1 %352, label %353, label %394

353:                                              ; preds = %349
  %354 = load ptr, ptr %1, align 8, !tbaa !5
  %355 = getelementptr inbounds %struct.Sprite, ptr %354, i32 0, i32 10
  %356 = load i16, ptr %355, align 8, !tbaa !19
  %357 = sext i16 %356 to i32
  %358 = load ptr, ptr %7, align 8, !tbaa !5
  %359 = getelementptr inbounds %struct.FrameVDPSprite, ptr %358, i32 0, i32 1
  %360 = load i8, ptr %359, align 1, !tbaa !33
  %361 = zext i8 %360 to i32
  %362 = add nsw i32 %357, %361
  %363 = trunc i32 %362 to i16
  %364 = load ptr, ptr %2, align 8, !tbaa !5
  %365 = getelementptr inbounds %struct.VDPSprite, ptr %364, i32 0, i32 0
  store i16 %363, ptr %365, align 2, !tbaa !20
  %366 = load ptr, ptr %7, align 8, !tbaa !5
  %367 = getelementptr inbounds %struct.FrameVDPSprite, ptr %366, i32 0, i32 2
  %368 = load i8, ptr %367, align 1, !tbaa !22
  %369 = load ptr, ptr %2, align 8, !tbaa !5
  %370 = getelementptr inbounds %struct.VDPSprite, ptr %369, i32 0, i32 1
  %371 = getelementptr inbounds %struct.anon.0, ptr %370, i32 0, i32 0
  store i8 %368, ptr %371, align 2, !tbaa !9
  %372 = load i8, ptr %3, align 1, !tbaa !9
  %373 = add i8 %372, 1
  store i8 %373, ptr %3, align 1, !tbaa !9
  %374 = load ptr, ptr %2, align 8, !tbaa !5
  %375 = getelementptr inbounds %struct.VDPSprite, ptr %374, i32 0, i32 1
  %376 = getelementptr inbounds %struct.anon.0, ptr %375, i32 0, i32 1
  store i8 %372, ptr %376, align 1, !tbaa !9
  %377 = load i16, ptr %8, align 2, !tbaa !14
  %378 = load ptr, ptr %2, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.VDPSprite, ptr %378, i32 0, i32 2
  store i16 %377, ptr %379, align 2, !tbaa !9
  %380 = load ptr, ptr %1, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.Sprite, ptr %380, i32 0, i32 9
  %382 = load i16, ptr %381, align 2, !tbaa !24
  %383 = sext i16 %382 to i32
  %384 = load ptr, ptr %7, align 8, !tbaa !5
  %385 = getelementptr inbounds %struct.FrameVDPSprite, ptr %384, i32 0, i32 4
  %386 = load i8, ptr %385, align 1, !tbaa !31
  %387 = zext i8 %386 to i32
  %388 = add nsw i32 %383, %387
  %389 = trunc i32 %388 to i16
  %390 = load ptr, ptr %2, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.VDPSprite, ptr %390, i32 0, i32 3
  store i16 %389, ptr %391, align 2, !tbaa !25
  %392 = load ptr, ptr %2, align 8, !tbaa !5
  %393 = getelementptr inbounds %struct.VDPSprite, ptr %392, i32 1
  store ptr %393, ptr %2, align 8, !tbaa !5
  br label %394

394:                                              ; preds = %353, %349
  %395 = load ptr, ptr %7, align 8, !tbaa !5
  %396 = getelementptr inbounds %struct.FrameVDPSprite, ptr %395, i32 0, i32 5
  %397 = load i8, ptr %396, align 1, !tbaa !28
  %398 = zext i8 %397 to i32
  %399 = load i16, ptr %8, align 2, !tbaa !14
  %400 = zext i16 %399 to i32
  %401 = add nsw i32 %400, %398
  %402 = trunc i32 %401 to i16
  store i16 %402, ptr %8, align 2, !tbaa !14
  %403 = load ptr, ptr %7, align 8, !tbaa !5
  %404 = getelementptr inbounds %struct.FrameVDPSprite, ptr %403, i32 1
  store ptr %404, ptr %7, align 8, !tbaa !5
  %405 = load i16, ptr %10, align 2, !tbaa !14
  %406 = sext i16 %405 to i32
  %407 = shl i32 %406, 1
  %408 = trunc i32 %407 to i16
  store i16 %408, ptr %10, align 2, !tbaa !14
  br label %346, !llvm.loop !35

409:                                              ; preds = %346
  br label %410

410:                                              ; preds = %409, %344, %279, %214, %135
  call void @llvm.lifetime.end.p0(i64 2, ptr %10) #4
  br label %411

411:                                              ; preds = %410, %108
  call void @llvm.lifetime.end.p0(i64 1, ptr %9) #4
  call void @llvm.lifetime.end.p0(i64 2, ptr %8) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #4
  br label %412

412:                                              ; preds = %411, %77, %72, %66
  %413 = load i16, ptr %5, align 2, !tbaa !14
  %414 = load ptr, ptr %1, align 8, !tbaa !5
  %415 = getelementptr inbounds %struct.Sprite, ptr %414, i32 0, i32 0
  store i16 %413, ptr %415, align 8, !tbaa !15
  %416 = load ptr, ptr %1, align 8, !tbaa !5
  %417 = getelementptr inbounds %struct.Sprite, ptr %416, i32 0, i32 15
  %418 = load ptr, ptr %417, align 8, !tbaa !36
  store ptr %418, ptr %1, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 2, ptr %5) #4
  call void @llvm.lifetime.end.p0(i64 2, ptr %4) #4
  br label %23, !llvm.loop !37

419:                                              ; preds = %23
  %420 = load i8, ptr %3, align 1, !tbaa !9
  %421 = add i8 %420, -1
  store i8 %421, ptr %3, align 1, !tbaa !9
  %422 = load i8, ptr %3, align 1, !tbaa !9
  %423 = zext i8 %422 to i32
  %424 = icmp sgt i32 %423, 0
  br i1 %424, label %425, label %437

425:                                              ; preds = %419
  %426 = load ptr, ptr %2, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct.VDPSprite, ptr %426, i32 -1
  store ptr %427, ptr %2, align 8, !tbaa !5
  %428 = load ptr, ptr %2, align 8, !tbaa !5
  %429 = getelementptr inbounds %struct.VDPSprite, ptr %428, i32 0, i32 1
  %430 = getelementptr inbounds %struct.anon.0, ptr %429, i32 0, i32 1
  store i8 0, ptr %430, align 1, !tbaa !9
  %431 = load i16, ptr @slist_addr, align 2, !tbaa !14
  %432 = load i8, ptr %3, align 1, !tbaa !9
  %433 = zext i8 %432 to i64
  %434 = mul i64 %433, 4
  %435 = trunc i64 %434 to i16
  %436 = call zeroext i8 @DMA_queueDmaFast(i8 noundef zeroext 0, ptr noundef @vdpSpriteCache, i16 noundef zeroext %431, i16 noundef zeroext %435, i16 noundef zeroext 2)
  br label %445

437:                                              ; preds = %419
  %438 = load ptr, ptr %2, align 8, !tbaa !5
  %439 = getelementptr inbounds %struct.VDPSprite, ptr %438, i32 0, i32 0
  store i16 0, ptr %439, align 2, !tbaa !20
  %440 = load ptr, ptr %2, align 8, !tbaa !5
  %441 = getelementptr inbounds %struct.VDPSprite, ptr %440, i32 0, i32 1
  %442 = getelementptr inbounds %struct.anon.0, ptr %441, i32 0, i32 1
  store i8 0, ptr %442, align 1, !tbaa !9
  %443 = load i16, ptr @slist_addr, align 2, !tbaa !14
  %444 = call zeroext i8 @DMA_queueDmaFast(i8 noundef zeroext 0, ptr noundef @vdpSpriteCache, i16 noundef zeroext %443, i16 noundef zeroext 4, i16 noundef zeroext 2)
  br label %445

445:                                              ; preds = %437, %425
  call void @llvm.lifetime.end.p0(i64 1, ptr %3) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %2) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %1) #4
  ret void
}

declare zeroext i8 @SYS_getShowFrameLoad(...) #3

; Function Attrs: nounwind uwtable
declare hidden void @loadTiles(ptr noundef) #1

declare zeroext i8 @DMA_queueDmaFast(i8 noundef zeroext, ptr noundef, i16 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext) #3

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { noinline 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 = { "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 }

!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 = !{!7, !7, i64 0}
!10 = !{!11, !12, i64 44}
!11 = !{!"Sprite", !12, i64 0, !12, i64 2, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !12, i64 40, !12, i64 42, !12, i64 44, !12, i64 46, !12, i64 48, !12, i64 50, !12, i64 52, !13, i64 56, !6, i64 64, !6, i64 72}
!12 = !{!"short", !7, i64 0}
!13 = !{!"long", !7, i64 0}
!14 = !{!12, !12, i64 0}
!15 = !{!11, !12, i64 0}
!16 = !{!11, !12, i64 2}
!17 = !{!11, !6, i64 32}
!18 = !{!11, !12, i64 52}
!19 = !{!11, !12, i64 48}
!20 = !{!21, !12, i64 0}
!21 = !{!"", !12, i64 0, !7, i64 2, !7, i64 4, !12, i64 6}
!22 = !{!23, !7, i64 2}
!23 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3, !7, i64 4, !7, i64 5}
!24 = !{!11, !12, i64 46}
!25 = !{!21, !12, i64 6}
!26 = !{!23, !7, i64 0}
!27 = !{!23, !7, i64 3}
!28 = !{!23, !7, i64 5}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.mustprogress"}
!31 = !{!23, !7, i64 4}
!32 = distinct !{!32, !30}
!33 = !{!23, !7, i64 1}
!34 = distinct !{!34, !30}
!35 = distinct !{!35, !30}
!36 = !{!11, !6, i64 72}
!37 = distinct !{!37, !30}


; 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.VDPSprite = type { i16, %union.anon, %union.anon.1, i16 }
%union.anon = type { %struct.anon }
%struct.anon = type { i16 }
%union.anon.1 = type { i16 }

@firstSprite = external dso_local local_unnamed_addr global ptr, align 8
@vdpSpriteCache = external global [96 x %struct.VDPSprite], align 16
@SPR_update.visibilityMask = external hidden local_unnamed_addr constant [17 x i16], align 16
@slist_addr = external local_unnamed_addr global i16, align 2

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

; Function Attrs: nounwind uwtable
declare hidden zeroext i16 @updateFrame(ptr noundef, i16 noundef zeroext) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden zeroext i16 @updateVisibility(ptr noundef, i16 noundef zeroext) local_unnamed_addr #0

; Function Attrs: noinline nounwind uwtable
define dso_local void @SPR_update() local_unnamed_addr #1 {
  %1 = load ptr, ptr @firstSprite, align 8, !tbaa !5
  %2 = tail call zeroext i8 (...) @SYS_getShowFrameLoad() #3
  %.not = icmp eq i8 %2, 0
  br i1 %.not, label %4, label %3

3:                                                ; preds = %0
  store i8 1, ptr getelementptr inbounds (i8, ptr @vdpSpriteCache, i64 3), align 1, !tbaa !9
  br label %4

4:                                                ; preds = %3, %0
  %.0146 = phi i8 [ 2, %3 ], [ 1, %0 ]
  %.0138 = phi ptr [ getelementptr inbounds (i8, ptr @vdpSpriteCache, i64 8), %3 ], [ @vdpSpriteCache, %0 ]
  %.not159211 = icmp eq ptr %1, null
  br i1 %.not159211, label %._crit_edge, label %.lr.ph215

.lr.ph215:                                        ; preds = %4, %.loopexit
  %.0129214 = phi ptr [ %180, %.loopexit ], [ %1, %4 ]
  %.1139213 = phi ptr [ %.12, %.loopexit ], [ %.0138, %4 ]
  %.1147212 = phi i8 [ %.12158, %.loopexit ], [ %.0146, %4 ]
  %5 = getelementptr inbounds i8, ptr %.0129214, i64 44
  %6 = load i16, ptr %5, align 4, !tbaa !10
  %7 = icmp sgt i16 %6, 0
  br i1 %7, label %8, label %13

8:                                                ; preds = %.lr.ph215
  %9 = add nsw i16 %6, -1
  %10 = icmp eq i16 %9, 0
  br i1 %10, label %11, label %12

11:                                               ; preds = %8
  tail call void @SPR_nextFrame(ptr noundef nonnull %.0129214)
  br label %13

12:                                               ; preds = %8
  store i16 %9, ptr %5, align 4, !tbaa !10
  br label %13

13:                                               ; preds = %11, %12, %.lr.ph215
  %14 = load i16, ptr %.0129214, align 8, !tbaa !14
  %15 = and i16 %14, 2
  %.not161 = icmp eq i16 %15, 0
  br i1 %.not161, label %18, label %16

16:                                               ; preds = %13
  %17 = tail call zeroext i16 @updateFrame(ptr noundef nonnull %.0129214, i16 noundef zeroext %14)
  br label %18

18:                                               ; preds = %16, %13
  %.0142 = phi i16 [ %17, %16 ], [ %14, %13 ]
  %19 = and i16 %.0142, 1
  %.not162 = icmp eq i16 %19, 0
  br i1 %.not162, label %22, label %20

20:                                               ; preds = %18
  %21 = tail call zeroext i16 @updateVisibility(ptr noundef nonnull %.0129214, i16 noundef zeroext %.0142)
  br label %22

22:                                               ; preds = %20, %18
  %.1143 = phi i16 [ %21, %20 ], [ %.0142, %18 ]
  %23 = getelementptr inbounds i8, ptr %.0129214, i64 2
  %24 = load i16, ptr %23, align 2, !tbaa !15
  %.not163 = icmp eq i16 %24, 0
  br i1 %.not163, label %.loopexit, label %25

25:                                               ; preds = %22
  %26 = icmp slt i16 %.1143, 0
  %27 = icmp ult i8 %.1147212, 81
  %or.cond = select i1 %26, i1 %27, i1 false
  br i1 %or.cond, label %28, label %.loopexit

28:                                               ; preds = %25
  %29 = and i16 %.1143, 4
  %.not164 = icmp eq i16 %29, 0
  br i1 %.not164, label %32, label %30

30:                                               ; preds = %28
  tail call void @loadTiles(ptr noundef nonnull %.0129214)
  %31 = and i16 %.1143, -5
  br label %32

32:                                               ; preds = %30, %28
  %.2144 = phi i16 [ %31, %30 ], [ %.1143, %28 ]
  %33 = getelementptr inbounds i8, ptr %.0129214, i64 32
  %34 = load ptr, ptr %33, align 8, !tbaa !16
  %35 = getelementptr inbounds i8, ptr %.0129214, i64 52
  %36 = load i16, ptr %35, align 4, !tbaa !17
  %37 = load i8, ptr %34, align 8, !tbaa !9
  %38 = icmp slt i8 %37, 0
  br i1 %38, label %39, label %52

39:                                               ; preds = %32
  %40 = getelementptr inbounds i8, ptr %.0129214, i64 48
  %41 = load i16, ptr %40, align 8, !tbaa !18
  store i16 %41, ptr %.1139213, align 2, !tbaa !19
  %42 = getelementptr inbounds i8, ptr %34, i64 26
  %43 = load i8, ptr %42, align 1, !tbaa !21
  %44 = getelementptr inbounds i8, ptr %.1139213, i64 2
  store i8 %43, ptr %44, align 2, !tbaa !9
  %45 = add nuw nsw i8 %.1147212, 1
  %46 = getelementptr inbounds i8, ptr %.1139213, i64 3
  store i8 %.1147212, ptr %46, align 1, !tbaa !9
  %47 = getelementptr inbounds i8, ptr %.1139213, i64 4
  store i16 %36, ptr %47, align 2, !tbaa !9
  %48 = getelementptr inbounds i8, ptr %.0129214, i64 46
  %49 = load i16, ptr %48, align 2, !tbaa !23
  %50 = getelementptr inbounds i8, ptr %.1139213, i64 6
  store i16 %49, ptr %50, align 2, !tbaa !24
  %51 = getelementptr inbounds i8, ptr %.1139213, i64 8
  br label %.loopexit

52:                                               ; preds = %32
  %53 = getelementptr inbounds i8, ptr %34, i64 24
  %54 = load i16, ptr %23, align 2, !tbaa !15
  %55 = zext nneg i8 %37 to i64
  %56 = getelementptr inbounds [17 x i16], ptr @SPR_update.visibilityMask, i64 0, i64 %55
  %57 = load i16, ptr %56, align 2, !tbaa !25
  %58 = and i16 %57, %54
  %59 = lshr i16 %36, 11
  %60 = and i16 %59, 3
  %.not168202 = icmp eq i16 %58, 0
  switch i16 %60, label %default.unreachable [
    i16 0, label %.preheader
    i16 1, label %.preheader169
    i16 2, label %.preheader171
    i16 3, label %.preheader173
  ]

.preheader173:                                    ; preds = %52
  br i1 %.not168202, label %.loopexit, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader173
  %61 = getelementptr inbounds i8, ptr %.0129214, i64 48
  %62 = getelementptr inbounds i8, ptr %.0129214, i64 46
  br label %151

.preheader171:                                    ; preds = %52
  br i1 %.not168202, label %.loopexit, label %.lr.ph190

.lr.ph190:                                        ; preds = %.preheader171
  %63 = getelementptr inbounds i8, ptr %.0129214, i64 48
  %64 = getelementptr inbounds i8, ptr %.0129214, i64 46
  br label %123

.preheader169:                                    ; preds = %52
  br i1 %.not168202, label %.loopexit, label %.lr.ph199

.lr.ph199:                                        ; preds = %.preheader169
  %65 = getelementptr inbounds i8, ptr %.0129214, i64 48
  %66 = getelementptr inbounds i8, ptr %.0129214, i64 46
  br label %96

.preheader:                                       ; preds = %52
  br i1 %.not168202, label %.loopexit, label %.lr.ph208

.lr.ph208:                                        ; preds = %.preheader
  %67 = getelementptr inbounds i8, ptr %.0129214, i64 48
  %68 = getelementptr inbounds i8, ptr %.0129214, i64 46
  br label %69

69:                                               ; preds = %.lr.ph208, %89
  %.0207 = phi i16 [ %58, %.lr.ph208 ], [ %95, %89 ]
  %.0130206 = phi i16 [ %36, %.lr.ph208 ], [ %93, %89 ]
  %.0134205 = phi ptr [ %53, %.lr.ph208 ], [ %94, %89 ]
  %.2140204 = phi ptr [ %.1139213, %.lr.ph208 ], [ %.3141, %89 ]
  %.2148203 = phi i8 [ %.1147212, %.lr.ph208 ], [ %.3149, %89 ]
  %70 = icmp slt i16 %.0207, 0
  br i1 %70, label %71, label %89

71:                                               ; preds = %69
  %72 = load i16, ptr %67, align 8, !tbaa !18
  %73 = load i8, ptr %.0134205, align 1, !tbaa !26
  %74 = zext i8 %73 to i16
  %75 = add i16 %72, %74
  store i16 %75, ptr %.2140204, align 2, !tbaa !19
  %76 = getelementptr inbounds i8, ptr %.0134205, i64 2
  %77 = load i8, ptr %76, align 1, !tbaa !21
  %78 = getelementptr inbounds i8, ptr %.2140204, i64 2
  store i8 %77, ptr %78, align 2, !tbaa !9
  %79 = add i8 %.2148203, 1
  %80 = getelementptr inbounds i8, ptr %.2140204, i64 3
  store i8 %.2148203, ptr %80, align 1, !tbaa !9
  %81 = getelementptr inbounds i8, ptr %.2140204, i64 4
  store i16 %.0130206, ptr %81, align 2, !tbaa !9
  %82 = load i16, ptr %68, align 2, !tbaa !23
  %83 = getelementptr inbounds i8, ptr %.0134205, i64 3
  %84 = load i8, ptr %83, align 1, !tbaa !27
  %85 = zext i8 %84 to i16
  %86 = add i16 %82, %85
  %87 = getelementptr inbounds i8, ptr %.2140204, i64 6
  store i16 %86, ptr %87, align 2, !tbaa !24
  %88 = getelementptr inbounds i8, ptr %.2140204, i64 8
  br label %89

89:                                               ; preds = %71, %69
  %.3149 = phi i8 [ %79, %71 ], [ %.2148203, %69 ]
  %.3141 = phi ptr [ %88, %71 ], [ %.2140204, %69 ]
  %90 = getelementptr inbounds i8, ptr %.0134205, i64 5
  %91 = load i8, ptr %90, align 1, !tbaa !28
  %92 = zext i8 %91 to i16
  %93 = add i16 %.0130206, %92
  %94 = getelementptr inbounds i8, ptr %.0134205, i64 6
  %95 = shl i16 %.0207, 1
  %.not168 = icmp eq i16 %95, 0
  br i1 %.not168, label %.loopexit, label %69, !llvm.loop !29

96:                                               ; preds = %.lr.ph199, %116
  %.1198 = phi i16 [ %58, %.lr.ph199 ], [ %122, %116 ]
  %.1131197 = phi i16 [ %36, %.lr.ph199 ], [ %120, %116 ]
  %.1135196 = phi ptr [ %53, %.lr.ph199 ], [ %121, %116 ]
  %.4195 = phi ptr [ %.1139213, %.lr.ph199 ], [ %.5, %116 ]
  %.4150194 = phi i8 [ %.1147212, %.lr.ph199 ], [ %.5151, %116 ]
  %97 = icmp slt i16 %.1198, 0
  br i1 %97, label %98, label %116

98:                                               ; preds = %96
  %99 = load i16, ptr %65, align 8, !tbaa !18
  %100 = load i8, ptr %.1135196, align 1, !tbaa !26
  %101 = zext i8 %100 to i16
  %102 = add i16 %99, %101
  store i16 %102, ptr %.4195, align 2, !tbaa !19
  %103 = getelementptr inbounds i8, ptr %.1135196, i64 2
  %104 = load i8, ptr %103, align 1, !tbaa !21
  %105 = getelementptr inbounds i8, ptr %.4195, i64 2
  store i8 %104, ptr %105, align 2, !tbaa !9
  %106 = add i8 %.4150194, 1
  %107 = getelementptr inbounds i8, ptr %.4195, i64 3
  store i8 %.4150194, ptr %107, align 1, !tbaa !9
  %108 = getelementptr inbounds i8, ptr %.4195, i64 4
  store i16 %.1131197, ptr %108, align 2, !tbaa !9
  %109 = load i16, ptr %66, align 2, !tbaa !23
  %110 = getelementptr inbounds i8, ptr %.1135196, i64 4
  %111 = load i8, ptr %110, align 1, !tbaa !31
  %112 = zext i8 %111 to i16
  %113 = add i16 %109, %112
  %114 = getelementptr inbounds i8, ptr %.4195, i64 6
  store i16 %113, ptr %114, align 2, !tbaa !24
  %115 = getelementptr inbounds i8, ptr %.4195, i64 8
  br label %116

116:                                              ; preds = %98, %96
  %.5151 = phi i8 [ %106, %98 ], [ %.4150194, %96 ]
  %.5 = phi ptr [ %115, %98 ], [ %.4195, %96 ]
  %117 = getelementptr inbounds i8, ptr %.1135196, i64 5
  %118 = load i8, ptr %117, align 1, !tbaa !28
  %119 = zext i8 %118 to i16
  %120 = add i16 %.1131197, %119
  %121 = getelementptr inbounds i8, ptr %.1135196, i64 6
  %122 = shl i16 %.1198, 1
  %.not167 = icmp eq i16 %122, 0
  br i1 %.not167, label %.loopexit, label %96, !llvm.loop !32

123:                                              ; preds = %.lr.ph190, %144
  %.2189 = phi i16 [ %58, %.lr.ph190 ], [ %150, %144 ]
  %.2132188 = phi i16 [ %36, %.lr.ph190 ], [ %148, %144 ]
  %.2136187 = phi ptr [ %53, %.lr.ph190 ], [ %149, %144 ]
  %.6186 = phi ptr [ %.1139213, %.lr.ph190 ], [ %.7, %144 ]
  %.6152185 = phi i8 [ %.1147212, %.lr.ph190 ], [ %.7153, %144 ]
  %124 = icmp slt i16 %.2189, 0
  br i1 %124, label %125, label %144

125:                                              ; preds = %123
  %126 = load i16, ptr %63, align 8, !tbaa !18
  %127 = getelementptr inbounds i8, ptr %.2136187, i64 1
  %128 = load i8, ptr %127, align 1, !tbaa !33
  %129 = zext i8 %128 to i16
  %130 = add i16 %126, %129
  store i16 %130, ptr %.6186, align 2, !tbaa !19
  %131 = getelementptr inbounds i8, ptr %.2136187, i64 2
  %132 = load i8, ptr %131, align 1, !tbaa !21
  %133 = getelementptr inbounds i8, ptr %.6186, i64 2
  store i8 %132, ptr %133, align 2, !tbaa !9
  %134 = add i8 %.6152185, 1
  %135 = getelementptr inbounds i8, ptr %.6186, i64 3
  store i8 %.6152185, ptr %135, align 1, !tbaa !9
  %136 = getelementptr inbounds i8, ptr %.6186, i64 4
  store i16 %.2132188, ptr %136, align 2, !tbaa !9
  %137 = load i16, ptr %64, align 2, !tbaa !23
  %138 = getelementptr inbounds i8, ptr %.2136187, i64 3
  %139 = load i8, ptr %138, align 1, !tbaa !27
  %140 = zext i8 %139 to i16
  %141 = add i16 %137, %140
  %142 = getelementptr inbounds i8, ptr %.6186, i64 6
  store i16 %141, ptr %142, align 2, !tbaa !24
  %143 = getelementptr inbounds i8, ptr %.6186, i64 8
  br label %144

144:                                              ; preds = %125, %123
  %.7153 = phi i8 [ %134, %125 ], [ %.6152185, %123 ]
  %.7 = phi ptr [ %143, %125 ], [ %.6186, %123 ]
  %145 = getelementptr inbounds i8, ptr %.2136187, i64 5
  %146 = load i8, ptr %145, align 1, !tbaa !28
  %147 = zext i8 %146 to i16
  %148 = add i16 %.2132188, %147
  %149 = getelementptr inbounds i8, ptr %.2136187, i64 6
  %150 = shl i16 %.2189, 1
  %.not166 = icmp eq i16 %150, 0
  br i1 %.not166, label %.loopexit, label %123, !llvm.loop !34

151:                                              ; preds = %.lr.ph, %172
  %.3182 = phi i16 [ %58, %.lr.ph ], [ %178, %172 ]
  %.3133181 = phi i16 [ %36, %.lr.ph ], [ %176, %172 ]
  %.3137180 = phi ptr [ %53, %.lr.ph ], [ %177, %172 ]
  %.8179 = phi ptr [ %.1139213, %.lr.ph ], [ %.9, %172 ]
  %.8154178 = phi i8 [ %.1147212, %.lr.ph ], [ %.9155, %172 ]
  %152 = icmp slt i16 %.3182, 0
  br i1 %152, label %153, label %172

153:                                              ; preds = %151
  %154 = load i16, ptr %61, align 8, !tbaa !18
  %155 = getelementptr inbounds i8, ptr %.3137180, i64 1
  %156 = load i8, ptr %155, align 1, !tbaa !33
  %157 = zext i8 %156 to i16
  %158 = add i16 %154, %157
  store i16 %158, ptr %.8179, align 2, !tbaa !19
  %159 = getelementptr inbounds i8, ptr %.3137180, i64 2
  %160 = load i8, ptr %159, align 1, !tbaa !21
  %161 = getelementptr inbounds i8, ptr %.8179, i64 2
  store i8 %160, ptr %161, align 2, !tbaa !9
  %162 = add i8 %.8154178, 1
  %163 = getelementptr inbounds i8, ptr %.8179, i64 3
  store i8 %.8154178, ptr %163, align 1, !tbaa !9
  %164 = getelementptr inbounds i8, ptr %.8179, i64 4
  store i16 %.3133181, ptr %164, align 2, !tbaa !9
  %165 = load i16, ptr %62, align 2, !tbaa !23
  %166 = getelementptr inbounds i8, ptr %.3137180, i64 4
  %167 = load i8, ptr %166, align 1, !tbaa !31
  %168 = zext i8 %167 to i16
  %169 = add i16 %165, %168
  %170 = getelementptr inbounds i8, ptr %.8179, i64 6
  store i16 %169, ptr %170, align 2, !tbaa !24
  %171 = getelementptr inbounds i8, ptr %.8179, i64 8
  br label %172

172:                                              ; preds = %153, %151
  %.9155 = phi i8 [ %162, %153 ], [ %.8154178, %151 ]
  %.9 = phi ptr [ %171, %153 ], [ %.8179, %151 ]
  %173 = getelementptr inbounds i8, ptr %.3137180, i64 5
  %174 = load i8, ptr %173, align 1, !tbaa !28
  %175 = zext i8 %174 to i16
  %176 = add i16 %.3133181, %175
  %177 = getelementptr inbounds i8, ptr %.3137180, i64 6
  %178 = shl i16 %.3182, 1
  %.not165 = icmp eq i16 %178, 0
  br i1 %.not165, label %.loopexit, label %151, !llvm.loop !35

default.unreachable:                              ; preds = %52
  unreachable

.loopexit:                                        ; preds = %172, %144, %116, %89, %.preheader173, %.preheader171, %.preheader169, %.preheader, %39, %25, %22
  %.12158 = phi i8 [ %.1147212, %25 ], [ %.1147212, %22 ], [ %45, %39 ], [ %.1147212, %.preheader ], [ %.1147212, %.preheader169 ], [ %.1147212, %.preheader171 ], [ %.1147212, %.preheader173 ], [ %.3149, %89 ], [ %.5151, %116 ], [ %.7153, %144 ], [ %.9155, %172 ]
  %.3145 = phi i16 [ %.1143, %25 ], [ %.1143, %22 ], [ %.2144, %39 ], [ %.2144, %.preheader ], [ %.2144, %.preheader169 ], [ %.2144, %.preheader171 ], [ %.2144, %.preheader173 ], [ %.2144, %89 ], [ %.2144, %116 ], [ %.2144, %144 ], [ %.2144, %172 ]
  %.12 = phi ptr [ %.1139213, %25 ], [ %.1139213, %22 ], [ %51, %39 ], [ %.1139213, %.preheader ], [ %.1139213, %.preheader169 ], [ %.1139213, %.preheader171 ], [ %.1139213, %.preheader173 ], [ %.3141, %89 ], [ %.5, %116 ], [ %.7, %144 ], [ %.9, %172 ]
  store i16 %.3145, ptr %.0129214, align 8, !tbaa !14
  %179 = getelementptr inbounds i8, ptr %.0129214, i64 72
  %180 = load ptr, ptr %179, align 8, !tbaa !36
  %.not159 = icmp eq ptr %180, null
  br i1 %.not159, label %._crit_edge, label %.lr.ph215, !llvm.loop !37

._crit_edge:                                      ; preds = %.loopexit, %4
  %.1147.lcssa = phi i8 [ %.0146, %4 ], [ %.12158, %.loopexit ]
  %.1139.lcssa = phi ptr [ %.0138, %4 ], [ %.12, %.loopexit ]
  %181 = add i8 %.1147.lcssa, -1
  %.not160 = icmp eq i8 %181, 0
  br i1 %.not160, label %188, label %182

182:                                              ; preds = %._crit_edge
  %183 = getelementptr inbounds i8, ptr %.1139.lcssa, i64 -5
  store i8 0, ptr %183, align 1, !tbaa !9
  %184 = load i16, ptr @slist_addr, align 2, !tbaa !25
  %185 = zext i8 %181 to i16
  %186 = shl nuw nsw i16 %185, 2
  %187 = tail call zeroext i8 @DMA_queueDmaFast(i8 noundef zeroext 0, ptr noundef nonnull @vdpSpriteCache, i16 noundef zeroext %184, i16 noundef zeroext %186, i16 noundef zeroext 2) #3
  br label %192

188:                                              ; preds = %._crit_edge
  store i16 0, ptr %.1139.lcssa, align 2, !tbaa !19
  %189 = getelementptr inbounds i8, ptr %.1139.lcssa, i64 3
  store i8 0, ptr %189, align 1, !tbaa !9
  %190 = load i16, ptr @slist_addr, align 2, !tbaa !25
  %191 = tail call zeroext i8 @DMA_queueDmaFast(i8 noundef zeroext 0, ptr noundef nonnull @vdpSpriteCache, i16 noundef zeroext %190, i16 noundef zeroext 4, i16 noundef zeroext 2) #3
  br label %192

192:                                              ; preds = %188, %182
  ret void
}

declare zeroext i8 @SYS_getShowFrameLoad(...) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden void @loadTiles(ptr noundef) local_unnamed_addr #0

declare zeroext i8 @DMA_queueDmaFast(i8 noundef zeroext, ptr noundef, i16 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext) local_unnamed_addr #2

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { noinline 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 #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 }

!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 = !{!7, !7, i64 0}
!10 = !{!11, !12, i64 44}
!11 = !{!"Sprite", !12, i64 0, !12, i64 2, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !12, i64 40, !12, i64 42, !12, i64 44, !12, i64 46, !12, i64 48, !12, i64 50, !12, i64 52, !13, i64 56, !6, i64 64, !6, i64 72}
!12 = !{!"short", !7, i64 0}
!13 = !{!"long", !7, i64 0}
!14 = !{!11, !12, i64 0}
!15 = !{!11, !12, i64 2}
!16 = !{!11, !6, i64 32}
!17 = !{!11, !12, i64 52}
!18 = !{!11, !12, i64 48}
!19 = !{!20, !12, i64 0}
!20 = !{!"", !12, i64 0, !7, i64 2, !7, i64 4, !12, i64 6}
!21 = !{!22, !7, i64 2}
!22 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3, !7, i64 4, !7, i64 5}
!23 = !{!11, !12, i64 46}
!24 = !{!20, !12, i64 6}
!25 = !{!12, !12, i64 0}
!26 = !{!22, !7, i64 0}
!27 = !{!22, !7, i64 3}
!28 = !{!22, !7, i64 5}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.mustprogress"}
!31 = !{!22, !7, i64 4}
!32 = distinct !{!32, !30}
!33 = !{!22, !7, i64 1}
!34 = distinct !{!34, !30}
!35 = distinct !{!35, !30}
!36 = !{!11, !6, i64 72}
!37 = distinct !{!37, !30}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,ReassociatePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass