; LLVM IR from merpheus-dev/LavaEngine :: src/Utils/soloud/src/audiosource/wav (dr_impl)

; 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.drwav = type { ptr, ptr, ptr, ptr, %struct.drwav_allocation_callbacks, i32, %struct.drwav_fmt, i32, i16, i16, i16, i64, i64, i64, i64, i64, i32, %struct.drwav_smpl, %struct.drwav__memory_stream, %struct.drwav__memory_stream_write, %struct.anon.1, %struct.anon.2, %struct.anon.3 }
%struct.drwav_allocation_callbacks = type { ptr, ptr, ptr, ptr }
%struct.drwav_fmt = type { i16, i16, i32, i32, i16, i16, i16, i16, i32, [16 x i8] }
%struct.drwav_smpl = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, [1 x %struct.drwav_smpl_loop] }
%struct.drwav_smpl_loop = type { i32, i32, i32, i32, i32, i32 }
%struct.drwav__memory_stream = type { ptr, i64, i64 }
%struct.drwav__memory_stream_write = type { ptr, ptr, i64, i64, i64 }
%struct.anon.1 = type { i64 }
%struct.anon.2 = type { i32, [2 x i16], [2 x i32], [4 x i32], i32, [2 x [2 x i32]] }
%struct.anon.3 = type { i32, [2 x i32], [2 x i32], [16 x i32], i32 }

@.str.16 = external hidden unnamed_addr constant [103 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [21 x i8], align 1
@__PRETTY_FUNCTION__._Z30drwav_read_pcm_frames_s16__imaP5drwavmPs = external hidden unnamed_addr constant [82 x i8], align 1
@_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable = external hidden global [16 x i32], align 16
@_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE9stepTable = external hidden global [89 x i32], align 16

; 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: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) #1

; Function Attrs: mustprogress uwtable
define dso_local noundef i64 @_Z30drwav_read_pcm_frames_s16__imaP5drwavmPs(ptr noundef %0, i64 noundef %1, ptr noundef %2) #2 {
  %4 = alloca i64, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i64, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i64, align 8
  %9 = alloca [4 x i8], align 1
  %10 = alloca i32, align 4
  %11 = alloca [8 x i8], align 1
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca [4 x i8], align 1
  %16 = alloca i8, align 1
  %17 = alloca i8, align 1
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store i64 %1, ptr %6, align 8, !tbaa !9
  store ptr %2, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #4
  store i64 0, ptr %8, align 8, !tbaa !9
  %21 = load ptr, ptr %5, align 8, !tbaa !5
  %22 = icmp ne ptr %21, null
  br i1 %22, label %23, label %24

23:                                               ; preds = %3
  br label %26

24:                                               ; preds = %3
  call void @__assert_fail(ptr noundef @.str.29, ptr noundef @.str.16, i32 noundef 3349, ptr noundef @__PRETTY_FUNCTION__._Z30drwav_read_pcm_frames_s16__imaP5drwavmPs) #5
  unreachable

25:                                               ; No predecessors!
  br label %26

26:                                               ; preds = %25, %23
  %27 = load i64, ptr %6, align 8, !tbaa !9
  %28 = icmp ugt i64 %27, 0
  br i1 %28, label %29, label %30

29:                                               ; preds = %26
  br label %32

30:                                               ; preds = %26
  call void @__assert_fail(ptr noundef @.str.30, ptr noundef @.str.16, i32 noundef 3350, ptr noundef @__PRETTY_FUNCTION__._Z30drwav_read_pcm_frames_s16__imaP5drwavmPs) #5
  unreachable

31:                                               ; No predecessors!
  br label %32

32:                                               ; preds = %31, %29
  %33 = load ptr, ptr %7, align 8, !tbaa !5
  %34 = icmp ne ptr %33, null
  br i1 %34, label %35, label %36

35:                                               ; preds = %32
  br label %38

36:                                               ; preds = %32
  call void @__assert_fail(ptr noundef @.str.31, ptr noundef @.str.16, i32 noundef 3351, ptr noundef @__PRETTY_FUNCTION__._Z30drwav_read_pcm_frames_s16__imaP5drwavmPs) #5
  unreachable

37:                                               ; No predecessors!
  br label %38

38:                                               ; preds = %37, %35
  br label %39

39:                                               ; preds = %741, %298, %38
  %40 = load i64, ptr %6, align 8, !tbaa !9
  %41 = icmp ugt i64 %40, 0
  br i1 %41, label %42, label %51

42:                                               ; preds = %39
  %43 = load ptr, ptr %5, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.drwav, ptr %43, i32 0, i32 20
  %45 = getelementptr inbounds %struct.anon.1, ptr %44, i32 0, i32 0
  %46 = load i64, ptr %45, align 8, !tbaa !11
  %47 = load ptr, ptr %5, align 8, !tbaa !5
  %48 = getelementptr inbounds %struct.drwav, ptr %47, i32 0, i32 11
  %49 = load i64, ptr %48, align 8, !tbaa !24
  %50 = icmp ult i64 %46, %49
  br label %51

51:                                               ; preds = %42, %39
  %52 = phi i1 [ false, %39 ], [ %50, %42 ]
  br i1 %52, label %53, label %742

53:                                               ; preds = %51
  %54 = load ptr, ptr %5, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.drwav, ptr %54, i32 0, i32 22
  %56 = getelementptr inbounds %struct.anon.3, ptr %55, i32 0, i32 4
  %57 = load i32, ptr %56, align 4, !tbaa !25
  %58 = icmp eq i32 %57, 0
  br i1 %58, label %59, label %202

59:                                               ; preds = %53
  %60 = load ptr, ptr %5, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.drwav, ptr %60, i32 0, i32 22
  %62 = getelementptr inbounds %struct.anon.3, ptr %61, i32 0, i32 0
  %63 = load i32, ptr %62, align 4, !tbaa !26
  %64 = icmp eq i32 %63, 0
  br i1 %64, label %65, label %202

65:                                               ; preds = %59
  %66 = load ptr, ptr %5, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.drwav, ptr %66, i32 0, i32 8
  %68 = load i16, ptr %67, align 8, !tbaa !27
  %69 = zext i16 %68 to i32
  %70 = icmp eq i32 %69, 1
  br i1 %70, label %71, label %124

71:                                               ; preds = %65
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #4
  %72 = load ptr, ptr %5, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.drwav, ptr %72, i32 0, i32 0
  %74 = load ptr, ptr %73, align 8, !tbaa !28
  %75 = load ptr, ptr %5, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.drwav, ptr %75, i32 0, i32 3
  %77 = load ptr, ptr %76, align 8, !tbaa !29
  %78 = getelementptr inbounds [4 x i8], ptr %9, i64 0, i64 0
  %79 = call noundef i64 %74(ptr noundef %77, ptr noundef %78, i64 noundef 4)
  %80 = icmp ne i64 %79, 4
  br i1 %80, label %81, label %83

81:                                               ; preds = %71
  %82 = load i64, ptr %8, align 8, !tbaa !9
  store i64 %82, ptr %4, align 8
  store i32 1, ptr %10, align 4
  br label %121

83:                                               ; preds = %71
  %84 = load ptr, ptr %5, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.drwav, ptr %84, i32 0, i32 6
  %86 = getelementptr inbounds %struct.drwav_fmt, ptr %85, i32 0, i32 4
  %87 = load i16, ptr %86, align 4, !tbaa !30
  %88 = zext i16 %87 to i64
  %89 = sub i64 %88, 4
  %90 = trunc i64 %89 to i32
  %91 = load ptr, ptr %5, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.drwav, ptr %91, i32 0, i32 22
  %93 = getelementptr inbounds %struct.anon.3, ptr %92, i32 0, i32 0
  store i32 %90, ptr %93, align 4, !tbaa !26
  %94 = getelementptr inbounds [4 x i8], ptr %9, i64 0, i64 0
  %95 = getelementptr inbounds i8, ptr %94, i64 0
  %96 = call noundef signext i16 @_ZL19drwav__bytes_to_s16PKh(ptr noundef %95)
  %97 = sext i16 %96 to i32
  %98 = load ptr, ptr %5, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.drwav, ptr %98, i32 0, i32 22
  %100 = getelementptr inbounds %struct.anon.3, ptr %99, i32 0, i32 1
  %101 = getelementptr inbounds [2 x i32], ptr %100, i64 0, i64 0
  store i32 %97, ptr %101, align 4, !tbaa !31
  %102 = getelementptr inbounds [4 x i8], ptr %9, i64 0, i64 2
  %103 = load i8, ptr %102, align 1, !tbaa !32
  %104 = zext i8 %103 to i32
  %105 = load ptr, ptr %5, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.drwav, ptr %105, i32 0, i32 22
  %107 = getelementptr inbounds %struct.anon.3, ptr %106, i32 0, i32 2
  %108 = getelementptr inbounds [2 x i32], ptr %107, i64 0, i64 0
  store i32 %104, ptr %108, align 4, !tbaa !31
  %109 = load ptr, ptr %5, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.drwav, ptr %109, i32 0, i32 22
  %111 = getelementptr inbounds %struct.anon.3, ptr %110, i32 0, i32 1
  %112 = getelementptr inbounds [2 x i32], ptr %111, i64 0, i64 0
  %113 = load i32, ptr %112, align 4, !tbaa !31
  %114 = load ptr, ptr %5, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.drwav, ptr %114, i32 0, i32 22
  %116 = getelementptr inbounds %struct.anon.3, ptr %115, i32 0, i32 3
  %117 = getelementptr inbounds [16 x i32], ptr %116, i64 0, i64 15
  store i32 %113, ptr %117, align 4, !tbaa !31
  %118 = load ptr, ptr %5, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.drwav, ptr %118, i32 0, i32 22
  %120 = getelementptr inbounds %struct.anon.3, ptr %119, i32 0, i32 4
  store i32 1, ptr %120, align 4, !tbaa !25
  store i32 0, ptr %10, align 4
  br label %121

121:                                              ; preds = %83, %81
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #4
  %122 = load i32, ptr %10, align 4
  switch i32 %122, label %744 [
    i32 0, label %123
  ]

123:                                              ; preds = %121
  br label %201

124:                                              ; preds = %65
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #4
  %125 = load ptr, ptr %5, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.drwav, ptr %125, i32 0, i32 0
  %127 = load ptr, ptr %126, align 8, !tbaa !28
  %128 = load ptr, ptr %5, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.drwav, ptr %128, i32 0, i32 3
  %130 = load ptr, ptr %129, align 8, !tbaa !29
  %131 = getelementptr inbounds [8 x i8], ptr %11, i64 0, i64 0
  %132 = call noundef i64 %127(ptr noundef %130, ptr noundef %131, i64 noundef 8)
  %133 = icmp ne i64 %132, 8
  br i1 %133, label %134, label %136

134:                                              ; preds = %124
  %135 = load i64, ptr %8, align 8, !tbaa !9
  store i64 %135, ptr %4, align 8
  store i32 1, ptr %10, align 4
  br label %198

136:                                              ; preds = %124
  %137 = load ptr, ptr %5, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.drwav, ptr %137, i32 0, i32 6
  %139 = getelementptr inbounds %struct.drwav_fmt, ptr %138, i32 0, i32 4
  %140 = load i16, ptr %139, align 4, !tbaa !30
  %141 = zext i16 %140 to i64
  %142 = sub i64 %141, 8
  %143 = trunc i64 %142 to i32
  %144 = load ptr, ptr %5, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.drwav, ptr %144, i32 0, i32 22
  %146 = getelementptr inbounds %struct.anon.3, ptr %145, i32 0, i32 0
  store i32 %143, ptr %146, align 4, !tbaa !26
  %147 = getelementptr inbounds [8 x i8], ptr %11, i64 0, i64 0
  %148 = getelementptr inbounds i8, ptr %147, i64 0
  %149 = call noundef signext i16 @_ZL19drwav__bytes_to_s16PKh(ptr noundef %148)
  %150 = sext i16 %149 to i32
  %151 = load ptr, ptr %5, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.drwav, ptr %151, i32 0, i32 22
  %153 = getelementptr inbounds %struct.anon.3, ptr %152, i32 0, i32 1
  %154 = getelementptr inbounds [2 x i32], ptr %153, i64 0, i64 0
  store i32 %150, ptr %154, align 4, !tbaa !31
  %155 = getelementptr inbounds [8 x i8], ptr %11, i64 0, i64 2
  %156 = load i8, ptr %155, align 1, !tbaa !32
  %157 = zext i8 %156 to i32
  %158 = load ptr, ptr %5, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.drwav, ptr %158, i32 0, i32 22
  %160 = getelementptr inbounds %struct.anon.3, ptr %159, i32 0, i32 2
  %161 = getelementptr inbounds [2 x i32], ptr %160, i64 0, i64 0
  store i32 %157, ptr %161, align 4, !tbaa !31
  %162 = getelementptr inbounds [8 x i8], ptr %11, i64 0, i64 0
  %163 = getelementptr inbounds i8, ptr %162, i64 4
  %164 = call noundef signext i16 @_ZL19drwav__bytes_to_s16PKh(ptr noundef %163)
  %165 = sext i16 %164 to i32
  %166 = load ptr, ptr %5, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.drwav, ptr %166, i32 0, i32 22
  %168 = getelementptr inbounds %struct.anon.3, ptr %167, i32 0, i32 1
  %169 = getelementptr inbounds [2 x i32], ptr %168, i64 0, i64 1
  store i32 %165, ptr %169, align 4, !tbaa !31
  %170 = getelementptr inbounds [8 x i8], ptr %11, i64 0, i64 6
  %171 = load i8, ptr %170, align 1, !tbaa !32
  %172 = zext i8 %171 to i32
  %173 = load ptr, ptr %5, align 8, !tbaa !5
  %174 = getelementptr inbounds %struct.drwav, ptr %173, i32 0, i32 22
  %175 = getelementptr inbounds %struct.anon.3, ptr %174, i32 0, i32 2
  %176 = getelementptr inbounds [2 x i32], ptr %175, i64 0, i64 1
  store i32 %172, ptr %176, align 4, !tbaa !31
  %177 = load ptr, ptr %5, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.drwav, ptr %177, i32 0, i32 22
  %179 = getelementptr inbounds %struct.anon.3, ptr %178, i32 0, i32 1
  %180 = getelementptr inbounds [2 x i32], ptr %179, i64 0, i64 0
  %181 = load i32, ptr %180, align 4, !tbaa !31
  %182 = load ptr, ptr %5, align 8, !tbaa !5
  %183 = getelementptr inbounds %struct.drwav, ptr %182, i32 0, i32 22
  %184 = getelementptr inbounds %struct.anon.3, ptr %183, i32 0, i32 3
  %185 = getelementptr inbounds [16 x i32], ptr %184, i64 0, i64 14
  store i32 %181, ptr %185, align 4, !tbaa !31
  %186 = load ptr, ptr %5, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct.drwav, ptr %186, i32 0, i32 22
  %188 = getelementptr inbounds %struct.anon.3, ptr %187, i32 0, i32 1
  %189 = getelementptr inbounds [2 x i32], ptr %188, i64 0, i64 1
  %190 = load i32, ptr %189, align 4, !tbaa !31
  %191 = load ptr, ptr %5, align 8, !tbaa !5
  %192 = getelementptr inbounds %struct.drwav, ptr %191, i32 0, i32 22
  %193 = getelementptr inbounds %struct.anon.3, ptr %192, i32 0, i32 3
  %194 = getelementptr inbounds [16 x i32], ptr %193, i64 0, i64 15
  store i32 %190, ptr %194, align 4, !tbaa !31
  %195 = load ptr, ptr %5, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.drwav, ptr %195, i32 0, i32 22
  %197 = getelementptr inbounds %struct.anon.3, ptr %196, i32 0, i32 4
  store i32 1, ptr %197, align 4, !tbaa !25
  store i32 0, ptr %10, align 4
  br label %198

198:                                              ; preds = %136, %134
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  %199 = load i32, ptr %10, align 4
  switch i32 %199, label %744 [
    i32 0, label %200
  ]

200:                                              ; preds = %198
  br label %201

201:                                              ; preds = %200, %123
  br label %202

202:                                              ; preds = %201, %59, %53
  br label %203

203:                                              ; preds = %259, %202
  %204 = load i64, ptr %6, align 8, !tbaa !9
  %205 = icmp ugt i64 %204, 0
  br i1 %205, label %206, label %221

206:                                              ; preds = %203
  %207 = load ptr, ptr %5, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.drwav, ptr %207, i32 0, i32 22
  %209 = getelementptr inbounds %struct.anon.3, ptr %208, i32 0, i32 4
  %210 = load i32, ptr %209, align 4, !tbaa !25
  %211 = icmp ugt i32 %210, 0
  br i1 %211, label %212, label %221

212:                                              ; preds = %206
  %213 = load ptr, ptr %5, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.drwav, ptr %213, i32 0, i32 20
  %215 = getelementptr inbounds %struct.anon.1, ptr %214, i32 0, i32 0
  %216 = load i64, ptr %215, align 8, !tbaa !11
  %217 = load ptr, ptr %5, align 8, !tbaa !5
  %218 = getelementptr inbounds %struct.drwav, ptr %217, i32 0, i32 11
  %219 = load i64, ptr %218, align 8, !tbaa !24
  %220 = icmp ult i64 %216, %219
  br label %221

221:                                              ; preds = %212, %206, %203
  %222 = phi i1 [ false, %206 ], [ false, %203 ], [ %220, %212 ]
  br i1 %222, label %223, label %281

223:                                              ; preds = %221
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  store i32 0, ptr %12, align 4, !tbaa !31
  br label %224

224:                                              ; preds = %256, %223
  %225 = load i32, ptr %12, align 4, !tbaa !31
  %226 = load ptr, ptr %5, align 8, !tbaa !5
  %227 = getelementptr inbounds %struct.drwav, ptr %226, i32 0, i32 8
  %228 = load i16, ptr %227, align 8, !tbaa !27
  %229 = zext i16 %228 to i32
  %230 = icmp ult i32 %225, %229
  br i1 %230, label %231, label %259

231:                                              ; preds = %224
  %232 = load ptr, ptr %5, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.drwav, ptr %232, i32 0, i32 22
  %234 = getelementptr inbounds %struct.anon.3, ptr %233, i32 0, i32 3
  %235 = load ptr, ptr %5, align 8, !tbaa !5
  %236 = getelementptr inbounds %struct.drwav, ptr %235, i32 0, i32 22
  %237 = getelementptr inbounds %struct.anon.3, ptr %236, i32 0, i32 4
  %238 = load i32, ptr %237, align 4, !tbaa !25
  %239 = load ptr, ptr %5, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.drwav, ptr %239, i32 0, i32 8
  %241 = load i16, ptr %240, align 8, !tbaa !27
  %242 = zext i16 %241 to i32
  %243 = mul i32 %238, %242
  %244 = zext i32 %243 to i64
  %245 = sub i64 16, %244
  %246 = load i32, ptr %12, align 4, !tbaa !31
  %247 = zext i32 %246 to i64
  %248 = add i64 %245, %247
  %249 = getelementptr inbounds [16 x i32], ptr %234, i64 0, i64 %248
  %250 = load i32, ptr %249, align 4, !tbaa !31
  %251 = trunc i32 %250 to i16
  %252 = load ptr, ptr %7, align 8, !tbaa !5
  %253 = load i32, ptr %12, align 4, !tbaa !31
  %254 = zext i32 %253 to i64
  %255 = getelementptr inbounds i16, ptr %252, i64 %254
  store i16 %251, ptr %255, align 2, !tbaa !33
  br label %256

256:                                              ; preds = %231
  %257 = load i32, ptr %12, align 4, !tbaa !31
  %258 = add i32 %257, 1
  store i32 %258, ptr %12, align 4, !tbaa !31
  br label %224, !llvm.loop !34

259:                                              ; preds = %224
  %260 = load ptr, ptr %5, align 8, !tbaa !5
  %261 = getelementptr inbounds %struct.drwav, ptr %260, i32 0, i32 8
  %262 = load i16, ptr %261, align 8, !tbaa !27
  %263 = zext i16 %262 to i32
  %264 = load ptr, ptr %7, align 8, !tbaa !5
  %265 = sext i32 %263 to i64
  %266 = getelementptr inbounds i16, ptr %264, i64 %265
  store ptr %266, ptr %7, align 8, !tbaa !5
  %267 = load i64, ptr %6, align 8, !tbaa !9
  %268 = sub i64 %267, 1
  store i64 %268, ptr %6, align 8, !tbaa !9
  %269 = load i64, ptr %8, align 8, !tbaa !9
  %270 = add i64 %269, 1
  store i64 %270, ptr %8, align 8, !tbaa !9
  %271 = load ptr, ptr %5, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct.drwav, ptr %271, i32 0, i32 20
  %273 = getelementptr inbounds %struct.anon.1, ptr %272, i32 0, i32 0
  %274 = load i64, ptr %273, align 8, !tbaa !11
  %275 = add i64 %274, 1
  store i64 %275, ptr %273, align 8, !tbaa !11
  %276 = load ptr, ptr %5, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.drwav, ptr %276, i32 0, i32 22
  %278 = getelementptr inbounds %struct.anon.3, ptr %277, i32 0, i32 4
  %279 = load i32, ptr %278, align 4, !tbaa !25
  %280 = sub i32 %279, 1
  store i32 %280, ptr %278, align 4, !tbaa !25
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  br label %203, !llvm.loop !36

281:                                              ; preds = %221
  %282 = load i64, ptr %6, align 8, !tbaa !9
  %283 = icmp eq i64 %282, 0
  br i1 %283, label %284, label %286

284:                                              ; preds = %281
  %285 = load i64, ptr %8, align 8, !tbaa !9
  store i64 %285, ptr %4, align 8
  store i32 1, ptr %10, align 4
  br label %744

286:                                              ; preds = %281
  %287 = load ptr, ptr %5, align 8, !tbaa !5
  %288 = getelementptr inbounds %struct.drwav, ptr %287, i32 0, i32 22
  %289 = getelementptr inbounds %struct.anon.3, ptr %288, i32 0, i32 4
  %290 = load i32, ptr %289, align 4, !tbaa !25
  %291 = icmp eq i32 %290, 0
  br i1 %291, label %292, label %741

292:                                              ; preds = %286
  %293 = load ptr, ptr %5, align 8, !tbaa !5
  %294 = getelementptr inbounds %struct.drwav, ptr %293, i32 0, i32 22
  %295 = getelementptr inbounds %struct.anon.3, ptr %294, i32 0, i32 0
  %296 = load i32, ptr %295, align 4, !tbaa !26
  %297 = icmp eq i32 %296, 0
  br i1 %297, label %298, label %299

298:                                              ; preds = %292
  br label %39, !llvm.loop !37

299:                                              ; preds = %292
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  %300 = load ptr, ptr %5, align 8, !tbaa !5
  %301 = getelementptr inbounds %struct.drwav, ptr %300, i32 0, i32 22
  %302 = getelementptr inbounds %struct.anon.3, ptr %301, i32 0, i32 4
  store i32 8, ptr %302, align 4, !tbaa !25
  store i32 0, ptr %13, align 4, !tbaa !31
  br label %303

303:                                              ; preds = %733, %299
  %304 = load i32, ptr %13, align 4, !tbaa !31
  %305 = load ptr, ptr %5, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.drwav, ptr %305, i32 0, i32 8
  %307 = load i16, ptr %306, align 8, !tbaa !27
  %308 = zext i16 %307 to i32
  %309 = icmp ult i32 %304, %308
  br i1 %309, label %310, label %736

310:                                              ; preds = %303
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #4
  %311 = load ptr, ptr %5, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct.drwav, ptr %311, i32 0, i32 0
  %313 = load ptr, ptr %312, align 8, !tbaa !28
  %314 = load ptr, ptr %5, align 8, !tbaa !5
  %315 = getelementptr inbounds %struct.drwav, ptr %314, i32 0, i32 3
  %316 = load ptr, ptr %315, align 8, !tbaa !29
  %317 = call noundef i64 %313(ptr noundef %316, ptr noundef %15, i64 noundef 4)
  %318 = icmp ne i64 %317, 4
  br i1 %318, label %319, label %324

319:                                              ; preds = %310
  %320 = load ptr, ptr %5, align 8, !tbaa !5
  %321 = getelementptr inbounds %struct.drwav, ptr %320, i32 0, i32 22
  %322 = getelementptr inbounds %struct.anon.3, ptr %321, i32 0, i32 4
  store i32 0, ptr %322, align 4, !tbaa !25
  %323 = load i64, ptr %8, align 8, !tbaa !9
  store i64 %323, ptr %4, align 8
  store i32 1, ptr %10, align 4
  br label %730

324:                                              ; preds = %310
  %325 = load ptr, ptr %5, align 8, !tbaa !5
  %326 = getelementptr inbounds %struct.drwav, ptr %325, i32 0, i32 22
  %327 = getelementptr inbounds %struct.anon.3, ptr %326, i32 0, i32 0
  %328 = load i32, ptr %327, align 4, !tbaa !26
  %329 = sub i32 %328, 4
  store i32 %329, ptr %327, align 4, !tbaa !26
  store i32 0, ptr %14, align 4, !tbaa !31
  br label %330

330:                                              ; preds = %726, %324
  %331 = load i32, ptr %14, align 4, !tbaa !31
  %332 = icmp ult i32 %331, 4
  br i1 %332, label %333, label %729

333:                                              ; preds = %330
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #4
  %334 = load i32, ptr %14, align 4, !tbaa !31
  %335 = zext i32 %334 to i64
  %336 = getelementptr inbounds [4 x i8], ptr %15, i64 0, i64 %335
  %337 = load i8, ptr %336, align 1, !tbaa !32
  %338 = zext i8 %337 to i32
  %339 = and i32 %338, 15
  %340 = ashr i32 %339, 0
  %341 = trunc i32 %340 to i8
  store i8 %341, ptr %16, align 1, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 1, ptr %17) #4
  %342 = load i32, ptr %14, align 4, !tbaa !31
  %343 = zext i32 %342 to i64
  %344 = getelementptr inbounds [4 x i8], ptr %15, i64 0, i64 %343
  %345 = load i8, ptr %344, align 1, !tbaa !32
  %346 = zext i8 %345 to i32
  %347 = and i32 %346, 240
  %348 = ashr i32 %347, 4
  %349 = trunc i32 %348 to i8
  store i8 %349, ptr %17, align 1, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #4
  %350 = load ptr, ptr %5, align 8, !tbaa !5
  %351 = getelementptr inbounds %struct.drwav, ptr %350, i32 0, i32 22
  %352 = getelementptr inbounds %struct.anon.3, ptr %351, i32 0, i32 2
  %353 = load i32, ptr %13, align 4, !tbaa !31
  %354 = zext i32 %353 to i64
  %355 = getelementptr inbounds [2 x i32], ptr %352, i64 0, i64 %354
  %356 = load i32, ptr %355, align 4, !tbaa !31
  %357 = sext i32 %356 to i64
  %358 = getelementptr inbounds [89 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE9stepTable, i64 0, i64 %357
  %359 = load i32, ptr %358, align 4, !tbaa !31
  store i32 %359, ptr %18, align 4, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #4
  %360 = load ptr, ptr %5, align 8, !tbaa !5
  %361 = getelementptr inbounds %struct.drwav, ptr %360, i32 0, i32 22
  %362 = getelementptr inbounds %struct.anon.3, ptr %361, i32 0, i32 1
  %363 = load i32, ptr %13, align 4, !tbaa !31
  %364 = zext i32 %363 to i64
  %365 = getelementptr inbounds [2 x i32], ptr %362, i64 0, i64 %364
  %366 = load i32, ptr %365, align 4, !tbaa !31
  store i32 %366, ptr %19, align 4, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #4
  %367 = load i32, ptr %18, align 4, !tbaa !31
  %368 = ashr i32 %367, 3
  store i32 %368, ptr %20, align 4, !tbaa !31
  %369 = load i8, ptr %16, align 1, !tbaa !32
  %370 = zext i8 %369 to i32
  %371 = and i32 %370, 1
  %372 = icmp ne i32 %371, 0
  br i1 %372, label %373, label %378

373:                                              ; preds = %333
  %374 = load i32, ptr %18, align 4, !tbaa !31
  %375 = ashr i32 %374, 2
  %376 = load i32, ptr %20, align 4, !tbaa !31
  %377 = add nsw i32 %376, %375
  store i32 %377, ptr %20, align 4, !tbaa !31
  br label %378

378:                                              ; preds = %373, %333
  %379 = load i8, ptr %16, align 1, !tbaa !32
  %380 = zext i8 %379 to i32
  %381 = and i32 %380, 2
  %382 = icmp ne i32 %381, 0
  br i1 %382, label %383, label %388

383:                                              ; preds = %378
  %384 = load i32, ptr %18, align 4, !tbaa !31
  %385 = ashr i32 %384, 1
  %386 = load i32, ptr %20, align 4, !tbaa !31
  %387 = add nsw i32 %386, %385
  store i32 %387, ptr %20, align 4, !tbaa !31
  br label %388

388:                                              ; preds = %383, %378
  %389 = load i8, ptr %16, align 1, !tbaa !32
  %390 = zext i8 %389 to i32
  %391 = and i32 %390, 4
  %392 = icmp ne i32 %391, 0
  br i1 %392, label %393, label %397

393:                                              ; preds = %388
  %394 = load i32, ptr %18, align 4, !tbaa !31
  %395 = load i32, ptr %20, align 4, !tbaa !31
  %396 = add nsw i32 %395, %394
  store i32 %396, ptr %20, align 4, !tbaa !31
  br label %397

397:                                              ; preds = %393, %388
  %398 = load i8, ptr %16, align 1, !tbaa !32
  %399 = zext i8 %398 to i32
  %400 = and i32 %399, 8
  %401 = icmp ne i32 %400, 0
  br i1 %401, label %402, label %405

402:                                              ; preds = %397
  %403 = load i32, ptr %20, align 4, !tbaa !31
  %404 = sub nsw i32 0, %403
  store i32 %404, ptr %20, align 4, !tbaa !31
  br label %405

405:                                              ; preds = %402, %397
  %406 = load i32, ptr %19, align 4, !tbaa !31
  %407 = load i32, ptr %20, align 4, !tbaa !31
  %408 = add nsw i32 %406, %407
  %409 = icmp slt i32 32767, %408
  br i1 %409, label %410, label %411

410:                                              ; preds = %405
  br label %415

411:                                              ; preds = %405
  %412 = load i32, ptr %19, align 4, !tbaa !31
  %413 = load i32, ptr %20, align 4, !tbaa !31
  %414 = add nsw i32 %412, %413
  br label %415

415:                                              ; preds = %411, %410
  %416 = phi i32 [ 32767, %410 ], [ %414, %411 ]
  %417 = icmp sgt i32 -32768, %416
  br i1 %417, label %418, label %419

418:                                              ; preds = %415
  br label %431

419:                                              ; preds = %415
  %420 = load i32, ptr %19, align 4, !tbaa !31
  %421 = load i32, ptr %20, align 4, !tbaa !31
  %422 = add nsw i32 %420, %421
  %423 = icmp slt i32 32767, %422
  br i1 %423, label %424, label %425

424:                                              ; preds = %419
  br label %429

425:                                              ; preds = %419
  %426 = load i32, ptr %19, align 4, !tbaa !31
  %427 = load i32, ptr %20, align 4, !tbaa !31
  %428 = add nsw i32 %426, %427
  br label %429

429:                                              ; preds = %425, %424
  %430 = phi i32 [ 32767, %424 ], [ %428, %425 ]
  br label %431

431:                                              ; preds = %429, %418
  %432 = phi i32 [ -32768, %418 ], [ %430, %429 ]
  store i32 %432, ptr %19, align 4, !tbaa !31
  %433 = load i32, ptr %19, align 4, !tbaa !31
  %434 = load ptr, ptr %5, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.drwav, ptr %434, i32 0, i32 22
  %436 = getelementptr inbounds %struct.anon.3, ptr %435, i32 0, i32 1
  %437 = load i32, ptr %13, align 4, !tbaa !31
  %438 = zext i32 %437 to i64
  %439 = getelementptr inbounds [2 x i32], ptr %436, i64 0, i64 %438
  store i32 %433, ptr %439, align 4, !tbaa !31
  %440 = load ptr, ptr %5, align 8, !tbaa !5
  %441 = getelementptr inbounds %struct.drwav, ptr %440, i32 0, i32 22
  %442 = getelementptr inbounds %struct.anon.3, ptr %441, i32 0, i32 2
  %443 = load i32, ptr %13, align 4, !tbaa !31
  %444 = zext i32 %443 to i64
  %445 = getelementptr inbounds [2 x i32], ptr %442, i64 0, i64 %444
  %446 = load i32, ptr %445, align 4, !tbaa !31
  %447 = load i8, ptr %16, align 1, !tbaa !32
  %448 = zext i8 %447 to i64
  %449 = getelementptr inbounds [16 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable, i64 0, i64 %448
  %450 = load i32, ptr %449, align 4, !tbaa !31
  %451 = add nsw i32 %446, %450
  %452 = icmp slt i32 88, %451
  br i1 %452, label %453, label %454

453:                                              ; preds = %431
  br label %467

454:                                              ; preds = %431
  %455 = load ptr, ptr %5, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.drwav, ptr %455, i32 0, i32 22
  %457 = getelementptr inbounds %struct.anon.3, ptr %456, i32 0, i32 2
  %458 = load i32, ptr %13, align 4, !tbaa !31
  %459 = zext i32 %458 to i64
  %460 = getelementptr inbounds [2 x i32], ptr %457, i64 0, i64 %459
  %461 = load i32, ptr %460, align 4, !tbaa !31
  %462 = load i8, ptr %16, align 1, !tbaa !32
  %463 = zext i8 %462 to i64
  %464 = getelementptr inbounds [16 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable, i64 0, i64 %463
  %465 = load i32, ptr %464, align 4, !tbaa !31
  %466 = add nsw i32 %461, %465
  br label %467

467:                                              ; preds = %454, %453
  %468 = phi i32 [ 88, %453 ], [ %466, %454 ]
  %469 = icmp sgt i32 0, %468
  br i1 %469, label %470, label %471

470:                                              ; preds = %467
  br label %501

471:                                              ; preds = %467
  %472 = load ptr, ptr %5, align 8, !tbaa !5
  %473 = getelementptr inbounds %struct.drwav, ptr %472, i32 0, i32 22
  %474 = getelementptr inbounds %struct.anon.3, ptr %473, i32 0, i32 2
  %475 = load i32, ptr %13, align 4, !tbaa !31
  %476 = zext i32 %475 to i64
  %477 = getelementptr inbounds [2 x i32], ptr %474, i64 0, i64 %476
  %478 = load i32, ptr %477, align 4, !tbaa !31
  %479 = load i8, ptr %16, align 1, !tbaa !32
  %480 = zext i8 %479 to i64
  %481 = getelementptr inbounds [16 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable, i64 0, i64 %480
  %482 = load i32, ptr %481, align 4, !tbaa !31
  %483 = add nsw i32 %478, %482
  %484 = icmp slt i32 88, %483
  br i1 %484, label %485, label %486

485:                                              ; preds = %471
  br label %499

486:                                              ; preds = %471
  %487 = load ptr, ptr %5, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.drwav, ptr %487, i32 0, i32 22
  %489 = getelementptr inbounds %struct.anon.3, ptr %488, i32 0, i32 2
  %490 = load i32, ptr %13, align 4, !tbaa !31
  %491 = zext i32 %490 to i64
  %492 = getelementptr inbounds [2 x i32], ptr %489, i64 0, i64 %491
  %493 = load i32, ptr %492, align 4, !tbaa !31
  %494 = load i8, ptr %16, align 1, !tbaa !32
  %495 = zext i8 %494 to i64
  %496 = getelementptr inbounds [16 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable, i64 0, i64 %495
  %497 = load i32, ptr %496, align 4, !tbaa !31
  %498 = add nsw i32 %493, %497
  br label %499

499:                                              ; preds = %486, %485
  %500 = phi i32 [ 88, %485 ], [ %498, %486 ]
  br label %501

501:                                              ; preds = %499, %470
  %502 = phi i32 [ 0, %470 ], [ %500, %499 ]
  %503 = load ptr, ptr %5, align 8, !tbaa !5
  %504 = getelementptr inbounds %struct.drwav, ptr %503, i32 0, i32 22
  %505 = getelementptr inbounds %struct.anon.3, ptr %504, i32 0, i32 2
  %506 = load i32, ptr %13, align 4, !tbaa !31
  %507 = zext i32 %506 to i64
  %508 = getelementptr inbounds [2 x i32], ptr %505, i64 0, i64 %507
  store i32 %502, ptr %508, align 4, !tbaa !31
  %509 = load i32, ptr %19, align 4, !tbaa !31
  %510 = load ptr, ptr %5, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.drwav, ptr %510, i32 0, i32 22
  %512 = getelementptr inbounds %struct.anon.3, ptr %511, i32 0, i32 3
  %513 = load ptr, ptr %5, align 8, !tbaa !5
  %514 = getelementptr inbounds %struct.drwav, ptr %513, i32 0, i32 22
  %515 = getelementptr inbounds %struct.anon.3, ptr %514, i32 0, i32 4
  %516 = load i32, ptr %515, align 4, !tbaa !25
  %517 = load ptr, ptr %5, align 8, !tbaa !5
  %518 = getelementptr inbounds %struct.drwav, ptr %517, i32 0, i32 8
  %519 = load i16, ptr %518, align 8, !tbaa !27
  %520 = zext i16 %519 to i32
  %521 = mul i32 %516, %520
  %522 = zext i32 %521 to i64
  %523 = sub i64 16, %522
  %524 = load i32, ptr %14, align 4, !tbaa !31
  %525 = mul i32 %524, 2
  %526 = add i32 %525, 0
  %527 = load ptr, ptr %5, align 8, !tbaa !5
  %528 = getelementptr inbounds %struct.drwav, ptr %527, i32 0, i32 8
  %529 = load i16, ptr %528, align 8, !tbaa !27
  %530 = zext i16 %529 to i32
  %531 = mul i32 %526, %530
  %532 = zext i32 %531 to i64
  %533 = add i64 %523, %532
  %534 = load i32, ptr %13, align 4, !tbaa !31
  %535 = zext i32 %534 to i64
  %536 = add i64 %533, %535
  %537 = getelementptr inbounds [16 x i32], ptr %512, i64 0, i64 %536
  store i32 %509, ptr %537, align 4, !tbaa !31
  %538 = load ptr, ptr %5, align 8, !tbaa !5
  %539 = getelementptr inbounds %struct.drwav, ptr %538, i32 0, i32 22
  %540 = getelementptr inbounds %struct.anon.3, ptr %539, i32 0, i32 2
  %541 = load i32, ptr %13, align 4, !tbaa !31
  %542 = zext i32 %541 to i64
  %543 = getelementptr inbounds [2 x i32], ptr %540, i64 0, i64 %542
  %544 = load i32, ptr %543, align 4, !tbaa !31
  %545 = sext i32 %544 to i64
  %546 = getelementptr inbounds [89 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE9stepTable, i64 0, i64 %545
  %547 = load i32, ptr %546, align 4, !tbaa !31
  store i32 %547, ptr %18, align 4, !tbaa !31
  %548 = load ptr, ptr %5, align 8, !tbaa !5
  %549 = getelementptr inbounds %struct.drwav, ptr %548, i32 0, i32 22
  %550 = getelementptr inbounds %struct.anon.3, ptr %549, i32 0, i32 1
  %551 = load i32, ptr %13, align 4, !tbaa !31
  %552 = zext i32 %551 to i64
  %553 = getelementptr inbounds [2 x i32], ptr %550, i64 0, i64 %552
  %554 = load i32, ptr %553, align 4, !tbaa !31
  store i32 %554, ptr %19, align 4, !tbaa !31
  %555 = load i32, ptr %18, align 4, !tbaa !31
  %556 = ashr i32 %555, 3
  store i32 %556, ptr %20, align 4, !tbaa !31
  %557 = load i8, ptr %17, align 1, !tbaa !32
  %558 = zext i8 %557 to i32
  %559 = and i32 %558, 1
  %560 = icmp ne i32 %559, 0
  br i1 %560, label %561, label %566

561:                                              ; preds = %501
  %562 = load i32, ptr %18, align 4, !tbaa !31
  %563 = ashr i32 %562, 2
  %564 = load i32, ptr %20, align 4, !tbaa !31
  %565 = add nsw i32 %564, %563
  store i32 %565, ptr %20, align 4, !tbaa !31
  br label %566

566:                                              ; preds = %561, %501
  %567 = load i8, ptr %17, align 1, !tbaa !32
  %568 = zext i8 %567 to i32
  %569 = and i32 %568, 2
  %570 = icmp ne i32 %569, 0
  br i1 %570, label %571, label %576

571:                                              ; preds = %566
  %572 = load i32, ptr %18, align 4, !tbaa !31
  %573 = ashr i32 %572, 1
  %574 = load i32, ptr %20, align 4, !tbaa !31
  %575 = add nsw i32 %574, %573
  store i32 %575, ptr %20, align 4, !tbaa !31
  br label %576

576:                                              ; preds = %571, %566
  %577 = load i8, ptr %17, align 1, !tbaa !32
  %578 = zext i8 %577 to i32
  %579 = and i32 %578, 4
  %580 = icmp ne i32 %579, 0
  br i1 %580, label %581, label %585

581:                                              ; preds = %576
  %582 = load i32, ptr %18, align 4, !tbaa !31
  %583 = load i32, ptr %20, align 4, !tbaa !31
  %584 = add nsw i32 %583, %582
  store i32 %584, ptr %20, align 4, !tbaa !31
  br label %585

585:                                              ; preds = %581, %576
  %586 = load i8, ptr %17, align 1, !tbaa !32
  %587 = zext i8 %586 to i32
  %588 = and i32 %587, 8
  %589 = icmp ne i32 %588, 0
  br i1 %589, label %590, label %593

590:                                              ; preds = %585
  %591 = load i32, ptr %20, align 4, !tbaa !31
  %592 = sub nsw i32 0, %591
  store i32 %592, ptr %20, align 4, !tbaa !31
  br label %593

593:                                              ; preds = %590, %585
  %594 = load i32, ptr %19, align 4, !tbaa !31
  %595 = load i32, ptr %20, align 4, !tbaa !31
  %596 = add nsw i32 %594, %595
  %597 = icmp slt i32 32767, %596
  br i1 %597, label %598, label %599

598:                                              ; preds = %593
  br label %603

599:                                              ; preds = %593
  %600 = load i32, ptr %19, align 4, !tbaa !31
  %601 = load i32, ptr %20, align 4, !tbaa !31
  %602 = add nsw i32 %600, %601
  br label %603

603:                                              ; preds = %599, %598
  %604 = phi i32 [ 32767, %598 ], [ %602, %599 ]
  %605 = icmp sgt i32 -32768, %604
  br i1 %605, label %606, label %607

606:                                              ; preds = %603
  br label %619

607:                                              ; preds = %603
  %608 = load i32, ptr %19, align 4, !tbaa !31
  %609 = load i32, ptr %20, align 4, !tbaa !31
  %610 = add nsw i32 %608, %609
  %611 = icmp slt i32 32767, %610
  br i1 %611, label %612, label %613

612:                                              ; preds = %607
  br label %617

613:                                              ; preds = %607
  %614 = load i32, ptr %19, align 4, !tbaa !31
  %615 = load i32, ptr %20, align 4, !tbaa !31
  %616 = add nsw i32 %614, %615
  br label %617

617:                                              ; preds = %613, %612
  %618 = phi i32 [ 32767, %612 ], [ %616, %613 ]
  br label %619

619:                                              ; preds = %617, %606
  %620 = phi i32 [ -32768, %606 ], [ %618, %617 ]
  store i32 %620, ptr %19, align 4, !tbaa !31
  %621 = load i32, ptr %19, align 4, !tbaa !31
  %622 = load ptr, ptr %5, align 8, !tbaa !5
  %623 = getelementptr inbounds %struct.drwav, ptr %622, i32 0, i32 22
  %624 = getelementptr inbounds %struct.anon.3, ptr %623, i32 0, i32 1
  %625 = load i32, ptr %13, align 4, !tbaa !31
  %626 = zext i32 %625 to i64
  %627 = getelementptr inbounds [2 x i32], ptr %624, i64 0, i64 %626
  store i32 %621, ptr %627, align 4, !tbaa !31
  %628 = load ptr, ptr %5, align 8, !tbaa !5
  %629 = getelementptr inbounds %struct.drwav, ptr %628, i32 0, i32 22
  %630 = getelementptr inbounds %struct.anon.3, ptr %629, i32 0, i32 2
  %631 = load i32, ptr %13, align 4, !tbaa !31
  %632 = zext i32 %631 to i64
  %633 = getelementptr inbounds [2 x i32], ptr %630, i64 0, i64 %632
  %634 = load i32, ptr %633, align 4, !tbaa !31
  %635 = load i8, ptr %17, align 1, !tbaa !32
  %636 = zext i8 %635 to i64
  %637 = getelementptr inbounds [16 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable, i64 0, i64 %636
  %638 = load i32, ptr %637, align 4, !tbaa !31
  %639 = add nsw i32 %634, %638
  %640 = icmp slt i32 88, %639
  br i1 %640, label %641, label %642

641:                                              ; preds = %619
  br label %655

642:                                              ; preds = %619
  %643 = load ptr, ptr %5, align 8, !tbaa !5
  %644 = getelementptr inbounds %struct.drwav, ptr %643, i32 0, i32 22
  %645 = getelementptr inbounds %struct.anon.3, ptr %644, i32 0, i32 2
  %646 = load i32, ptr %13, align 4, !tbaa !31
  %647 = zext i32 %646 to i64
  %648 = getelementptr inbounds [2 x i32], ptr %645, i64 0, i64 %647
  %649 = load i32, ptr %648, align 4, !tbaa !31
  %650 = load i8, ptr %17, align 1, !tbaa !32
  %651 = zext i8 %650 to i64
  %652 = getelementptr inbounds [16 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable, i64 0, i64 %651
  %653 = load i32, ptr %652, align 4, !tbaa !31
  %654 = add nsw i32 %649, %653
  br label %655

655:                                              ; preds = %642, %641
  %656 = phi i32 [ 88, %641 ], [ %654, %642 ]
  %657 = icmp sgt i32 0, %656
  br i1 %657, label %658, label %659

658:                                              ; preds = %655
  br label %689

659:                                              ; preds = %655
  %660 = load ptr, ptr %5, align 8, !tbaa !5
  %661 = getelementptr inbounds %struct.drwav, ptr %660, i32 0, i32 22
  %662 = getelementptr inbounds %struct.anon.3, ptr %661, i32 0, i32 2
  %663 = load i32, ptr %13, align 4, !tbaa !31
  %664 = zext i32 %663 to i64
  %665 = getelementptr inbounds [2 x i32], ptr %662, i64 0, i64 %664
  %666 = load i32, ptr %665, align 4, !tbaa !31
  %667 = load i8, ptr %17, align 1, !tbaa !32
  %668 = zext i8 %667 to i64
  %669 = getelementptr inbounds [16 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable, i64 0, i64 %668
  %670 = load i32, ptr %669, align 4, !tbaa !31
  %671 = add nsw i32 %666, %670
  %672 = icmp slt i32 88, %671
  br i1 %672, label %673, label %674

673:                                              ; preds = %659
  br label %687

674:                                              ; preds = %659
  %675 = load ptr, ptr %5, align 8, !tbaa !5
  %676 = getelementptr inbounds %struct.drwav, ptr %675, i32 0, i32 22
  %677 = getelementptr inbounds %struct.anon.3, ptr %676, i32 0, i32 2
  %678 = load i32, ptr %13, align 4, !tbaa !31
  %679 = zext i32 %678 to i64
  %680 = getelementptr inbounds [2 x i32], ptr %677, i64 0, i64 %679
  %681 = load i32, ptr %680, align 4, !tbaa !31
  %682 = load i8, ptr %17, align 1, !tbaa !32
  %683 = zext i8 %682 to i64
  %684 = getelementptr inbounds [16 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable, i64 0, i64 %683
  %685 = load i32, ptr %684, align 4, !tbaa !31
  %686 = add nsw i32 %681, %685
  br label %687

687:                                              ; preds = %674, %673
  %688 = phi i32 [ 88, %673 ], [ %686, %674 ]
  br label %689

689:                                              ; preds = %687, %658
  %690 = phi i32 [ 0, %658 ], [ %688, %687 ]
  %691 = load ptr, ptr %5, align 8, !tbaa !5
  %692 = getelementptr inbounds %struct.drwav, ptr %691, i32 0, i32 22
  %693 = getelementptr inbounds %struct.anon.3, ptr %692, i32 0, i32 2
  %694 = load i32, ptr %13, align 4, !tbaa !31
  %695 = zext i32 %694 to i64
  %696 = getelementptr inbounds [2 x i32], ptr %693, i64 0, i64 %695
  store i32 %690, ptr %696, align 4, !tbaa !31
  %697 = load i32, ptr %19, align 4, !tbaa !31
  %698 = load ptr, ptr %5, align 8, !tbaa !5
  %699 = getelementptr inbounds %struct.drwav, ptr %698, i32 0, i32 22
  %700 = getelementptr inbounds %struct.anon.3, ptr %699, i32 0, i32 3
  %701 = load ptr, ptr %5, align 8, !tbaa !5
  %702 = getelementptr inbounds %struct.drwav, ptr %701, i32 0, i32 22
  %703 = getelementptr inbounds %struct.anon.3, ptr %702, i32 0, i32 4
  %704 = load i32, ptr %703, align 4, !tbaa !25
  %705 = load ptr, ptr %5, align 8, !tbaa !5
  %706 = getelementptr inbounds %struct.drwav, ptr %705, i32 0, i32 8
  %707 = load i16, ptr %706, align 8, !tbaa !27
  %708 = zext i16 %707 to i32
  %709 = mul i32 %704, %708
  %710 = zext i32 %709 to i64
  %711 = sub i64 16, %710
  %712 = load i32, ptr %14, align 4, !tbaa !31
  %713 = mul i32 %712, 2
  %714 = add i32 %713, 1
  %715 = load ptr, ptr %5, align 8, !tbaa !5
  %716 = getelementptr inbounds %struct.drwav, ptr %715, i32 0, i32 8
  %717 = load i16, ptr %716, align 8, !tbaa !27
  %718 = zext i16 %717 to i32
  %719 = mul i32 %714, %718
  %720 = zext i32 %719 to i64
  %721 = add i64 %711, %720
  %722 = load i32, ptr %13, align 4, !tbaa !31
  %723 = zext i32 %722 to i64
  %724 = add i64 %721, %723
  %725 = getelementptr inbounds [16 x i32], ptr %700, i64 0, i64 %724
  store i32 %697, ptr %725, align 4, !tbaa !31
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 1, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #4
  br label %726

726:                                              ; preds = %689
  %727 = load i32, ptr %14, align 4, !tbaa !31
  %728 = add i32 %727, 1
  store i32 %728, ptr %14, align 4, !tbaa !31
  br label %330, !llvm.loop !38

729:                                              ; preds = %330
  store i32 0, ptr %10, align 4
  br label %730

730:                                              ; preds = %729, %319
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  %731 = load i32, ptr %10, align 4
  switch i32 %731, label %737 [
    i32 0, label %732
  ]

732:                                              ; preds = %730
  br label %733

733:                                              ; preds = %732
  %734 = load i32, ptr %13, align 4, !tbaa !31
  %735 = add i32 %734, 1
  store i32 %735, ptr %13, align 4, !tbaa !31
  br label %303, !llvm.loop !39

736:                                              ; preds = %303
  store i32 0, ptr %10, align 4
  br label %737

737:                                              ; preds = %736, %730
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  %738 = load i32, ptr %10, align 4
  switch i32 %738, label %744 [
    i32 0, label %739
  ]

739:                                              ; preds = %737
  br label %740

740:                                              ; preds = %739
  br label %741

741:                                              ; preds = %740, %286
  br label %39, !llvm.loop !37

742:                                              ; preds = %51
  %743 = load i64, ptr %8, align 8, !tbaa !9
  store i64 %743, ptr %4, align 8
  store i32 1, ptr %10, align 4
  br label %744

744:                                              ; preds = %742, %737, %284, %198, %121
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #4
  %745 = load i64, ptr %4, align 8
  ret i64 %745
}

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare hidden noundef signext i16 @_ZL19drwav__bytes_to_s16PKh(ptr noundef) #3

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { mustprogress 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 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind }
attributes #5 = { 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, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = !{!12, !10, i64 288}
!12 = !{!"_ZTS5drwav", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !13, i64 32, !14, i64 64, !15, i64 68, !17, i64 108, !16, i64 112, !16, i64 114, !16, i64 116, !10, i64 120, !10, i64 128, !10, i64 136, !10, i64 144, !10, i64 152, !17, i64 160, !18, i64 164, !19, i64 224, !20, i64 248, !21, i64 288, !22, i64 296, !23, i64 348}
!13 = !{!"_ZTS26drwav_allocation_callbacks", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!14 = !{!"_ZTS15drwav_container", !7, i64 0}
!15 = !{!"_ZTS9drwav_fmt", !16, i64 0, !16, i64 2, !17, i64 4, !17, i64 8, !16, i64 12, !16, i64 14, !16, i64 16, !16, i64 18, !17, i64 20, !7, i64 24}
!16 = !{!"short", !7, i64 0}
!17 = !{!"int", !7, i64 0}
!18 = !{!"_ZTS10drwav_smpl", !17, i64 0, !17, i64 4, !17, i64 8, !17, i64 12, !17, i64 16, !17, i64 20, !17, i64 24, !17, i64 28, !17, i64 32, !7, i64 36}
!19 = !{!"_ZTS20drwav__memory_stream", !6, i64 0, !10, i64 8, !10, i64 16}
!20 = !{!"_ZTS26drwav__memory_stream_write", !6, i64 0, !6, i64 8, !10, i64 16, !10, i64 24, !10, i64 32}
!21 = !{!"_ZTSN5drwavUt_E", !10, i64 0}
!22 = !{!"_ZTSN5drwavUt0_E", !17, i64 0, !7, i64 4, !7, i64 8, !7, i64 16, !17, i64 32, !7, i64 36}
!23 = !{!"_ZTSN5drwavUt1_E", !17, i64 0, !7, i64 4, !7, i64 12, !7, i64 20, !17, i64 84}
!24 = !{!12, !10, i64 120}
!25 = !{!12, !17, i64 432}
!26 = !{!12, !17, i64 348}
!27 = !{!12, !16, i64 112}
!28 = !{!12, !6, i64 0}
!29 = !{!12, !6, i64 24}
!30 = !{!12, !16, i64 80}
!31 = !{!17, !17, i64 0}
!32 = !{!7, !7, i64 0}
!33 = !{!16, !16, i64 0}
!34 = distinct !{!34, !35}
!35 = !{!"llvm.loop.mustprogress"}
!36 = distinct !{!36, !35}
!37 = distinct !{!37, !35}
!38 = distinct !{!38, !35}
!39 = distinct !{!39, !35}


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

@.str.16 = external hidden unnamed_addr constant [103 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [21 x i8], align 1
@__PRETTY_FUNCTION__._Z30drwav_read_pcm_frames_s16__imaP5drwavmPs = external hidden unnamed_addr constant [82 x i8], align 1
@_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable = external hidden local_unnamed_addr global [16 x i32], align 16
@_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE9stepTable = external hidden local_unnamed_addr global [89 x i32], align 16

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

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

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: mustprogress uwtable
define dso_local noundef i64 @_Z30drwav_read_pcm_frames_s16__imaP5drwavmPs(ptr noundef %0, i64 noundef %1, ptr noundef writeonly %2) local_unnamed_addr #2 {
  %4 = alloca [4 x i8], align 1
  %5 = alloca [8 x i8], align 1
  %6 = alloca [4 x i8], align 1
  %.not = icmp eq ptr %0, null
  br i1 %.not, label %7, label %8

7:                                                ; preds = %3
  tail call void @__assert_fail(ptr noundef nonnull @.str.29, ptr noundef nonnull @.str.16, i32 noundef 3349, ptr noundef nonnull @__PRETTY_FUNCTION__._Z30drwav_read_pcm_frames_s16__imaP5drwavmPs) #5
  unreachable

8:                                                ; preds = %3
  %.not207 = icmp eq i64 %1, 0
  br i1 %.not207, label %9, label %10

9:                                                ; preds = %8
  tail call void @__assert_fail(ptr noundef nonnull @.str.30, ptr noundef nonnull @.str.16, i32 noundef 3350, ptr noundef nonnull @__PRETTY_FUNCTION__._Z30drwav_read_pcm_frames_s16__imaP5drwavmPs) #5
  unreachable

10:                                               ; preds = %8
  %.not208 = icmp eq ptr %2, null
  br i1 %.not208, label %32, label %.preheader239

.preheader239:                                    ; preds = %10
  %11 = getelementptr inbounds i8, ptr %0, i64 288
  %12 = getelementptr inbounds i8, ptr %0, i64 120
  %13 = load i64, ptr %11, align 8, !tbaa !5
  %14 = load i64, ptr %12, align 8, !tbaa !22
  %15 = icmp ult i64 %13, %14
  br i1 %15, label %.lr.ph272, label %.critedge

.lr.ph272:                                        ; preds = %.preheader239
  %16 = getelementptr inbounds i8, ptr %0, i64 348
  %17 = getelementptr inbounds i8, ptr %0, i64 432
  %18 = getelementptr inbounds i8, ptr %0, i64 112
  %19 = getelementptr inbounds i8, ptr %0, i64 24
  %20 = getelementptr inbounds i8, ptr %0, i64 80
  %21 = getelementptr inbounds i8, ptr %0, i64 352
  %22 = getelementptr inbounds i8, ptr %5, i64 2
  %23 = getelementptr inbounds i8, ptr %0, i64 360
  %24 = getelementptr inbounds i8, ptr %5, i64 4
  %25 = getelementptr inbounds i8, ptr %0, i64 356
  %26 = getelementptr inbounds i8, ptr %5, i64 6
  %27 = getelementptr inbounds i8, ptr %0, i64 364
  %28 = getelementptr inbounds i8, ptr %0, i64 424
  %29 = getelementptr inbounds i8, ptr %0, i64 428
  %30 = getelementptr inbounds i8, ptr %4, i64 2
  %31 = getelementptr inbounds i8, ptr %0, i64 368
  br label %33

32:                                               ; preds = %10
  tail call void @__assert_fail(ptr noundef nonnull @.str.31, ptr noundef nonnull @.str.16, i32 noundef 3351, ptr noundef nonnull @__PRETTY_FUNCTION__._Z30drwav_read_pcm_frames_s16__imaP5drwavmPs) #5
  unreachable

33:                                               ; preds = %.lr.ph272, %.backedge
  %.0183271 = phi i64 [ %1, %.lr.ph272 ], [ %.1184264286, %.backedge ]
  %.0192270 = phi i64 [ 0, %.lr.ph272 ], [ %.1193263283, %.backedge ]
  %.0194269 = phi ptr [ %2, %.lr.ph272 ], [ %.1195262, %.backedge ]
  %34 = load i32, ptr %17, align 4, !tbaa !23
  %35 = icmp eq i32 %34, 0
  br i1 %35, label %36, label %71

36:                                               ; preds = %33
  %37 = load i32, ptr %16, align 4, !tbaa !24
  %38 = icmp eq i32 %37, 0
  br i1 %38, label %39, label %71

39:                                               ; preds = %36
  %40 = load i16, ptr %18, align 8, !tbaa !25
  %41 = icmp eq i16 %40, 1
  br i1 %41, label %42, label %54

42:                                               ; preds = %39
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4) #6
  %43 = load ptr, ptr %0, align 8, !tbaa !26
  %44 = load ptr, ptr %19, align 8, !tbaa !27
  %45 = call noundef i64 %43(ptr noundef %44, ptr noundef nonnull %4, i64 noundef 4)
  %.not210 = icmp eq i64 %45, 4
  br i1 %.not210, label %.thread, label %53

.thread:                                          ; preds = %42
  %46 = load i16, ptr %20, align 4, !tbaa !28
  %47 = zext i16 %46 to i32
  %48 = add nsw i32 %47, -4
  store i32 %48, ptr %16, align 4, !tbaa !24
  %49 = call noundef signext i16 @_ZL19drwav__bytes_to_s16PKh(ptr noundef nonnull %4)
  %50 = sext i16 %49 to i32
  store i32 %50, ptr %21, align 4, !tbaa !29
  %51 = load i8, ptr %30, align 1, !tbaa !30
  %52 = zext i8 %51 to i32
  store i32 %52, ptr %23, align 4, !tbaa !29
  store i32 %50, ptr %29, align 4, !tbaa !29
  store i32 1, ptr %17, align 4, !tbaa !23
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4) #6
  br label %71

53:                                               ; preds = %42
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4) #6
  br label %.critedge

54:                                               ; preds = %39
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #6
  %55 = load ptr, ptr %0, align 8, !tbaa !26
  %56 = load ptr, ptr %19, align 8, !tbaa !27
  %57 = call noundef i64 %55(ptr noundef %56, ptr noundef nonnull %5, i64 noundef 8)
  %.not209 = icmp eq i64 %57, 8
  br i1 %.not209, label %.thread227, label %70

.thread227:                                       ; preds = %54
  %58 = load i16, ptr %20, align 4, !tbaa !28
  %59 = zext i16 %58 to i32
  %60 = add nsw i32 %59, -8
  store i32 %60, ptr %16, align 4, !tbaa !24
  %61 = call noundef signext i16 @_ZL19drwav__bytes_to_s16PKh(ptr noundef nonnull %5)
  %62 = sext i16 %61 to i32
  store i32 %62, ptr %21, align 4, !tbaa !29
  %63 = load i8, ptr %22, align 1, !tbaa !30
  %64 = zext i8 %63 to i32
  store i32 %64, ptr %23, align 4, !tbaa !29
  %65 = call noundef signext i16 @_ZL19drwav__bytes_to_s16PKh(ptr noundef nonnull %24)
  %66 = sext i16 %65 to i32
  store i32 %66, ptr %25, align 4, !tbaa !29
  %67 = load i8, ptr %26, align 1, !tbaa !30
  %68 = zext i8 %67 to i32
  store i32 %68, ptr %27, align 4, !tbaa !29
  %69 = load i32, ptr %21, align 4, !tbaa !29
  store i32 %69, ptr %28, align 4, !tbaa !29
  store i32 %66, ptr %29, align 4, !tbaa !29
  store i32 1, ptr %17, align 4, !tbaa !23
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #6
  br label %71

70:                                               ; preds = %54
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #6
  br label %.critedge

71:                                               ; preds = %.thread227, %.thread, %36, %33
  %.promoted = phi i32 [ 1, %.thread227 ], [ 1, %.thread ], [ 0, %36 ], [ %34, %33 ]
  %72 = zext i32 %.promoted to i64
  %73 = sub i64 %.0183271, %72
  %74 = add i64 %.0192270, %72
  br label %75

75:                                               ; preds = %71, %._crit_edge
  %.1184264 = phi i64 [ %.0183271, %71 ], [ %95, %._crit_edge ]
  %.1193263 = phi i64 [ %.0192270, %71 ], [ %96, %._crit_edge ]
  %.1195262 = phi ptr [ %.0194269, %71 ], [ %94, %._crit_edge ]
  %76 = phi i32 [ %.promoted, %71 ], [ %98, %._crit_edge ]
  %.not212 = icmp eq i32 %76, 0
  br i1 %.not212, label %99, label %77

77:                                               ; preds = %75
  %78 = load i64, ptr %11, align 8, !tbaa !5
  %79 = load i64, ptr %12, align 8, !tbaa !22
  %80 = icmp ult i64 %78, %79
  br i1 %80, label %.preheader, label %.backedge

.preheader:                                       ; preds = %77
  %81 = load i16, ptr %18, align 8, !tbaa !25
  %.not274 = icmp eq i16 %81, 0
  br i1 %.not274, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %.preheader ]
  %.in = phi i16 [ %90, %.lr.ph ], [ %81, %.preheader ]
  %82 = zext i16 %.in to i32
  %83 = mul i32 %76, %82
  %84 = zext i32 %83 to i64
  %reass.sub224 = add nuw nsw i64 %indvars.iv, 16
  %85 = sub nsw i64 %reass.sub224, %84
  %86 = getelementptr inbounds [16 x i32], ptr %31, i64 0, i64 %85
  %87 = load i32, ptr %86, align 4, !tbaa !29
  %88 = trunc i32 %87 to i16
  %89 = getelementptr inbounds i16, ptr %.1195262, i64 %indvars.iv
  store i16 %88, ptr %89, align 2, !tbaa !31
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %90 = load i16, ptr %18, align 8, !tbaa !25
  %91 = zext i16 %90 to i64
  %92 = icmp ult i64 %indvars.iv.next, %91
  br i1 %92, label %.lr.ph, label %._crit_edge, !llvm.loop !32

._crit_edge:                                      ; preds = %.lr.ph, %.preheader
  %.lcssa = phi i16 [ 0, %.preheader ], [ %90, %.lr.ph ]
  %93 = zext i16 %.lcssa to i64
  %94 = getelementptr inbounds i16, ptr %.1195262, i64 %93
  %95 = add i64 %.1184264, -1
  %96 = add i64 %.1193263, 1
  %97 = add i64 %78, 1
  store i64 %97, ptr %11, align 8, !tbaa !5
  %98 = add i32 %76, -1
  store i32 %98, ptr %17, align 4, !tbaa !23
  %cond = icmp eq i64 %95, 0
  br i1 %cond, label %.critedge.loopexit, label %75, !llvm.loop !34

99:                                               ; preds = %75
  %100 = load i32, ptr %16, align 4, !tbaa !24
  %101 = icmp eq i32 %100, 0
  br i1 %101, label %.backedge, label %.split

.split:                                           ; preds = %99
  store i32 8, ptr %17, align 4, !tbaa !23
  %102 = load i16, ptr %18, align 8, !tbaa !25
  %.not223266.not = icmp eq i16 %102, 0
  br i1 %.not223266.not, label %.backedge, label %.lr.ph268

.lr.ph268:                                        ; preds = %.split, %184
  %indvars.iv296 = phi i64 [ %indvars.iv.next297, %184 ], [ 0, %.split ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %6) #6
  %103 = load ptr, ptr %0, align 8, !tbaa !26
  %104 = load ptr, ptr %19, align 8, !tbaa !27
  %105 = call noundef i64 %103(ptr noundef %104, ptr noundef nonnull %6, i64 noundef 4)
  %.not213 = icmp eq i64 %105, 4
  br i1 %.not213, label %106, label %.thread231

.thread231:                                       ; preds = %.lr.ph268
  store i32 0, ptr %17, align 4, !tbaa !23
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %6) #6
  br label %.critedge

106:                                              ; preds = %.lr.ph268
  %107 = load i32, ptr %16, align 4, !tbaa !24
  %108 = add i32 %107, -4
  store i32 %108, ptr %16, align 4, !tbaa !24
  %109 = getelementptr inbounds [2 x i32], ptr %23, i64 0, i64 %indvars.iv296
  %110 = getelementptr inbounds [2 x i32], ptr %21, i64 0, i64 %indvars.iv296
  %111 = load i16, ptr %18, align 8, !tbaa !25
  %112 = zext i16 %111 to i32
  %reass.sub = add nuw nsw i64 %indvars.iv296, 16
  %113 = zext i16 %111 to i64
  br label %114

114:                                              ; preds = %106, %114
  %indvars.iv293 = phi i64 [ 0, %106 ], [ %indvars.iv.next294, %114 ]
  %115 = getelementptr inbounds [4 x i8], ptr %6, i64 0, i64 %indvars.iv293
  %116 = load i8, ptr %115, align 1, !tbaa !30
  %117 = and i8 %116, 15
  %118 = lshr i8 %116, 4
  %119 = load i32, ptr %109, align 4, !tbaa !29
  %120 = sext i32 %119 to i64
  %121 = getelementptr inbounds [89 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE9stepTable, i64 0, i64 %120
  %122 = load i32, ptr %121, align 4, !tbaa !29
  %123 = load i32, ptr %110, align 4, !tbaa !29
  %124 = ashr i32 %122, 3
  %125 = zext nneg i8 %117 to i32
  %126 = and i32 %125, 1
  %.not214 = icmp eq i32 %126, 0
  %127 = ashr i32 %122, 2
  %128 = select i1 %.not214, i32 0, i32 %127
  %.0 = add nsw i32 %128, %124
  %129 = and i32 %125, 2
  %.not215 = icmp eq i32 %129, 0
  %130 = ashr i32 %122, 1
  %131 = select i1 %.not215, i32 0, i32 %130
  %.1 = add nsw i32 %.0, %131
  %132 = and i32 %125, 4
  %.not216 = icmp eq i32 %132, 0
  %133 = select i1 %.not216, i32 0, i32 %122
  %.2 = add nsw i32 %.1, %133
  %.not217 = icmp ult i8 %117, 8
  %134 = sub nsw i32 0, %.2
  %.3 = select i1 %.not217, i32 %.2, i32 %134
  %135 = add nsw i32 %.3, %123
  %136 = call i32 @llvm.smin.i32(i32 %135, i32 32767)
  %137 = call i32 @llvm.smax.i32(i32 %136, i32 -32768)
  store i32 %137, ptr %110, align 4, !tbaa !29
  %138 = zext nneg i8 %117 to i64
  %139 = getelementptr inbounds [16 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable, i64 0, i64 %138
  %140 = load i32, ptr %139, align 4, !tbaa !29
  %141 = add nsw i32 %140, %119
  %142 = call i32 @llvm.smin.i32(i32 %141, i32 88)
  %spec.select = call i32 @llvm.smax.i32(i32 %142, i32 0)
  store i32 %spec.select, ptr %109, align 4, !tbaa !29
  %143 = load i32, ptr %17, align 4, !tbaa !23
  %144 = mul i32 %143, %112
  %145 = zext i32 %144 to i64
  %146 = shl nuw nsw i64 %indvars.iv293, 1
  %147 = mul nuw nsw i64 %146, %113
  %148 = sub nsw i64 %reass.sub, %145
  %149 = add nsw i64 %148, %147
  %150 = getelementptr inbounds [16 x i32], ptr %31, i64 0, i64 %149
  store i32 %137, ptr %150, align 4, !tbaa !29
  %151 = load i32, ptr %109, align 4, !tbaa !29
  %152 = sext i32 %151 to i64
  %153 = getelementptr inbounds [89 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE9stepTable, i64 0, i64 %152
  %154 = load i32, ptr %153, align 4, !tbaa !29
  %155 = load i32, ptr %110, align 4, !tbaa !29
  %156 = ashr i32 %154, 3
  %157 = zext nneg i8 %118 to i32
  %158 = and i32 %157, 1
  %.not218 = icmp eq i32 %158, 0
  %159 = ashr i32 %154, 2
  %160 = select i1 %.not218, i32 0, i32 %159
  %161 = and i32 %157, 2
  %.not219 = icmp eq i32 %161, 0
  %162 = ashr i32 %154, 1
  %163 = select i1 %.not219, i32 0, i32 %162
  %164 = and i32 %157, 4
  %.not220 = icmp eq i32 %164, 0
  %165 = select i1 %.not220, i32 0, i32 %154
  %.4 = add i32 %165, %156
  %.5 = add i32 %.4, %160
  %.6 = add i32 %.5, %163
  %166 = sub nsw i32 0, %.6
  %.not221235 = icmp slt i8 %116, 0
  %.7 = select i1 %.not221235, i32 %166, i32 %.6
  %167 = add nsw i32 %.7, %155
  %168 = call i32 @llvm.smin.i32(i32 %167, i32 32767)
  %169 = call i32 @llvm.smax.i32(i32 %168, i32 -32768)
  store i32 %169, ptr %110, align 4, !tbaa !29
  %170 = zext nneg i8 %118 to i64
  %171 = getelementptr inbounds [16 x i32], ptr @_ZZ30drwav_read_pcm_frames_s16__imaP5drwavmPsE10indexTable, i64 0, i64 %170
  %172 = load i32, ptr %171, align 4, !tbaa !29
  %173 = add nsw i32 %172, %151
  %174 = call i32 @llvm.smin.i32(i32 %173, i32 88)
  %175 = call i32 @llvm.smax.i32(i32 %174, i32 0)
  store i32 %175, ptr %109, align 4, !tbaa !29
  %176 = load i32, ptr %17, align 4, !tbaa !23
  %177 = mul i32 %176, %112
  %178 = zext i32 %177 to i64
  %179 = or disjoint i64 %146, 1
  %180 = mul nuw nsw i64 %179, %113
  %181 = add nuw nsw i64 %reass.sub, %180
  %182 = sub nsw i64 %181, %178
  %183 = getelementptr inbounds [16 x i32], ptr %31, i64 0, i64 %182
  store i32 %169, ptr %183, align 4, !tbaa !29
  %indvars.iv.next294 = add nuw nsw i64 %indvars.iv293, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next294, 4
  br i1 %exitcond.not, label %184, label %114, !llvm.loop !35

184:                                              ; preds = %114
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %6) #6
  %indvars.iv.next297 = add nuw nsw i64 %indvars.iv296, 1
  %.not223 = icmp ult i64 %indvars.iv.next297, %113
  br i1 %.not223, label %.lr.ph268, label %.backedge, !llvm.loop !36

.backedge:                                        ; preds = %77, %184, %.split, %99
  %.1184264286 = phi i64 [ %73, %.split ], [ %73, %99 ], [ %73, %184 ], [ %.1184264, %77 ]
  %.1193263283 = phi i64 [ %74, %.split ], [ %74, %99 ], [ %74, %184 ], [ %.1193263, %77 ]
  %185 = load i64, ptr %11, align 8, !tbaa !5
  %186 = load i64, ptr %12, align 8, !tbaa !22
  %187 = icmp ult i64 %185, %186
  br i1 %187, label %33, label %.critedge, !llvm.loop !37

.critedge.loopexit:                               ; preds = %._crit_edge
  %188 = add i64 %.0183271, %.0192270
  br label %.critedge

.critedge:                                        ; preds = %.backedge, %.critedge.loopexit, %.preheader239, %.thread231, %70, %53
  %.8 = phi i64 [ %.0192270, %53 ], [ %.0192270, %70 ], [ %74, %.thread231 ], [ 0, %.preheader239 ], [ %188, %.critedge.loopexit ], [ %.1193263283, %.backedge ]
  ret i64 %.8
}

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare hidden noundef signext i16 @_ZL19drwav__bytes_to_s16PKh(ptr noundef) local_unnamed_addr #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smin.i32(i32, i32) #4

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smax.i32(i32, i32) #4

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { mustprogress 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 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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, !15, i64 288}
!6 = !{!"_ZTS5drwav", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !10, i64 32, !11, i64 64, !12, i64 68, !14, i64 108, !13, i64 112, !13, i64 114, !13, i64 116, !15, i64 120, !15, i64 128, !15, i64 136, !15, i64 144, !15, i64 152, !14, i64 160, !16, i64 164, !17, i64 224, !18, i64 248, !19, i64 288, !20, i64 296, !21, i64 348}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"_ZTS26drwav_allocation_callbacks", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24}
!11 = !{!"_ZTS15drwav_container", !8, i64 0}
!12 = !{!"_ZTS9drwav_fmt", !13, i64 0, !13, i64 2, !14, i64 4, !14, i64 8, !13, i64 12, !13, i64 14, !13, i64 16, !13, i64 18, !14, i64 20, !8, i64 24}
!13 = !{!"short", !8, i64 0}
!14 = !{!"int", !8, i64 0}
!15 = !{!"long", !8, i64 0}
!16 = !{!"_ZTS10drwav_smpl", !14, i64 0, !14, i64 4, !14, i64 8, !14, i64 12, !14, i64 16, !14, i64 20, !14, i64 24, !14, i64 28, !14, i64 32, !8, i64 36}
!17 = !{!"_ZTS20drwav__memory_stream", !7, i64 0, !15, i64 8, !15, i64 16}
!18 = !{!"_ZTS26drwav__memory_stream_write", !7, i64 0, !7, i64 8, !15, i64 16, !15, i64 24, !15, i64 32}
!19 = !{!"_ZTSN5drwavUt_E", !15, i64 0}
!20 = !{!"_ZTSN5drwavUt0_E", !14, i64 0, !8, i64 4, !8, i64 8, !8, i64 16, !14, i64 32, !8, i64 36}
!21 = !{!"_ZTSN5drwavUt1_E", !14, i64 0, !8, i64 4, !8, i64 12, !8, i64 20, !14, i64 84}
!22 = !{!6, !15, i64 120}
!23 = !{!6, !14, i64 432}
!24 = !{!6, !14, i64 348}
!25 = !{!6, !13, i64 112}
!26 = !{!6, !7, i64 0}
!27 = !{!6, !7, i64 24}
!28 = !{!6, !13, i64 80}
!29 = !{!14, !14, i64 0}
!30 = !{!8, !8, i64 0}
!31 = !{!13, !13, i64 0}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = distinct !{!34, !33}
!35 = distinct !{!35, !33}
!36 = distinct !{!36, !33}
!37 = distinct !{!37, !33}


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