; LLVM IR from thalium/icebox :: third_party/virtualbox/src/VBox/Devices/EFI/Firmware/MdeModulePkg/Bus/Pci (NvmExpressPassThru)

; 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.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET = type { i64, ptr, i32, ptr, i32, i8, ptr, ptr, i8 }
%struct._NVME_CONTROLLER_PRIVATE_DATA = type { i32, ptr, ptr, ptr, ptr, i64, ptr, %struct.NVM_EXPRESS_PASS_THRU_MODE, %struct._NVM_EXPRESS_PASS_THRU_PROTOCOL, ptr, ptr, ptr, [2 x ptr], [2 x ptr], [2 x ptr], [2 x ptr], [2 x %struct.NVME_SQTDBL], [2 x %struct.NVME_CQHDBL], [2 x i8], [2 x i16], %struct.NVME_CAP, ptr }
%struct.NVM_EXPRESS_PASS_THRU_MODE = type { i32, i32, i32, i32, i64, i32 }
%struct._NVM_EXPRESS_PASS_THRU_PROTOCOL = type { ptr, ptr, ptr, ptr, ptr }
%struct.NVME_SQTDBL = type { i16, i16 }
%struct.NVME_CQHDBL = type { i16, i16 }
%struct.NVME_CAP = type { i16, i8, i8, i16, i8, i8 }
%struct.NVME_SQ = type { i8, i8, i16, i32, i64, i64, [2 x i64], %union.NVME_PAYLOAD }
%union.NVME_PAYLOAD = type { %union.NVME_CMD }
%union.NVME_CMD = type { %struct.NVME_READ }
%struct.NVME_READ = type { i64, i16, i16, i32, i32, i16, i16 }
%struct.NVME_CQ = type { i32, i32, i16, i16, i16, i16 }
%struct.NVM_EXPRESS_COMMAND = type { %struct.NVME_CDW0, i8, i32, i32, i32, i32, i32, i32, i32 }
%struct.NVME_CDW0 = type { i8, i8, i16 }
%struct._EFI_PCI_IO_PROTOCOL = type { ptr, ptr, %struct.EFI_PCI_IO_PROTOCOL_ACCESS, %struct.EFI_PCI_IO_PROTOCOL_ACCESS, %struct.EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i64, ptr }
%struct.EFI_PCI_IO_PROTOCOL_ACCESS = type { ptr, ptr }
%struct.EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS = type { ptr, ptr }
%struct.NVME_RAW = type { i32, i32, i32, i32, i32, i32 }
%struct.EFI_BOOT_SERVICES = type { %struct.EFI_TABLE_HEADER, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.EFI_TABLE_HEADER = type { i64, i32, i32, i32, i32 }

@.str.52 = external hidden unnamed_addr constant [157 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [51 x i8], align 1
@gBS = external global ptr, align 8

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

declare zeroext i8 @DebugPrintEnabled() #1

declare zeroext i8 @DebugPrintLevelEnabled(i64 noundef) #1

declare void @DebugPrint(i64 noundef, ptr noundef, ...) #1

; Function Attrs: nounwind uwtable
declare dso_local ptr @NvmeCreatePrpList(ptr noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef) #0

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

declare ptr @ZeroMem(ptr noundef, i64 noundef) #1

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

; Function Attrs: nounwind uwtable
define dso_local i64 @NvmExpressPassThru(ptr noundef %0, i32 noundef %1, i64 noundef %2, ptr noundef %3, ptr noundef %4) #0 {
  %6 = alloca i64, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i64, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i64, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i8, align 1
  %18 = alloca i32, align 4
  %19 = alloca i16, align 2
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca i64, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca i64, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca i64, align 8
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i8, align 1
  store ptr %0, ptr %7, align 8, !tbaa !5
  store i32 %1, ptr %8, align 4, !tbaa !9
  store i64 %2, ptr %9, align 8, !tbaa !11
  store ptr %3, ptr %10, align 8, !tbaa !5
  store ptr %4, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #3
  call void @llvm.lifetime.start.p0(i64 1, ptr %17) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #3
  call void @llvm.lifetime.start.p0(i64 2, ptr %19) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #3
  %33 = load ptr, ptr %7, align 8, !tbaa !5
  %34 = icmp eq ptr %33, null
  br i1 %34, label %38, label %35

35:                                               ; preds = %5
  %36 = load ptr, ptr %10, align 8, !tbaa !5
  %37 = icmp eq ptr %36, null
  br i1 %37, label %38, label %39

38:                                               ; preds = %35, %5
  store i64 -9223372036854775806, ptr %6, align 8
  store i32 1, ptr %31, align 4
  br label %693

39:                                               ; preds = %35
  %40 = load ptr, ptr %10, align 8, !tbaa !5
  %41 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %40, i32 0, i32 6
  %42 = load ptr, ptr %41, align 8, !tbaa !13
  %43 = icmp eq ptr %42, null
  br i1 %43, label %49, label %44

44:                                               ; preds = %39
  %45 = load ptr, ptr %10, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %45, i32 0, i32 7
  %47 = load ptr, ptr %46, align 8, !tbaa !15
  %48 = icmp eq ptr %47, null
  br i1 %48, label %49, label %50

49:                                               ; preds = %44, %39
  store i64 -9223372036854775806, ptr %6, align 8
  store i32 1, ptr %31, align 4
  br label %693

50:                                               ; preds = %44
  %51 = load ptr, ptr %10, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %51, i32 0, i32 5
  %53 = load i8, ptr %52, align 4, !tbaa !16
  %54 = zext i8 %53 to i32
  %55 = icmp ne i32 %54, 0
  br i1 %55, label %56, label %63

56:                                               ; preds = %50
  %57 = load ptr, ptr %10, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %57, i32 0, i32 5
  %59 = load i8, ptr %58, align 4, !tbaa !16
  %60 = zext i8 %59 to i32
  %61 = icmp ne i32 %60, 1
  br i1 %61, label %62, label %63

62:                                               ; preds = %56
  store i64 -9223372036854775806, ptr %6, align 8
  store i32 1, ptr %31, align 4
  br label %693

63:                                               ; preds = %56, %50
  %64 = call zeroext i8 @DebugAssertEnabled()
  %65 = zext i8 %64 to i32
  %66 = icmp ne i32 %65, 0
  br i1 %66, label %67, label %77

67:                                               ; preds = %63
  %68 = load ptr, ptr %7, align 8, !tbaa !5
  %69 = ptrtoint ptr %68 to i64
  %70 = sub i64 %69, ptrtoint (ptr getelementptr inbounds (%struct._NVME_CONTROLLER_PRIVATE_DATA, ptr null, i32 0, i32 8) to i64)
  %71 = inttoptr i64 %70 to ptr
  %72 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %71, i32 0, i32 0
  %73 = load i32, ptr %72, align 8, !tbaa !17
  %74 = icmp ne i32 %73, 1162696270
  br i1 %74, label %75, label %77

75:                                               ; preds = %67
  call void @DebugAssert(ptr noundef @.str.52, i64 noundef 407, ptr noundef @.str.53)
  %76 = load ptr, ptr %7, align 8, !tbaa !5
  br label %82

77:                                               ; preds = %67, %63
  %78 = load ptr, ptr %7, align 8, !tbaa !5
  %79 = ptrtoint ptr %78 to i64
  %80 = sub i64 %79, ptrtoint (ptr getelementptr inbounds (%struct._NVME_CONTROLLER_PRIVATE_DATA, ptr null, i32 0, i32 8) to i64)
  %81 = inttoptr i64 %80 to ptr
  br label %82

82:                                               ; preds = %77, %75
  %83 = phi ptr [ %76, %75 ], [ %81, %77 ]
  store ptr %83, ptr %12, align 8, !tbaa !5
  %84 = load ptr, ptr %12, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %84, i32 0, i32 4
  %86 = load ptr, ptr %85, align 8, !tbaa !23
  store ptr %86, ptr %14, align 8, !tbaa !5
  store ptr null, ptr %23, align 8, !tbaa !5
  store ptr null, ptr %24, align 8, !tbaa !5
  store ptr null, ptr %25, align 8, !tbaa !5
  store ptr null, ptr %28, align 8, !tbaa !5
  store i64 0, ptr %29, align 8, !tbaa !11
  store ptr null, ptr %27, align 8, !tbaa !5
  store ptr null, ptr %20, align 8, !tbaa !5
  store i64 0, ptr %13, align 8, !tbaa !11
  %87 = load ptr, ptr %10, align 8, !tbaa !5
  %88 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %87, i32 0, i32 5
  %89 = load i8, ptr %88, align 4, !tbaa !16
  store i8 %89, ptr %17, align 1, !tbaa !24
  %90 = load ptr, ptr %12, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %90, i32 0, i32 12
  %92 = load i8, ptr %17, align 1, !tbaa !24
  %93 = zext i8 %92 to i64
  %94 = getelementptr inbounds [2 x ptr], ptr %91, i64 0, i64 %93
  %95 = load ptr, ptr %94, align 8, !tbaa !5
  %96 = load ptr, ptr %12, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %96, i32 0, i32 16
  %98 = load i8, ptr %17, align 1, !tbaa !24
  %99 = zext i8 %98 to i64
  %100 = getelementptr inbounds [2 x %struct.NVME_SQTDBL], ptr %97, i64 0, i64 %99
  %101 = getelementptr inbounds %struct.NVME_SQTDBL, ptr %100, i32 0, i32 0
  %102 = load i16, ptr %101, align 4, !tbaa !25
  %103 = zext i16 %102 to i32
  %104 = sext i32 %103 to i64
  %105 = getelementptr inbounds %struct.NVME_SQ, ptr %95, i64 %104
  store ptr %105, ptr %15, align 8, !tbaa !5
  %106 = load ptr, ptr %12, align 8, !tbaa !5
  %107 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %106, i32 0, i32 13
  %108 = load i8, ptr %17, align 1, !tbaa !24
  %109 = zext i8 %108 to i64
  %110 = getelementptr inbounds [2 x ptr], ptr %107, i64 0, i64 %109
  %111 = load ptr, ptr %110, align 8, !tbaa !5
  %112 = load ptr, ptr %12, align 8, !tbaa !5
  %113 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %112, i32 0, i32 17
  %114 = load i8, ptr %17, align 1, !tbaa !24
  %115 = zext i8 %114 to i64
  %116 = getelementptr inbounds [2 x %struct.NVME_CQHDBL], ptr %113, i64 0, i64 %115
  %117 = getelementptr inbounds %struct.NVME_CQHDBL, ptr %116, i32 0, i32 0
  %118 = load i16, ptr %117, align 4, !tbaa !25
  %119 = zext i16 %118 to i32
  %120 = sext i32 %119 to i64
  %121 = getelementptr inbounds %struct.NVME_CQ, ptr %111, i64 %120
  store ptr %121, ptr %16, align 8, !tbaa !5
  %122 = load ptr, ptr %10, align 8, !tbaa !5
  %123 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %122, i32 0, i32 6
  %124 = load ptr, ptr %123, align 8, !tbaa !13
  %125 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %124, i32 0, i32 2
  %126 = load i32, ptr %125, align 4, !tbaa !27
  %127 = load i32, ptr %8, align 4, !tbaa !9
  %128 = icmp ne i32 %126, %127
  br i1 %128, label %129, label %130

129:                                              ; preds = %82
  store i64 -9223372036854775806, ptr %6, align 8
  store i32 1, ptr %31, align 4
  br label %693

130:                                              ; preds = %82
  %131 = load ptr, ptr %15, align 8, !tbaa !5
  %132 = call ptr @ZeroMem(ptr noundef %131, i64 noundef 64)
  %133 = load ptr, ptr %10, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %133, i32 0, i32 6
  %135 = load ptr, ptr %134, align 8, !tbaa !13
  %136 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %135, i32 0, i32 0
  %137 = getelementptr inbounds %struct.NVME_CDW0, ptr %136, i32 0, i32 0
  %138 = load i8, ptr %137, align 4, !tbaa !30
  %139 = load ptr, ptr %15, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.NVME_SQ, ptr %139, i32 0, i32 0
  store i8 %138, ptr %140, align 1, !tbaa !31
  %141 = load ptr, ptr %10, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %141, i32 0, i32 6
  %143 = load ptr, ptr %142, align 8, !tbaa !13
  %144 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %143, i32 0, i32 0
  %145 = getelementptr inbounds %struct.NVME_CDW0, ptr %144, i32 0, i32 1
  %146 = load i8, ptr %145, align 1, !tbaa !33
  %147 = load ptr, ptr %15, align 8, !tbaa !5
  %148 = getelementptr inbounds %struct.NVME_SQ, ptr %147, i32 0, i32 1
  %149 = load i8, ptr %148, align 1
  %150 = and i8 %146, 3
  %151 = and i8 %149, -4
  %152 = or i8 %151, %150
  store i8 %152, ptr %148, align 1
  %153 = load ptr, ptr %10, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %153, i32 0, i32 6
  %155 = load ptr, ptr %154, align 8, !tbaa !13
  %156 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %155, i32 0, i32 0
  %157 = getelementptr inbounds %struct.NVME_CDW0, ptr %156, i32 0, i32 2
  %158 = load i16, ptr %157, align 2, !tbaa !34
  %159 = load ptr, ptr %15, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.NVME_SQ, ptr %159, i32 0, i32 2
  store i16 %158, ptr %160, align 1, !tbaa !35
  %161 = load ptr, ptr %10, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %161, i32 0, i32 6
  %163 = load ptr, ptr %162, align 8, !tbaa !13
  %164 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %163, i32 0, i32 2
  %165 = load i32, ptr %164, align 4, !tbaa !27
  %166 = load ptr, ptr %15, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.NVME_SQ, ptr %166, i32 0, i32 3
  store i32 %165, ptr %167, align 1, !tbaa !36
  br label %168

168:                                              ; preds = %130
  %169 = call zeroext i8 @DebugAssertEnabled()
  %170 = icmp ne i8 %169, 0
  br i1 %170, label %171, label %180

171:                                              ; preds = %168
  %172 = load ptr, ptr %15, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct.NVME_SQ, ptr %172, i32 0, i32 1
  %174 = load i8, ptr %173, align 1
  %175 = lshr i8 %174, 7
  %176 = zext i8 %175 to i32
  %177 = icmp eq i32 %176, 0
  br i1 %177, label %179, label %178

178:                                              ; preds = %171
  call void @DebugAssert(ptr noundef @.str.52, i64 noundef 435, ptr noundef @.str.54)
  br label %179

179:                                              ; preds = %178, %171
  br label %180

180:                                              ; preds = %179, %168
  br label %181

181:                                              ; preds = %180
  br label %182

182:                                              ; preds = %181
  %183 = load ptr, ptr %15, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.NVME_SQ, ptr %183, i32 0, i32 1
  %185 = load i8, ptr %184, align 1
  %186 = lshr i8 %185, 7
  %187 = zext i8 %186 to i32
  %188 = icmp ne i32 %187, 0
  br i1 %188, label %189, label %204

189:                                              ; preds = %182
  br label %190

190:                                              ; preds = %189
  %191 = call zeroext i8 @DebugPrintEnabled()
  %192 = icmp ne i8 %191, 0
  br i1 %192, label %193, label %201

193:                                              ; preds = %190
  br label %194

194:                                              ; preds = %193
  %195 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 2147483648)
  %196 = icmp ne i8 %195, 0
  br i1 %196, label %197, label %198

197:                                              ; preds = %194
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 2147483648, ptr noundef @.str.55)
  br label %198

198:                                              ; preds = %197, %194
  br label %199

199:                                              ; preds = %198
  br label %200

200:                                              ; preds = %199
  br label %201

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

202:                                              ; preds = %201
  br label %203

203:                                              ; preds = %202
  store i64 -9223372036854775805, ptr %6, align 8
  store i32 1, ptr %31, align 4
  br label %693

204:                                              ; preds = %182
  %205 = load ptr, ptr %10, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %205, i32 0, i32 1
  %207 = load ptr, ptr %206, align 8, !tbaa !37
  %208 = ptrtoint ptr %207 to i64
  %209 = load ptr, ptr %15, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.NVME_SQ, ptr %209, i32 0, i32 6
  %211 = getelementptr inbounds [2 x i64], ptr %210, i64 0, i64 0
  store i64 %208, ptr %211, align 1, !tbaa !11
  %212 = load ptr, ptr %15, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct.NVME_SQ, ptr %212, i32 0, i32 0
  %214 = load i8, ptr %213, align 1, !tbaa !31
  %215 = zext i8 %214 to i32
  %216 = and i32 %215, 3
  %217 = icmp ne i32 %216, 0
  br i1 %217, label %218, label %314

218:                                              ; preds = %204
  %219 = load ptr, ptr %15, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.NVME_SQ, ptr %219, i32 0, i32 0
  %221 = load i8, ptr %220, align 1, !tbaa !31
  %222 = zext i8 %221 to i32
  %223 = icmp ne i32 %222, 5
  br i1 %223, label %224, label %314

224:                                              ; preds = %218
  %225 = load ptr, ptr %15, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.NVME_SQ, ptr %225, i32 0, i32 0
  %227 = load i8, ptr %226, align 1, !tbaa !31
  %228 = zext i8 %227 to i32
  %229 = icmp ne i32 %228, 1
  br i1 %229, label %230, label %314

230:                                              ; preds = %224
  %231 = load ptr, ptr %15, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.NVME_SQ, ptr %231, i32 0, i32 0
  %233 = load i8, ptr %232, align 1, !tbaa !31
  %234 = zext i8 %233 to i32
  %235 = and i32 %234, 1
  %236 = icmp ne i32 %235, 0
  br i1 %236, label %237, label %238

237:                                              ; preds = %230
  store i32 0, ptr %21, align 4, !tbaa !9
  br label %239

238:                                              ; preds = %230
  store i32 1, ptr %21, align 4, !tbaa !9
  br label %239

239:                                              ; preds = %238, %237
  %240 = load ptr, ptr %10, align 8, !tbaa !5
  %241 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %240, i32 0, i32 2
  %242 = load i32, ptr %241, align 8, !tbaa !38
  %243 = zext i32 %242 to i64
  store i64 %243, ptr %26, align 8, !tbaa !11
  %244 = load ptr, ptr %14, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %244, i32 0, i32 6
  %246 = load ptr, ptr %245, align 8, !tbaa !39
  %247 = load ptr, ptr %14, align 8, !tbaa !5
  %248 = load i32, ptr %21, align 4, !tbaa !9
  %249 = load ptr, ptr %10, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %249, i32 0, i32 1
  %251 = load ptr, ptr %250, align 8, !tbaa !37
  %252 = call i64 %246(ptr noundef %247, i32 noundef %248, ptr noundef %251, ptr noundef %26, ptr noundef %22, ptr noundef %23)
  store i64 %252, ptr %13, align 8, !tbaa !11
  %253 = load i64, ptr %13, align 8, !tbaa !11
  %254 = icmp slt i64 %253, 0
  br i1 %254, label %262, label %255

255:                                              ; preds = %239
  %256 = load ptr, ptr %10, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %256, i32 0, i32 2
  %258 = load i32, ptr %257, align 8, !tbaa !38
  %259 = zext i32 %258 to i64
  %260 = load i64, ptr %26, align 8, !tbaa !11
  %261 = icmp ne i64 %259, %260
  br i1 %261, label %262, label %263

262:                                              ; preds = %255, %239
  store i64 -9223372036854775799, ptr %6, align 8
  store i32 1, ptr %31, align 4
  br label %693

263:                                              ; preds = %255
  %264 = load i64, ptr %22, align 8, !tbaa !11
  %265 = load ptr, ptr %15, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.NVME_SQ, ptr %265, i32 0, i32 6
  %267 = getelementptr inbounds [2 x i64], ptr %266, i64 0, i64 0
  store i64 %264, ptr %267, align 1, !tbaa !11
  %268 = load ptr, ptr %15, align 8, !tbaa !5
  %269 = getelementptr inbounds %struct.NVME_SQ, ptr %268, i32 0, i32 6
  %270 = getelementptr inbounds [2 x i64], ptr %269, i64 0, i64 1
  store i64 0, ptr %270, align 1, !tbaa !11
  %271 = load ptr, ptr %10, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %271, i32 0, i32 4
  %273 = load i32, ptr %272, align 8, !tbaa !42
  %274 = zext i32 %273 to i64
  store i64 %274, ptr %26, align 8, !tbaa !11
  %275 = load ptr, ptr %10, align 8, !tbaa !5
  %276 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %275, i32 0, i32 3
  %277 = load ptr, ptr %276, align 8, !tbaa !43
  %278 = icmp ne ptr %277, null
  br i1 %278, label %279, label %313

279:                                              ; preds = %263
  %280 = load ptr, ptr %10, align 8, !tbaa !5
  %281 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %280, i32 0, i32 4
  %282 = load i32, ptr %281, align 8, !tbaa !42
  %283 = zext i32 %282 to i64
  store i64 %283, ptr %26, align 8, !tbaa !11
  %284 = load ptr, ptr %14, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %284, i32 0, i32 6
  %286 = load ptr, ptr %285, align 8, !tbaa !39
  %287 = load ptr, ptr %14, align 8, !tbaa !5
  %288 = load i32, ptr %21, align 4, !tbaa !9
  %289 = load ptr, ptr %10, align 8, !tbaa !5
  %290 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %289, i32 0, i32 3
  %291 = load ptr, ptr %290, align 8, !tbaa !43
  %292 = call i64 %286(ptr noundef %287, i32 noundef %288, ptr noundef %291, ptr noundef %26, ptr noundef %22, ptr noundef %24)
  store i64 %292, ptr %13, align 8, !tbaa !11
  %293 = load i64, ptr %13, align 8, !tbaa !11
  %294 = icmp slt i64 %293, 0
  br i1 %294, label %302, label %295

295:                                              ; preds = %279
  %296 = load ptr, ptr %10, align 8, !tbaa !5
  %297 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %296, i32 0, i32 4
  %298 = load i32, ptr %297, align 8, !tbaa !42
  %299 = zext i32 %298 to i64
  %300 = load i64, ptr %26, align 8, !tbaa !11
  %301 = icmp ne i64 %299, %300
  br i1 %301, label %302, label %309

302:                                              ; preds = %295, %279
  %303 = load ptr, ptr %14, align 8, !tbaa !5
  %304 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %303, i32 0, i32 7
  %305 = load ptr, ptr %304, align 8, !tbaa !44
  %306 = load ptr, ptr %14, align 8, !tbaa !5
  %307 = load ptr, ptr %23, align 8, !tbaa !5
  %308 = call i64 %305(ptr noundef %306, ptr noundef %307)
  store i64 -9223372036854775799, ptr %6, align 8
  store i32 1, ptr %31, align 4
  br label %693

309:                                              ; preds = %295
  %310 = load i64, ptr %22, align 8, !tbaa !11
  %311 = load ptr, ptr %15, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct.NVME_SQ, ptr %311, i32 0, i32 5
  store i64 %310, ptr %312, align 1, !tbaa !45
  br label %313

313:                                              ; preds = %309, %263
  br label %314

314:                                              ; preds = %313, %224, %218, %204
  %315 = load ptr, ptr %15, align 8, !tbaa !5
  %316 = getelementptr inbounds %struct.NVME_SQ, ptr %315, i32 0, i32 6
  %317 = getelementptr inbounds [2 x i64], ptr %316, i64 0, i64 0
  %318 = load i64, ptr %317, align 1, !tbaa !11
  %319 = trunc i64 %318 to i16
  %320 = zext i16 %319 to i32
  %321 = and i32 %320, 4095
  %322 = trunc i32 %321 to i16
  store i16 %322, ptr %19, align 2, !tbaa !46
  %323 = load ptr, ptr %10, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %323, i32 0, i32 2
  %325 = load i32, ptr %324, align 8, !tbaa !38
  store i32 %325, ptr %18, align 4, !tbaa !9
  %326 = load i16, ptr %19, align 2, !tbaa !46
  %327 = zext i16 %326 to i32
  %328 = load i32, ptr %18, align 4, !tbaa !9
  %329 = add i32 %327, %328
  %330 = icmp ugt i32 %329, 8192
  br i1 %330, label %331, label %366

331:                                              ; preds = %314
  %332 = load ptr, ptr %15, align 8, !tbaa !5
  %333 = getelementptr inbounds %struct.NVME_SQ, ptr %332, i32 0, i32 6
  %334 = getelementptr inbounds [2 x i64], ptr %333, i64 0, i64 0
  %335 = load i64, ptr %334, align 1, !tbaa !11
  %336 = add i64 %335, 4096
  %337 = and i64 %336, -4096
  store i64 %337, ptr %22, align 8, !tbaa !11
  %338 = load ptr, ptr %14, align 8, !tbaa !5
  %339 = load i64, ptr %22, align 8, !tbaa !11
  %340 = load i16, ptr %19, align 2, !tbaa !46
  %341 = zext i16 %340 to i32
  %342 = load i32, ptr %18, align 4, !tbaa !9
  %343 = add i32 %341, %342
  %344 = lshr i32 %343, 12
  %345 = load i16, ptr %19, align 2, !tbaa !46
  %346 = zext i16 %345 to i32
  %347 = load i32, ptr %18, align 4, !tbaa !9
  %348 = add i32 %346, %347
  %349 = and i32 %348, 4095
  %350 = icmp ne i32 %349, 0
  %351 = zext i1 %350 to i64
  %352 = select i1 %350, i32 1, i32 0
  %353 = add i32 %344, %352
  %354 = sub i32 %353, 1
  %355 = zext i32 %354 to i64
  %356 = call ptr @NvmeCreatePrpList(ptr noundef %338, i64 noundef %339, i64 noundef %355, ptr noundef %28, ptr noundef %29, ptr noundef %25)
  store ptr %356, ptr %27, align 8, !tbaa !5
  %357 = load ptr, ptr %27, align 8, !tbaa !5
  %358 = icmp eq ptr %357, null
  br i1 %358, label %359, label %360

359:                                              ; preds = %331
  br label %641

360:                                              ; preds = %331
  %361 = load ptr, ptr %27, align 8, !tbaa !5
  %362 = ptrtoint ptr %361 to i64
  %363 = load ptr, ptr %15, align 8, !tbaa !5
  %364 = getelementptr inbounds %struct.NVME_SQ, ptr %363, i32 0, i32 6
  %365 = getelementptr inbounds [2 x i64], ptr %364, i64 0, i64 1
  store i64 %362, ptr %365, align 1, !tbaa !11
  br label %383

366:                                              ; preds = %314
  %367 = load i16, ptr %19, align 2, !tbaa !46
  %368 = zext i16 %367 to i32
  %369 = load i32, ptr %18, align 4, !tbaa !9
  %370 = add i32 %368, %369
  %371 = icmp ugt i32 %370, 4096
  br i1 %371, label %372, label %382

372:                                              ; preds = %366
  %373 = load ptr, ptr %15, align 8, !tbaa !5
  %374 = getelementptr inbounds %struct.NVME_SQ, ptr %373, i32 0, i32 6
  %375 = getelementptr inbounds [2 x i64], ptr %374, i64 0, i64 0
  %376 = load i64, ptr %375, align 1, !tbaa !11
  %377 = add i64 %376, 4096
  %378 = and i64 %377, -4096
  %379 = load ptr, ptr %15, align 8, !tbaa !5
  %380 = getelementptr inbounds %struct.NVME_SQ, ptr %379, i32 0, i32 6
  %381 = getelementptr inbounds [2 x i64], ptr %380, i64 0, i64 1
  store i64 %378, ptr %381, align 1, !tbaa !11
  br label %382

382:                                              ; preds = %372, %366
  br label %383

383:                                              ; preds = %382, %360
  %384 = load ptr, ptr %10, align 8, !tbaa !5
  %385 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %384, i32 0, i32 6
  %386 = load ptr, ptr %385, align 8, !tbaa !13
  %387 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %386, i32 0, i32 1
  %388 = load i8, ptr %387, align 4, !tbaa !47
  %389 = zext i8 %388 to i32
  %390 = and i32 %389, 1
  %391 = icmp ne i32 %390, 0
  br i1 %391, label %392, label %401

392:                                              ; preds = %383
  %393 = load ptr, ptr %10, align 8, !tbaa !5
  %394 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %393, i32 0, i32 6
  %395 = load ptr, ptr %394, align 8, !tbaa !13
  %396 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %395, i32 0, i32 3
  %397 = load i32, ptr %396, align 4, !tbaa !48
  %398 = load ptr, ptr %15, align 8, !tbaa !5
  %399 = getelementptr inbounds %struct.NVME_SQ, ptr %398, i32 0, i32 7
  %400 = getelementptr inbounds %struct.NVME_RAW, ptr %399, i32 0, i32 0
  store i32 %397, ptr %400, align 1, !tbaa !24
  br label %401

401:                                              ; preds = %392, %383
  %402 = load ptr, ptr %10, align 8, !tbaa !5
  %403 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %402, i32 0, i32 6
  %404 = load ptr, ptr %403, align 8, !tbaa !13
  %405 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %404, i32 0, i32 1
  %406 = load i8, ptr %405, align 4, !tbaa !47
  %407 = zext i8 %406 to i32
  %408 = and i32 %407, 2
  %409 = icmp ne i32 %408, 0
  br i1 %409, label %410, label %419

410:                                              ; preds = %401
  %411 = load ptr, ptr %10, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %411, i32 0, i32 6
  %413 = load ptr, ptr %412, align 8, !tbaa !13
  %414 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %413, i32 0, i32 4
  %415 = load i32, ptr %414, align 4, !tbaa !49
  %416 = load ptr, ptr %15, align 8, !tbaa !5
  %417 = getelementptr inbounds %struct.NVME_SQ, ptr %416, i32 0, i32 7
  %418 = getelementptr inbounds %struct.NVME_RAW, ptr %417, i32 0, i32 1
  store i32 %415, ptr %418, align 1, !tbaa !24
  br label %419

419:                                              ; preds = %410, %401
  %420 = load ptr, ptr %10, align 8, !tbaa !5
  %421 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %420, i32 0, i32 6
  %422 = load ptr, ptr %421, align 8, !tbaa !13
  %423 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %422, i32 0, i32 1
  %424 = load i8, ptr %423, align 4, !tbaa !47
  %425 = zext i8 %424 to i32
  %426 = and i32 %425, 4
  %427 = icmp ne i32 %426, 0
  br i1 %427, label %428, label %437

428:                                              ; preds = %419
  %429 = load ptr, ptr %10, align 8, !tbaa !5
  %430 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %429, i32 0, i32 6
  %431 = load ptr, ptr %430, align 8, !tbaa !13
  %432 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %431, i32 0, i32 5
  %433 = load i32, ptr %432, align 4, !tbaa !50
  %434 = load ptr, ptr %15, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.NVME_SQ, ptr %434, i32 0, i32 7
  %436 = getelementptr inbounds %struct.NVME_RAW, ptr %435, i32 0, i32 2
  store i32 %433, ptr %436, align 1, !tbaa !24
  br label %437

437:                                              ; preds = %428, %419
  %438 = load ptr, ptr %10, align 8, !tbaa !5
  %439 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %438, i32 0, i32 6
  %440 = load ptr, ptr %439, align 8, !tbaa !13
  %441 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %440, i32 0, i32 1
  %442 = load i8, ptr %441, align 4, !tbaa !47
  %443 = zext i8 %442 to i32
  %444 = and i32 %443, 8
  %445 = icmp ne i32 %444, 0
  br i1 %445, label %446, label %455

446:                                              ; preds = %437
  %447 = load ptr, ptr %10, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %447, i32 0, i32 6
  %449 = load ptr, ptr %448, align 8, !tbaa !13
  %450 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %449, i32 0, i32 6
  %451 = load i32, ptr %450, align 4, !tbaa !51
  %452 = load ptr, ptr %15, align 8, !tbaa !5
  %453 = getelementptr inbounds %struct.NVME_SQ, ptr %452, i32 0, i32 7
  %454 = getelementptr inbounds %struct.NVME_RAW, ptr %453, i32 0, i32 3
  store i32 %451, ptr %454, align 1, !tbaa !24
  br label %455

455:                                              ; preds = %446, %437
  %456 = load ptr, ptr %10, align 8, !tbaa !5
  %457 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %456, i32 0, i32 6
  %458 = load ptr, ptr %457, align 8, !tbaa !13
  %459 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %458, i32 0, i32 1
  %460 = load i8, ptr %459, align 4, !tbaa !47
  %461 = zext i8 %460 to i32
  %462 = and i32 %461, 16
  %463 = icmp ne i32 %462, 0
  br i1 %463, label %464, label %473

464:                                              ; preds = %455
  %465 = load ptr, ptr %10, align 8, !tbaa !5
  %466 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %465, i32 0, i32 6
  %467 = load ptr, ptr %466, align 8, !tbaa !13
  %468 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %467, i32 0, i32 7
  %469 = load i32, ptr %468, align 4, !tbaa !52
  %470 = load ptr, ptr %15, align 8, !tbaa !5
  %471 = getelementptr inbounds %struct.NVME_SQ, ptr %470, i32 0, i32 7
  %472 = getelementptr inbounds %struct.NVME_RAW, ptr %471, i32 0, i32 4
  store i32 %469, ptr %472, align 1, !tbaa !24
  br label %473

473:                                              ; preds = %464, %455
  %474 = load ptr, ptr %10, align 8, !tbaa !5
  %475 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %474, i32 0, i32 6
  %476 = load ptr, ptr %475, align 8, !tbaa !13
  %477 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %476, i32 0, i32 1
  %478 = load i8, ptr %477, align 4, !tbaa !47
  %479 = zext i8 %478 to i32
  %480 = and i32 %479, 32
  %481 = icmp ne i32 %480, 0
  br i1 %481, label %482, label %491

482:                                              ; preds = %473
  %483 = load ptr, ptr %10, align 8, !tbaa !5
  %484 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %483, i32 0, i32 6
  %485 = load ptr, ptr %484, align 8, !tbaa !13
  %486 = getelementptr inbounds %struct.NVM_EXPRESS_COMMAND, ptr %485, i32 0, i32 8
  %487 = load i32, ptr %486, align 4, !tbaa !53
  %488 = load ptr, ptr %15, align 8, !tbaa !5
  %489 = getelementptr inbounds %struct.NVME_SQ, ptr %488, i32 0, i32 7
  %490 = getelementptr inbounds %struct.NVME_RAW, ptr %489, i32 0, i32 5
  store i32 %487, ptr %490, align 1, !tbaa !24
  br label %491

491:                                              ; preds = %482, %473
  %492 = load ptr, ptr %12, align 8, !tbaa !5
  %493 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %492, i32 0, i32 16
  %494 = load i8, ptr %17, align 1, !tbaa !24
  %495 = zext i8 %494 to i64
  %496 = getelementptr inbounds [2 x %struct.NVME_SQTDBL], ptr %493, i64 0, i64 %495
  %497 = getelementptr inbounds %struct.NVME_SQTDBL, ptr %496, i32 0, i32 0
  %498 = load i16, ptr %497, align 4, !tbaa !25
  %499 = zext i16 %498 to i32
  %500 = xor i32 %499, 1
  %501 = trunc i32 %500 to i16
  store i16 %501, ptr %497, align 4, !tbaa !25
  %502 = load ptr, ptr %12, align 8, !tbaa !5
  %503 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %502, i32 0, i32 16
  %504 = load i8, ptr %17, align 1, !tbaa !24
  %505 = zext i8 %504 to i64
  %506 = getelementptr inbounds [2 x %struct.NVME_SQTDBL], ptr %503, i64 0, i64 %505
  %507 = call i32 @ReadUnaligned32(ptr noundef %506)
  store i32 %507, ptr %30, align 4, !tbaa !9
  %508 = load ptr, ptr %14, align 8, !tbaa !5
  %509 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %508, i32 0, i32 2
  %510 = getelementptr inbounds %struct.EFI_PCI_IO_PROTOCOL_ACCESS, ptr %509, i32 0, i32 1
  %511 = load ptr, ptr %510, align 8, !tbaa !54
  %512 = load ptr, ptr %14, align 8, !tbaa !5
  %513 = load i8, ptr %17, align 1, !tbaa !24
  %514 = zext i8 %513 to i32
  %515 = mul nsw i32 2, %514
  %516 = load ptr, ptr %12, align 8, !tbaa !5
  %517 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %516, i32 0, i32 20
  %518 = getelementptr inbounds %struct.NVME_CAP, ptr %517, i32 0, i32 3
  %519 = load i16, ptr %518, align 2
  %520 = and i16 %519, 15
  %521 = zext i16 %520 to i32
  %522 = shl i32 4, %521
  %523 = mul nsw i32 %515, %522
  %524 = add nsw i32 4096, %523
  %525 = sext i32 %524 to i64
  %526 = call i64 %511(ptr noundef %512, i32 noundef 2, i8 noundef zeroext 0, i64 noundef %525, i64 noundef 1, ptr noundef %30)
  %527 = load ptr, ptr @gBS, align 8, !tbaa !5
  %528 = getelementptr inbounds %struct.EFI_BOOT_SERVICES, ptr %527, i32 0, i32 8
  %529 = load ptr, ptr %528, align 8, !tbaa !55
  %530 = call i64 %529(i32 noundef -2147483648, i64 noundef 8, ptr noundef null, ptr noundef null, ptr noundef %20)
  store i64 %530, ptr %13, align 8, !tbaa !11
  %531 = load i64, ptr %13, align 8, !tbaa !11
  %532 = icmp slt i64 %531, 0
  br i1 %532, label %533, label %534

533:                                              ; preds = %491
  br label %641

534:                                              ; preds = %491
  %535 = load ptr, ptr @gBS, align 8, !tbaa !5
  %536 = getelementptr inbounds %struct.EFI_BOOT_SERVICES, ptr %535, i32 0, i32 9
  %537 = load ptr, ptr %536, align 8, !tbaa !58
  %538 = load ptr, ptr %20, align 8, !tbaa !5
  %539 = load ptr, ptr %10, align 8, !tbaa !5
  %540 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %539, i32 0, i32 0
  %541 = load i64, ptr %540, align 8, !tbaa !59
  %542 = call i64 %537(ptr noundef %538, i32 noundef 2, i64 noundef %541)
  store i64 %542, ptr %13, align 8, !tbaa !11
  %543 = load i64, ptr %13, align 8, !tbaa !11
  %544 = icmp slt i64 %543, 0
  br i1 %544, label %545, label %548

545:                                              ; preds = %534
  %546 = load ptr, ptr %10, align 8, !tbaa !5
  %547 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %546, i32 0, i32 8
  store i8 6, ptr %547, align 8, !tbaa !60
  br label %641

548:                                              ; preds = %534
  store i64 -9223372036854775790, ptr %13, align 8, !tbaa !11
  %549 = load ptr, ptr %10, align 8, !tbaa !5
  %550 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %549, i32 0, i32 8
  store i8 9, ptr %550, align 8, !tbaa !60
  br label %551

551:                                              ; preds = %575, %548
  %552 = load ptr, ptr @gBS, align 8, !tbaa !5
  %553 = getelementptr inbounds %struct.EFI_BOOT_SERVICES, ptr %552, i32 0, i32 13
  %554 = load ptr, ptr %553, align 8, !tbaa !61
  %555 = load ptr, ptr %20, align 8, !tbaa !5
  %556 = call i64 %554(ptr noundef %555)
  %557 = icmp slt i64 %556, 0
  br i1 %557, label %558, label %576

558:                                              ; preds = %551
  %559 = load ptr, ptr %16, align 8, !tbaa !5
  %560 = getelementptr inbounds %struct.NVME_CQ, ptr %559, i32 0, i32 5
  %561 = load i16, ptr %560, align 1
  %562 = and i16 %561, 1
  %563 = zext i16 %562 to i32
  %564 = load ptr, ptr %12, align 8, !tbaa !5
  %565 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %564, i32 0, i32 18
  %566 = load i8, ptr %17, align 1, !tbaa !24
  %567 = zext i8 %566 to i64
  %568 = getelementptr inbounds [2 x i8], ptr %565, i64 0, i64 %567
  %569 = load i8, ptr %568, align 1, !tbaa !24
  %570 = zext i8 %569 to i32
  %571 = icmp ne i32 %563, %570
  br i1 %571, label %572, label %575

572:                                              ; preds = %558
  store i64 0, ptr %13, align 8, !tbaa !11
  %573 = load ptr, ptr %10, align 8, !tbaa !5
  %574 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %573, i32 0, i32 8
  store i8 0, ptr %574, align 8, !tbaa !60
  br label %576

575:                                              ; preds = %558
  br label %551, !llvm.loop !62

576:                                              ; preds = %572, %551
  %577 = load ptr, ptr %12, align 8, !tbaa !5
  %578 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %577, i32 0, i32 17
  %579 = load i8, ptr %17, align 1, !tbaa !24
  %580 = zext i8 %579 to i64
  %581 = getelementptr inbounds [2 x %struct.NVME_CQHDBL], ptr %578, i64 0, i64 %580
  %582 = getelementptr inbounds %struct.NVME_CQHDBL, ptr %581, i32 0, i32 0
  %583 = load i16, ptr %582, align 4, !tbaa !25
  %584 = zext i16 %583 to i32
  %585 = xor i32 %584, 1
  %586 = trunc i32 %585 to i16
  store i16 %586, ptr %582, align 4, !tbaa !25
  %587 = zext i16 %586 to i32
  %588 = icmp eq i32 %587, 0
  br i1 %588, label %589, label %599

589:                                              ; preds = %576
  %590 = load ptr, ptr %12, align 8, !tbaa !5
  %591 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %590, i32 0, i32 18
  %592 = load i8, ptr %17, align 1, !tbaa !24
  %593 = zext i8 %592 to i64
  %594 = getelementptr inbounds [2 x i8], ptr %591, i64 0, i64 %593
  %595 = load i8, ptr %594, align 1, !tbaa !24
  %596 = zext i8 %595 to i32
  %597 = xor i32 %596, 1
  %598 = trunc i32 %597 to i8
  store i8 %598, ptr %594, align 1, !tbaa !24
  br label %599

599:                                              ; preds = %589, %576
  %600 = load ptr, ptr %10, align 8, !tbaa !5
  %601 = getelementptr inbounds %struct.NVM_EXPRESS_PASS_THRU_COMMAND_PACKET, ptr %600, i32 0, i32 7
  %602 = load ptr, ptr %601, align 8, !tbaa !15
  %603 = load ptr, ptr %16, align 8, !tbaa !5
  %604 = call ptr @CopyMem(ptr noundef %602, ptr noundef %603, i64 noundef 16)
  br label %605

605:                                              ; preds = %599
  %606 = call zeroext i8 @DebugCodeEnabled()
  %607 = icmp ne i8 %606, 0
  br i1 %607, label %608, label %612

608:                                              ; preds = %605
  call void @llvm.lifetime.start.p0(i64 1, ptr %32) #3
  %609 = load ptr, ptr %16, align 8, !tbaa !5
  call void @NvmeDumpStatus(ptr noundef %609)
  store i8 0, ptr %32, align 1, !tbaa !24
  %610 = load i8, ptr %32, align 1, !tbaa !24
  %611 = add i8 %610, 1
  store i8 %611, ptr %32, align 1, !tbaa !24
  call void @llvm.lifetime.end.p0(i64 1, ptr %32) #3
  br label %612

612:                                              ; preds = %608, %605
  br label %613

613:                                              ; preds = %612
  br label %614

614:                                              ; preds = %613
  %615 = load ptr, ptr %12, align 8, !tbaa !5
  %616 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %615, i32 0, i32 17
  %617 = load i8, ptr %17, align 1, !tbaa !24
  %618 = zext i8 %617 to i64
  %619 = getelementptr inbounds [2 x %struct.NVME_CQHDBL], ptr %616, i64 0, i64 %618
  %620 = call i32 @ReadUnaligned32(ptr noundef %619)
  store i32 %620, ptr %30, align 4, !tbaa !9
  %621 = load ptr, ptr %14, align 8, !tbaa !5
  %622 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %621, i32 0, i32 2
  %623 = getelementptr inbounds %struct.EFI_PCI_IO_PROTOCOL_ACCESS, ptr %622, i32 0, i32 1
  %624 = load ptr, ptr %623, align 8, !tbaa !54
  %625 = load ptr, ptr %14, align 8, !tbaa !5
  %626 = load i8, ptr %17, align 1, !tbaa !24
  %627 = zext i8 %626 to i32
  %628 = mul nsw i32 2, %627
  %629 = add nsw i32 %628, 1
  %630 = load ptr, ptr %12, align 8, !tbaa !5
  %631 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %630, i32 0, i32 20
  %632 = getelementptr inbounds %struct.NVME_CAP, ptr %631, i32 0, i32 3
  %633 = load i16, ptr %632, align 2
  %634 = and i16 %633, 15
  %635 = zext i16 %634 to i32
  %636 = shl i32 4, %635
  %637 = mul nsw i32 %629, %636
  %638 = add nsw i32 4096, %637
  %639 = sext i32 %638 to i64
  %640 = call i64 %624(ptr noundef %625, i32 noundef 2, i8 noundef zeroext 0, i64 noundef %639, i64 noundef 1, ptr noundef %30)
  br label %641

641:                                              ; preds = %614, %545, %533, %359
  %642 = load ptr, ptr %23, align 8, !tbaa !5
  %643 = icmp ne ptr %642, null
  br i1 %643, label %644, label %651

644:                                              ; preds = %641
  %645 = load ptr, ptr %14, align 8, !tbaa !5
  %646 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %645, i32 0, i32 7
  %647 = load ptr, ptr %646, align 8, !tbaa !44
  %648 = load ptr, ptr %14, align 8, !tbaa !5
  %649 = load ptr, ptr %23, align 8, !tbaa !5
  %650 = call i64 %647(ptr noundef %648, ptr noundef %649)
  br label %651

651:                                              ; preds = %644, %641
  %652 = load ptr, ptr %24, align 8, !tbaa !5
  %653 = icmp ne ptr %652, null
  br i1 %653, label %654, label %661

654:                                              ; preds = %651
  %655 = load ptr, ptr %14, align 8, !tbaa !5
  %656 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %655, i32 0, i32 7
  %657 = load ptr, ptr %656, align 8, !tbaa !44
  %658 = load ptr, ptr %14, align 8, !tbaa !5
  %659 = load ptr, ptr %24, align 8, !tbaa !5
  %660 = call i64 %657(ptr noundef %658, ptr noundef %659)
  br label %661

661:                                              ; preds = %654, %651
  %662 = load ptr, ptr %25, align 8, !tbaa !5
  %663 = icmp ne ptr %662, null
  br i1 %663, label %664, label %671

664:                                              ; preds = %661
  %665 = load ptr, ptr %14, align 8, !tbaa !5
  %666 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %665, i32 0, i32 7
  %667 = load ptr, ptr %666, align 8, !tbaa !44
  %668 = load ptr, ptr %14, align 8, !tbaa !5
  %669 = load ptr, ptr %25, align 8, !tbaa !5
  %670 = call i64 %667(ptr noundef %668, ptr noundef %669)
  br label %671

671:                                              ; preds = %664, %661
  %672 = load ptr, ptr %27, align 8, !tbaa !5
  %673 = icmp ne ptr %672, null
  br i1 %673, label %674, label %682

674:                                              ; preds = %671
  %675 = load ptr, ptr %14, align 8, !tbaa !5
  %676 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %675, i32 0, i32 9
  %677 = load ptr, ptr %676, align 8, !tbaa !64
  %678 = load ptr, ptr %14, align 8, !tbaa !5
  %679 = load i64, ptr %29, align 8, !tbaa !11
  %680 = load ptr, ptr %28, align 8, !tbaa !5
  %681 = call i64 %677(ptr noundef %678, i64 noundef %679, ptr noundef %680)
  br label %682

682:                                              ; preds = %674, %671
  %683 = load ptr, ptr %20, align 8, !tbaa !5
  %684 = icmp ne ptr %683, null
  br i1 %684, label %685, label %691

685:                                              ; preds = %682
  %686 = load ptr, ptr @gBS, align 8, !tbaa !5
  %687 = getelementptr inbounds %struct.EFI_BOOT_SERVICES, ptr %686, i32 0, i32 12
  %688 = load ptr, ptr %687, align 8, !tbaa !65
  %689 = load ptr, ptr %20, align 8, !tbaa !5
  %690 = call i64 %688(ptr noundef %689)
  br label %691

691:                                              ; preds = %685, %682
  %692 = load i64, ptr %13, align 8, !tbaa !11
  store i64 %692, ptr %6, align 8
  store i32 1, ptr %31, align 4
  br label %693

693:                                              ; preds = %691, %302, %262, %203, %129, %62, %49, %38
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #3
  %694 = load i64, ptr %6, align 8
  ret i64 %694
}

declare zeroext i8 @DebugAssertEnabled() #1

declare void @DebugAssert(ptr noundef, i64 noundef, ptr noundef) #1

declare i32 @ReadUnaligned32(ptr noundef) #1

declare ptr @CopyMem(ptr noundef, ptr noundef, i64 noundef) #1

declare zeroext i8 @DebugCodeEnabled() #1

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"long long", !7, i64 0}
!13 = !{!14, !6, i64 40}
!14 = !{!"", !12, i64 0, !6, i64 8, !10, i64 16, !6, i64 24, !10, i64 32, !7, i64 36, !6, i64 40, !6, i64 48, !7, i64 56}
!15 = !{!14, !6, i64 48}
!16 = !{!14, !7, i64 36}
!17 = !{!18, !10, i64 0}
!18 = !{!"_NVME_CONTROLLER_PRIVATE_DATA", !10, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !12, i64 40, !6, i64 48, !19, i64 56, !20, i64 88, !6, i64 128, !6, i64 136, !6, i64 144, !7, i64 152, !7, i64 168, !7, i64 184, !7, i64 200, !7, i64 216, !7, i64 224, !7, i64 232, !7, i64 234, !21, i64 238, !6, i64 248}
!19 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !12, i64 16, !10, i64 24}
!20 = !{!"_NVM_EXPRESS_PASS_THRU_PROTOCOL", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32}
!21 = !{!"", !22, i64 0, !7, i64 2, !7, i64 2, !7, i64 2, !7, i64 3, !22, i64 4, !22, i64 4, !22, i64 4, !22, i64 5, !7, i64 6, !7, i64 6, !7, i64 7}
!22 = !{!"short", !7, i64 0}
!23 = !{!18, !6, i64 32}
!24 = !{!7, !7, i64 0}
!25 = !{!26, !22, i64 0}
!26 = !{!"", !22, i64 0, !22, i64 2}
!27 = !{!28, !10, i64 8}
!28 = !{!"", !29, i64 0, !7, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32}
!29 = !{!"", !7, i64 0, !7, i64 1, !22, i64 2}
!30 = !{!28, !7, i64 0}
!31 = !{!32, !7, i64 0}
!32 = !{!"", !7, i64 0, !7, i64 1, !7, i64 1, !7, i64 1, !22, i64 2, !10, i64 4, !12, i64 8, !12, i64 16, !7, i64 24, !7, i64 40}
!33 = !{!28, !7, i64 1}
!34 = !{!28, !22, i64 2}
!35 = !{!32, !22, i64 2}
!36 = !{!32, !10, i64 4}
!37 = !{!14, !6, i64 8}
!38 = !{!14, !10, i64 16}
!39 = !{!40, !6, i64 72}
!40 = !{!"_EFI_PCI_IO_PROTOCOL", !6, i64 0, !6, i64 8, !41, i64 16, !41, i64 32, !41, i64 48, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !6, i64 136, !12, i64 144, !6, i64 152}
!41 = !{!"", !6, i64 0, !6, i64 8}
!42 = !{!14, !10, i64 32}
!43 = !{!14, !6, i64 24}
!44 = !{!40, !6, i64 80}
!45 = !{!32, !12, i64 16}
!46 = !{!22, !22, i64 0}
!47 = !{!28, !7, i64 4}
!48 = !{!28, !10, i64 12}
!49 = !{!28, !10, i64 16}
!50 = !{!28, !10, i64 20}
!51 = !{!28, !10, i64 24}
!52 = !{!28, !10, i64 28}
!53 = !{!28, !10, i64 32}
!54 = !{!40, !6, i64 24}
!55 = !{!56, !6, i64 80}
!56 = !{!"", !57, i64 0, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !6, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !6, i64 224, !6, i64 232, !6, i64 240, !6, i64 248, !6, i64 256, !6, i64 264, !6, i64 272, !6, i64 280, !6, i64 288, !6, i64 296, !6, i64 304, !6, i64 312, !6, i64 320, !6, i64 328, !6, i64 336, !6, i64 344, !6, i64 352, !6, i64 360, !6, i64 368}
!57 = !{!"", !12, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20}
!58 = !{!56, !6, i64 88}
!59 = !{!14, !12, i64 0}
!60 = !{!14, !7, i64 56}
!61 = !{!56, !6, i64 120}
!62 = distinct !{!62, !63}
!63 = !{!"llvm.loop.mustprogress"}
!64 = !{!40, !6, i64 96}
!65 = !{!56, !6, i64 112}


; 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.NVME_SQTDBL = type { i16, i16 }
%struct.NVME_SQ = type { i8, i8, i16, i32, i64, i64, [2 x i64], %union.NVME_PAYLOAD }
%union.NVME_PAYLOAD = type { %union.NVME_CMD }
%union.NVME_CMD = type { %struct.NVME_READ }
%struct.NVME_READ = type { i64, i16, i16, i32, i32, i16, i16 }
%struct.NVME_CQHDBL = type { i16, i16 }
%struct.NVME_CQ = type { i32, i32, i16, i16, i16, i16 }

@.str.52 = external hidden unnamed_addr constant [157 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [51 x i8], align 1
@gBS = external local_unnamed_addr global ptr, align 8

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

declare zeroext i8 @DebugPrintEnabled() local_unnamed_addr #1

declare zeroext i8 @DebugPrintLevelEnabled(i64 noundef) local_unnamed_addr #1

declare void @DebugPrint(i64 noundef, ptr noundef, ...) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local ptr @NvmeCreatePrpList(ptr noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

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

declare ptr @ZeroMem(ptr noundef, i64 noundef) local_unnamed_addr #1

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

; Function Attrs: nounwind uwtable
define dso_local i64 @NvmExpressPassThru(ptr noundef %0, i32 noundef %1, i64 noundef %2, ptr noundef %3, ptr nocapture noundef readnone %4) local_unnamed_addr #0 {
  %6 = alloca ptr, align 8
  %7 = alloca i64, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i64, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i64, align 8
  %14 = alloca i32, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %6) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %7) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %11) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %13) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %14) #3
  %15 = icmp eq ptr %0, null
  %16 = icmp eq ptr %3, null
  %or.cond = or i1 %15, %16
  br i1 %or.cond, label %310, label %17

17:                                               ; preds = %5
  %18 = getelementptr inbounds i8, ptr %3, i64 40
  %19 = load ptr, ptr %18, align 8, !tbaa !5
  %20 = icmp eq ptr %19, null
  br i1 %20, label %310, label %21

21:                                               ; preds = %17
  %22 = getelementptr inbounds i8, ptr %3, i64 48
  %23 = load ptr, ptr %22, align 8, !tbaa !12
  %24 = icmp eq ptr %23, null
  br i1 %24, label %310, label %25

25:                                               ; preds = %21
  %26 = getelementptr inbounds i8, ptr %3, i64 36
  %27 = load i8, ptr %26, align 4, !tbaa !13
  %switch = icmp ult i8 %27, 2
  br i1 %switch, label %28, label %310

28:                                               ; preds = %25
  %29 = tail call zeroext i8 @DebugAssertEnabled() #3
  %.not157 = icmp eq i8 %29, 0
  %.pre202 = ptrtoint ptr %0 to i64
  %.pre203 = add i64 %.pre202, -88
  %.pre205 = inttoptr i64 %.pre203 to ptr
  br i1 %.not157, label %._crit_edge, label %30

30:                                               ; preds = %28
  %31 = load i32, ptr %.pre205, align 8, !tbaa !14
  %.not158 = icmp eq i32 %31, 1162696270
  br i1 %.not158, label %._crit_edge, label %32

32:                                               ; preds = %30
  tail call void @DebugAssert(ptr noundef nonnull @.str.52, i64 noundef 407, ptr noundef nonnull @.str.53) #3
  br label %._crit_edge

._crit_edge:                                      ; preds = %28, %30, %32
  %33 = phi ptr [ %0, %32 ], [ %.pre205, %30 ], [ %.pre205, %28 ]
  %34 = getelementptr inbounds i8, ptr %33, i64 32
  %35 = load ptr, ptr %34, align 8, !tbaa !20
  store ptr null, ptr %8, align 8, !tbaa !21
  store ptr null, ptr %9, align 8, !tbaa !21
  store ptr null, ptr %10, align 8, !tbaa !21
  store ptr null, ptr %12, align 8, !tbaa !21
  store i64 0, ptr %13, align 8, !tbaa !22
  store ptr null, ptr %6, align 8, !tbaa !21
  %36 = load i8, ptr %26, align 4, !tbaa !13
  %37 = getelementptr inbounds i8, ptr %33, i64 152
  %38 = zext i8 %36 to i64
  %39 = getelementptr inbounds [2 x ptr], ptr %37, i64 0, i64 %38
  %40 = load ptr, ptr %39, align 8, !tbaa !21
  %41 = getelementptr inbounds i8, ptr %33, i64 216
  %42 = getelementptr inbounds [2 x %struct.NVME_SQTDBL], ptr %41, i64 0, i64 %38
  %43 = load i16, ptr %42, align 4, !tbaa !23
  %44 = zext i16 %43 to i64
  %45 = getelementptr inbounds %struct.NVME_SQ, ptr %40, i64 %44
  %46 = getelementptr inbounds i8, ptr %33, i64 168
  %47 = getelementptr inbounds [2 x ptr], ptr %46, i64 0, i64 %38
  %48 = load ptr, ptr %47, align 8, !tbaa !21
  %49 = getelementptr inbounds i8, ptr %33, i64 224
  %50 = getelementptr inbounds [2 x %struct.NVME_CQHDBL], ptr %49, i64 0, i64 %38
  %51 = load i16, ptr %50, align 4, !tbaa !23
  %52 = zext i16 %51 to i64
  %53 = getelementptr inbounds %struct.NVME_CQ, ptr %48, i64 %52
  %54 = load ptr, ptr %18, align 8, !tbaa !5
  %55 = getelementptr inbounds i8, ptr %54, i64 8
  %56 = load i32, ptr %55, align 4, !tbaa !25
  %.not159 = icmp eq i32 %56, %1
  br i1 %.not159, label %57, label %310

57:                                               ; preds = %._crit_edge
  %58 = tail call ptr @ZeroMem(ptr noundef %45, i64 noundef 64) #3
  %59 = load ptr, ptr %18, align 8, !tbaa !5
  %60 = load i8, ptr %59, align 4, !tbaa !28
  store i8 %60, ptr %45, align 1, !tbaa !29
  %61 = getelementptr inbounds i8, ptr %59, i64 1
  %62 = load i8, ptr %61, align 1, !tbaa !31
  %63 = getelementptr inbounds i8, ptr %45, i64 1
  %64 = load i8, ptr %63, align 1
  %65 = and i8 %62, 3
  %66 = and i8 %64, -4
  %67 = or disjoint i8 %66, %65
  store i8 %67, ptr %63, align 1
  %68 = load ptr, ptr %18, align 8, !tbaa !5
  %69 = getelementptr inbounds i8, ptr %68, i64 2
  %70 = load i16, ptr %69, align 2, !tbaa !32
  %71 = getelementptr inbounds i8, ptr %45, i64 2
  store i16 %70, ptr %71, align 1, !tbaa !33
  %72 = getelementptr inbounds i8, ptr %68, i64 8
  %73 = load i32, ptr %72, align 4, !tbaa !25
  %74 = getelementptr inbounds i8, ptr %45, i64 4
  store i32 %73, ptr %74, align 1, !tbaa !34
  %75 = tail call zeroext i8 @DebugAssertEnabled() #3
  %.not160 = icmp eq i8 %75, 0
  br i1 %.not160, label %80, label %76

76:                                               ; preds = %57
  %77 = load i8, ptr %63, align 1
  %78 = icmp sgt i8 %77, -1
  br i1 %78, label %.thread, label %79

79:                                               ; preds = %76
  tail call void @DebugAssert(ptr noundef nonnull @.str.52, i64 noundef 435, ptr noundef nonnull @.str.54) #3
  br label %80

80:                                               ; preds = %79, %57
  %.pr = load i8, ptr %63, align 1
  %.not161 = icmp sgt i8 %.pr, -1
  br i1 %.not161, label %.thread, label %81

81:                                               ; preds = %80
  %82 = tail call zeroext i8 @DebugPrintEnabled() #3
  %.not184 = icmp eq i8 %82, 0
  br i1 %.not184, label %310, label %83

83:                                               ; preds = %81
  %84 = tail call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 2147483648) #3
  %.not185 = icmp eq i8 %84, 0
  br i1 %.not185, label %310, label %85

85:                                               ; preds = %83
  tail call void (i64, ptr, ...) @DebugPrint(i64 noundef 2147483648, ptr noundef nonnull @.str.55) #3
  br label %310

.thread:                                          ; preds = %76, %80
  %86 = getelementptr inbounds i8, ptr %3, i64 8
  %87 = load ptr, ptr %86, align 8, !tbaa !35
  %88 = ptrtoint ptr %87 to i64
  %89 = getelementptr inbounds i8, ptr %45, i64 24
  store i64 %88, ptr %89, align 1, !tbaa !22
  %90 = load i8, ptr %45, align 1, !tbaa !29
  %91 = zext i8 %90 to i32
  %92 = and i32 %91, 3
  %.not162 = icmp eq i32 %92, 0
  %93 = and i8 %90, -5
  %94 = icmp eq i8 %93, 1
  %or.cond187 = or i1 %94, %.not162
  br i1 %or.cond187, label %132, label %95

95:                                               ; preds = %.thread
  %96 = and i32 %91, 1
  %. = xor i32 %96, 1
  %97 = getelementptr inbounds i8, ptr %3, i64 16
  %98 = load i32, ptr %97, align 8, !tbaa !36
  %99 = zext i32 %98 to i64
  store i64 %99, ptr %11, align 8, !tbaa !22
  %100 = getelementptr inbounds i8, ptr %35, i64 72
  %101 = load ptr, ptr %100, align 8, !tbaa !37
  %102 = call i64 %101(ptr noundef %35, i32 noundef %., ptr noundef %87, ptr noundef nonnull %11, ptr noundef nonnull %7, ptr noundef nonnull %8) #3
  %103 = icmp slt i64 %102, 0
  br i1 %103, label %310, label %104

104:                                              ; preds = %95
  %105 = load i32, ptr %97, align 8, !tbaa !36
  %106 = zext i32 %105 to i64
  %107 = load i64, ptr %11, align 8, !tbaa !22
  %.not166 = icmp eq i64 %107, %106
  br i1 %.not166, label %108, label %310

108:                                              ; preds = %104
  %109 = load i64, ptr %7, align 8, !tbaa !22
  store i64 %109, ptr %89, align 1, !tbaa !22
  %110 = getelementptr inbounds i8, ptr %45, i64 32
  store i64 0, ptr %110, align 1, !tbaa !22
  %111 = getelementptr inbounds i8, ptr %3, i64 32
  %112 = load i32, ptr %111, align 8, !tbaa !40
  %113 = zext i32 %112 to i64
  store i64 %113, ptr %11, align 8, !tbaa !22
  %114 = getelementptr inbounds i8, ptr %3, i64 24
  %115 = load ptr, ptr %114, align 8, !tbaa !41
  %.not167 = icmp eq ptr %115, null
  br i1 %.not167, label %132, label %116

116:                                              ; preds = %108
  %117 = load ptr, ptr %100, align 8, !tbaa !37
  %118 = call i64 %117(ptr noundef nonnull %35, i32 noundef %., ptr noundef nonnull %115, ptr noundef nonnull %11, ptr noundef nonnull %7, ptr noundef nonnull %9) #3
  %119 = icmp slt i64 %118, 0
  br i1 %119, label %124, label %120

120:                                              ; preds = %116
  %121 = load i32, ptr %111, align 8, !tbaa !40
  %122 = zext i32 %121 to i64
  %123 = load i64, ptr %11, align 8, !tbaa !22
  %.not168 = icmp eq i64 %123, %122
  br i1 %.not168, label %129, label %124

124:                                              ; preds = %120, %116
  %125 = getelementptr inbounds i8, ptr %35, i64 80
  %126 = load ptr, ptr %125, align 8, !tbaa !42
  %127 = load ptr, ptr %8, align 8, !tbaa !21
  %128 = call i64 %126(ptr noundef nonnull %35, ptr noundef %127) #3
  br label %310

129:                                              ; preds = %120
  %130 = load i64, ptr %7, align 8, !tbaa !22
  %131 = getelementptr inbounds i8, ptr %45, i64 16
  store i64 %130, ptr %131, align 1, !tbaa !43
  br label %132

132:                                              ; preds = %108, %129, %.thread
  %.0138 = phi i64 [ %118, %129 ], [ %102, %108 ], [ 0, %.thread ]
  %133 = load i64, ptr %89, align 1, !tbaa !22
  %134 = trunc i64 %133 to i32
  %135 = and i32 %134, 4095
  %136 = getelementptr inbounds i8, ptr %3, i64 16
  %137 = load i32, ptr %136, align 8, !tbaa !36
  %138 = add i32 %135, %137
  %139 = icmp ugt i32 %138, 8192
  br i1 %139, label %140, label %153

140:                                              ; preds = %132
  %141 = and i64 %133, -4096
  %142 = add i64 %141, 4096
  store i64 %142, ptr %7, align 8, !tbaa !22
  %143 = lshr i32 %138, 12
  %144 = and i32 %138, 4095
  %.not169 = icmp ne i32 %144, 0
  %145 = zext i1 %.not169 to i32
  %146 = add nsw i32 %143, -1
  %147 = add nuw nsw i32 %146, %145
  %148 = zext nneg i32 %147 to i64
  %149 = call ptr @NvmeCreatePrpList(ptr noundef %35, i64 noundef %142, i64 noundef %148, ptr noundef nonnull %12, ptr noundef nonnull %13, ptr noundef nonnull %10)
  %150 = icmp eq ptr %149, null
  br i1 %150, label %278, label %151

151:                                              ; preds = %140
  %152 = ptrtoint ptr %149 to i64
  br label %.sink.split

153:                                              ; preds = %132
  %154 = icmp ugt i32 %138, 4096
  br i1 %154, label %155, label %159

155:                                              ; preds = %153
  %156 = and i64 %133, -4096
  %157 = add i64 %156, 4096
  br label %.sink.split

.sink.split:                                      ; preds = %151, %155
  %.sink = phi i64 [ %157, %155 ], [ %152, %151 ]
  %.0136.ph = phi ptr [ null, %155 ], [ %149, %151 ]
  %158 = getelementptr inbounds i8, ptr %45, i64 32
  store i64 %.sink, ptr %158, align 1, !tbaa !22
  br label %159

159:                                              ; preds = %.sink.split, %153
  %.0136 = phi ptr [ null, %153 ], [ %.0136.ph, %.sink.split ]
  %160 = load ptr, ptr %18, align 8, !tbaa !5
  %161 = getelementptr inbounds i8, ptr %160, i64 4
  %162 = load i8, ptr %161, align 4, !tbaa !44
  %163 = and i8 %162, 1
  %.not170 = icmp eq i8 %163, 0
  br i1 %.not170, label %168, label %164

164:                                              ; preds = %159
  %165 = getelementptr inbounds i8, ptr %160, i64 12
  %166 = load i32, ptr %165, align 4, !tbaa !45
  %167 = getelementptr inbounds i8, ptr %45, i64 40
  store i32 %166, ptr %167, align 1, !tbaa !46
  %.pre = load ptr, ptr %18, align 8, !tbaa !5
  %.phi.trans.insert = getelementptr inbounds i8, ptr %.pre, i64 4
  %.pre189 = load i8, ptr %.phi.trans.insert, align 4, !tbaa !44
  br label %168

168:                                              ; preds = %164, %159
  %169 = phi i8 [ %.pre189, %164 ], [ %162, %159 ]
  %170 = phi ptr [ %.pre, %164 ], [ %160, %159 ]
  %171 = and i8 %169, 2
  %.not171 = icmp eq i8 %171, 0
  br i1 %.not171, label %176, label %172

172:                                              ; preds = %168
  %173 = getelementptr inbounds i8, ptr %170, i64 16
  %174 = load i32, ptr %173, align 4, !tbaa !47
  %175 = getelementptr inbounds i8, ptr %45, i64 44
  store i32 %174, ptr %175, align 1, !tbaa !46
  %.pre190 = load ptr, ptr %18, align 8, !tbaa !5
  %.phi.trans.insert191 = getelementptr inbounds i8, ptr %.pre190, i64 4
  %.pre192 = load i8, ptr %.phi.trans.insert191, align 4, !tbaa !44
  br label %176

176:                                              ; preds = %172, %168
  %177 = phi i8 [ %.pre192, %172 ], [ %169, %168 ]
  %178 = phi ptr [ %.pre190, %172 ], [ %170, %168 ]
  %179 = and i8 %177, 4
  %.not172 = icmp eq i8 %179, 0
  br i1 %.not172, label %184, label %180

180:                                              ; preds = %176
  %181 = getelementptr inbounds i8, ptr %178, i64 20
  %182 = load i32, ptr %181, align 4, !tbaa !48
  %183 = getelementptr inbounds i8, ptr %45, i64 48
  store i32 %182, ptr %183, align 1, !tbaa !46
  %.pre193 = load ptr, ptr %18, align 8, !tbaa !5
  %.phi.trans.insert194 = getelementptr inbounds i8, ptr %.pre193, i64 4
  %.pre195 = load i8, ptr %.phi.trans.insert194, align 4, !tbaa !44
  br label %184

184:                                              ; preds = %180, %176
  %185 = phi i8 [ %.pre195, %180 ], [ %177, %176 ]
  %186 = phi ptr [ %.pre193, %180 ], [ %178, %176 ]
  %187 = and i8 %185, 8
  %.not173 = icmp eq i8 %187, 0
  br i1 %.not173, label %192, label %188

188:                                              ; preds = %184
  %189 = getelementptr inbounds i8, ptr %186, i64 24
  %190 = load i32, ptr %189, align 4, !tbaa !49
  %191 = getelementptr inbounds i8, ptr %45, i64 52
  store i32 %190, ptr %191, align 1, !tbaa !46
  %.pre196 = load ptr, ptr %18, align 8, !tbaa !5
  %.phi.trans.insert197 = getelementptr inbounds i8, ptr %.pre196, i64 4
  %.pre198 = load i8, ptr %.phi.trans.insert197, align 4, !tbaa !44
  br label %192

192:                                              ; preds = %188, %184
  %193 = phi i8 [ %.pre198, %188 ], [ %185, %184 ]
  %194 = phi ptr [ %.pre196, %188 ], [ %186, %184 ]
  %195 = and i8 %193, 16
  %.not174 = icmp eq i8 %195, 0
  br i1 %.not174, label %200, label %196

196:                                              ; preds = %192
  %197 = getelementptr inbounds i8, ptr %194, i64 28
  %198 = load i32, ptr %197, align 4, !tbaa !50
  %199 = getelementptr inbounds i8, ptr %45, i64 56
  store i32 %198, ptr %199, align 1, !tbaa !46
  %.pre199 = load ptr, ptr %18, align 8, !tbaa !5
  %.phi.trans.insert200 = getelementptr inbounds i8, ptr %.pre199, i64 4
  %.pre201 = load i8, ptr %.phi.trans.insert200, align 4, !tbaa !44
  br label %200

200:                                              ; preds = %196, %192
  %201 = phi i8 [ %.pre201, %196 ], [ %193, %192 ]
  %202 = phi ptr [ %.pre199, %196 ], [ %194, %192 ]
  %203 = and i8 %201, 32
  %.not175 = icmp eq i8 %203, 0
  br i1 %.not175, label %208, label %204

204:                                              ; preds = %200
  %205 = getelementptr inbounds i8, ptr %202, i64 32
  %206 = load i32, ptr %205, align 4, !tbaa !51
  %207 = getelementptr inbounds i8, ptr %45, i64 60
  store i32 %206, ptr %207, align 1, !tbaa !46
  br label %208

208:                                              ; preds = %204, %200
  %209 = load i16, ptr %42, align 4, !tbaa !23
  %210 = xor i16 %209, 1
  store i16 %210, ptr %42, align 4, !tbaa !23
  %211 = call i32 @ReadUnaligned32(ptr noundef nonnull %42) #3
  store i32 %211, ptr %14, align 4, !tbaa !52
  %212 = getelementptr inbounds i8, ptr %35, i64 24
  %213 = load ptr, ptr %212, align 8, !tbaa !53
  %214 = zext i8 %36 to i32
  %215 = shl nuw nsw i32 %214, 1
  %216 = getelementptr inbounds i8, ptr %33, i64 242
  %217 = load i16, ptr %216, align 2
  %218 = and i16 %217, 15
  %narrow = add nuw nsw i16 %218, 2
  %219 = zext nneg i16 %narrow to i32
  %220 = shl nuw nsw i32 %215, %219
  %221 = add nuw nsw i32 %220, 4096
  %222 = zext nneg i32 %221 to i64
  %223 = call i64 %213(ptr noundef %35, i32 noundef 2, i8 noundef zeroext 0, i64 noundef %222, i64 noundef 1, ptr noundef nonnull %14) #3
  %224 = load ptr, ptr @gBS, align 8, !tbaa !21
  %225 = getelementptr inbounds i8, ptr %224, i64 80
  %226 = load ptr, ptr %225, align 8, !tbaa !54
  %227 = call i64 %226(i32 noundef -2147483648, i64 noundef 8, ptr noundef null, ptr noundef null, ptr noundef nonnull %6) #3
  %228 = icmp slt i64 %227, 0
  br i1 %228, label %278, label %229

229:                                              ; preds = %208
  %230 = load ptr, ptr @gBS, align 8, !tbaa !21
  %231 = getelementptr inbounds i8, ptr %230, i64 88
  %232 = load ptr, ptr %231, align 8, !tbaa !57
  %233 = load ptr, ptr %6, align 8, !tbaa !21
  %234 = load i64, ptr %3, align 8, !tbaa !58
  %235 = call i64 %232(ptr noundef %233, i32 noundef 2, i64 noundef %234) #3
  %236 = icmp slt i64 %235, 0
  %237 = getelementptr inbounds i8, ptr %3, i64 56
  br i1 %236, label %238, label %239

238:                                              ; preds = %229
  store i8 6, ptr %237, align 8, !tbaa !59
  br label %278

239:                                              ; preds = %229
  store i8 9, ptr %237, align 8, !tbaa !59
  %240 = getelementptr inbounds i8, ptr %53, i64 14
  %241 = getelementptr inbounds i8, ptr %33, i64 232
  %242 = getelementptr inbounds [2 x i8], ptr %241, i64 0, i64 %38
  br label %243

243:                                              ; preds = %250, %239
  %244 = load ptr, ptr @gBS, align 8, !tbaa !21
  %245 = getelementptr inbounds i8, ptr %244, i64 120
  %246 = load ptr, ptr %245, align 8, !tbaa !60
  %247 = load ptr, ptr %6, align 8, !tbaa !21
  %248 = call i64 %246(ptr noundef %247) #3
  %249 = icmp slt i64 %248, 0
  br i1 %249, label %250, label %.loopexit

250:                                              ; preds = %243
  %251 = load i16, ptr %240, align 1
  %252 = and i16 %251, 1
  %253 = load i8, ptr %242, align 1, !tbaa !46
  %254 = zext i8 %253 to i16
  %.not176 = icmp eq i16 %252, %254
  br i1 %.not176, label %243, label %255, !llvm.loop !61

255:                                              ; preds = %250
  store i8 0, ptr %237, align 8, !tbaa !59
  br label %.loopexit

.loopexit:                                        ; preds = %243, %255
  %.1139 = phi i64 [ 0, %255 ], [ -9223372036854775790, %243 ]
  %256 = load i16, ptr %50, align 4, !tbaa !23
  %257 = xor i16 %256, 1
  store i16 %257, ptr %50, align 4, !tbaa !23
  %258 = icmp eq i16 %256, 1
  br i1 %258, label %259, label %262

259:                                              ; preds = %.loopexit
  %260 = load i8, ptr %242, align 1, !tbaa !46
  %261 = xor i8 %260, 1
  store i8 %261, ptr %242, align 1, !tbaa !46
  br label %262

262:                                              ; preds = %259, %.loopexit
  %263 = load ptr, ptr %22, align 8, !tbaa !12
  %264 = call ptr @CopyMem(ptr noundef %263, ptr noundef %53, i64 noundef 16) #3
  %265 = call zeroext i8 @DebugCodeEnabled() #3
  %.not177 = icmp eq i8 %265, 0
  br i1 %.not177, label %267, label %266

266:                                              ; preds = %262
  call void @NvmeDumpStatus(ptr noundef %53)
  br label %267

267:                                              ; preds = %266, %262
  %268 = call i32 @ReadUnaligned32(ptr noundef nonnull %50) #3
  store i32 %268, ptr %14, align 4, !tbaa !52
  %269 = load ptr, ptr %212, align 8, !tbaa !53
  %270 = or disjoint i32 %215, 1
  %271 = load i16, ptr %216, align 2
  %272 = and i16 %271, 15
  %narrow178 = add nuw nsw i16 %272, 2
  %273 = zext nneg i16 %narrow178 to i32
  %274 = shl nuw nsw i32 %270, %273
  %275 = add nuw nsw i32 %274, 4096
  %276 = zext nneg i32 %275 to i64
  %277 = call i64 %269(ptr noundef %35, i32 noundef 2, i8 noundef zeroext 0, i64 noundef %276, i64 noundef 1, ptr noundef nonnull %14) #3
  br label %278

278:                                              ; preds = %208, %140, %267, %238
  %.2 = phi i64 [ %.0138, %140 ], [ %227, %208 ], [ %235, %238 ], [ %.1139, %267 ]
  %.1 = phi ptr [ null, %140 ], [ %.0136, %208 ], [ %.0136, %238 ], [ %.0136, %267 ]
  %279 = load ptr, ptr %8, align 8, !tbaa !21
  %.not179 = icmp eq ptr %279, null
  br i1 %.not179, label %284, label %280

280:                                              ; preds = %278
  %281 = getelementptr inbounds i8, ptr %35, i64 80
  %282 = load ptr, ptr %281, align 8, !tbaa !42
  %283 = call i64 %282(ptr noundef %35, ptr noundef nonnull %279) #3
  br label %284

284:                                              ; preds = %280, %278
  %285 = load ptr, ptr %9, align 8, !tbaa !21
  %.not180 = icmp eq ptr %285, null
  br i1 %.not180, label %290, label %286

286:                                              ; preds = %284
  %287 = getelementptr inbounds i8, ptr %35, i64 80
  %288 = load ptr, ptr %287, align 8, !tbaa !42
  %289 = call i64 %288(ptr noundef %35, ptr noundef nonnull %285) #3
  br label %290

290:                                              ; preds = %286, %284
  %291 = load ptr, ptr %10, align 8, !tbaa !21
  %.not181 = icmp eq ptr %291, null
  br i1 %.not181, label %296, label %292

292:                                              ; preds = %290
  %293 = getelementptr inbounds i8, ptr %35, i64 80
  %294 = load ptr, ptr %293, align 8, !tbaa !42
  %295 = call i64 %294(ptr noundef %35, ptr noundef nonnull %291) #3
  br label %296

296:                                              ; preds = %292, %290
  %.not182 = icmp eq ptr %.1, null
  br i1 %.not182, label %303, label %297

297:                                              ; preds = %296
  %298 = getelementptr inbounds i8, ptr %35, i64 96
  %299 = load ptr, ptr %298, align 8, !tbaa !63
  %300 = load i64, ptr %13, align 8, !tbaa !22
  %301 = load ptr, ptr %12, align 8, !tbaa !21
  %302 = call i64 %299(ptr noundef %35, i64 noundef %300, ptr noundef %301) #3
  br label %303

303:                                              ; preds = %297, %296
  %304 = load ptr, ptr %6, align 8, !tbaa !21
  %.not183 = icmp eq ptr %304, null
  br i1 %.not183, label %310, label %305

305:                                              ; preds = %303
  %306 = load ptr, ptr @gBS, align 8, !tbaa !21
  %307 = getelementptr inbounds i8, ptr %306, i64 112
  %308 = load ptr, ptr %307, align 8, !tbaa !64
  %309 = call i64 %308(ptr noundef nonnull %304) #3
  br label %310

310:                                              ; preds = %25, %303, %305, %95, %104, %81, %85, %83, %._crit_edge, %17, %21, %5, %124
  %.0 = phi i64 [ -9223372036854775799, %124 ], [ -9223372036854775806, %5 ], [ -9223372036854775806, %21 ], [ -9223372036854775806, %17 ], [ -9223372036854775806, %25 ], [ -9223372036854775806, %._crit_edge ], [ -9223372036854775805, %83 ], [ -9223372036854775805, %85 ], [ -9223372036854775805, %81 ], [ -9223372036854775799, %104 ], [ -9223372036854775799, %95 ], [ %.2, %305 ], [ %.2, %303 ]
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %7) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %6) #3
  ret i64 %.0
}

declare zeroext i8 @DebugAssertEnabled() local_unnamed_addr #1

declare void @DebugAssert(ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #1

declare i32 @ReadUnaligned32(ptr noundef) local_unnamed_addr #1

declare ptr @CopyMem(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #1

declare zeroext i8 @DebugCodeEnabled() local_unnamed_addr #1

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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, !10, i64 40}
!6 = !{!"", !7, i64 0, !10, i64 8, !11, i64 16, !10, i64 24, !11, i64 32, !8, i64 36, !10, i64 40, !10, i64 48, !8, i64 56}
!7 = !{!"long long", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"int", !8, i64 0}
!12 = !{!6, !10, i64 48}
!13 = !{!6, !8, i64 36}
!14 = !{!15, !11, i64 0}
!15 = !{!"_NVME_CONTROLLER_PRIVATE_DATA", !11, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !7, i64 40, !10, i64 48, !16, i64 56, !17, i64 88, !10, i64 128, !10, i64 136, !10, i64 144, !8, i64 152, !8, i64 168, !8, i64 184, !8, i64 200, !8, i64 216, !8, i64 224, !8, i64 232, !8, i64 234, !18, i64 238, !10, i64 248}
!16 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !7, i64 16, !11, i64 24}
!17 = !{!"_NVM_EXPRESS_PASS_THRU_PROTOCOL", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32}
!18 = !{!"", !19, i64 0, !8, i64 2, !8, i64 2, !8, i64 2, !8, i64 3, !19, i64 4, !19, i64 4, !19, i64 4, !19, i64 5, !8, i64 6, !8, i64 6, !8, i64 7}
!19 = !{!"short", !8, i64 0}
!20 = !{!15, !10, i64 32}
!21 = !{!10, !10, i64 0}
!22 = !{!7, !7, i64 0}
!23 = !{!24, !19, i64 0}
!24 = !{!"", !19, i64 0, !19, i64 2}
!25 = !{!26, !11, i64 8}
!26 = !{!"", !27, i64 0, !8, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32}
!27 = !{!"", !8, i64 0, !8, i64 1, !19, i64 2}
!28 = !{!26, !8, i64 0}
!29 = !{!30, !8, i64 0}
!30 = !{!"", !8, i64 0, !8, i64 1, !8, i64 1, !8, i64 1, !19, i64 2, !11, i64 4, !7, i64 8, !7, i64 16, !8, i64 24, !8, i64 40}
!31 = !{!26, !8, i64 1}
!32 = !{!26, !19, i64 2}
!33 = !{!30, !19, i64 2}
!34 = !{!30, !11, i64 4}
!35 = !{!6, !10, i64 8}
!36 = !{!6, !11, i64 16}
!37 = !{!38, !10, i64 72}
!38 = !{!"_EFI_PCI_IO_PROTOCOL", !10, i64 0, !10, i64 8, !39, i64 16, !39, i64 32, !39, i64 48, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128, !10, i64 136, !7, i64 144, !10, i64 152}
!39 = !{!"", !10, i64 0, !10, i64 8}
!40 = !{!6, !11, i64 32}
!41 = !{!6, !10, i64 24}
!42 = !{!38, !10, i64 80}
!43 = !{!30, !7, i64 16}
!44 = !{!26, !8, i64 4}
!45 = !{!26, !11, i64 12}
!46 = !{!8, !8, i64 0}
!47 = !{!26, !11, i64 16}
!48 = !{!26, !11, i64 20}
!49 = !{!26, !11, i64 24}
!50 = !{!26, !11, i64 28}
!51 = !{!26, !11, i64 32}
!52 = !{!11, !11, i64 0}
!53 = !{!38, !10, i64 24}
!54 = !{!55, !10, i64 80}
!55 = !{!"", !56, i64 0, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128, !10, i64 136, !10, i64 144, !10, i64 152, !10, i64 160, !10, i64 168, !10, i64 176, !10, i64 184, !10, i64 192, !10, i64 200, !10, i64 208, !10, i64 216, !10, i64 224, !10, i64 232, !10, i64 240, !10, i64 248, !10, i64 256, !10, i64 264, !10, i64 272, !10, i64 280, !10, i64 288, !10, i64 296, !10, i64 304, !10, i64 312, !10, i64 320, !10, i64 328, !10, i64 336, !10, i64 344, !10, i64 352, !10, i64 360, !10, i64 368}
!56 = !{!"", !7, i64 0, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20}
!57 = !{!55, !10, i64 88}
!58 = !{!6, !7, i64 0}
!59 = !{!6, !8, i64 56}
!60 = !{!55, !10, i64 120}
!61 = distinct !{!61, !62}
!62 = !{!"llvm.loop.mustprogress"}
!63 = !{!38, !10, i64 96}
!64 = !{!55, !10, i64 112}


; Effective O3 passes: BDCEPass,CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass