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

; 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.NVME_AQA = type { i32 }
%struct.NVME_ASQ = type { i64 }
%struct.NVME_ACQ = type { i64 }
%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._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_ADMIN_CONTROLLER_DATA = type { i16, i16, [20 x i8], [40 x i8], [8 x i8], i8, [3 x i8], i8, i8, [2 x i8], [176 x i8], i16, i8, i8, i8, i8, i8, i8, i8, i8, [246 x i8], i8, i8, i16, i32, i16, i16, i8, i8, i16, i16, i8, i8, i16, i16, i32, [164 x i8], [1344 x i8], [32 x %struct.NVME_PSDESCRIPTOR], [1024 x i8] }
%struct.NVME_PSDESCRIPTOR = type { i16, i8, i8, i32, i32, i32, [16 x i8] }

@.str.13 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [69 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [152 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [22 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local i64 @ReadNvmeControllerCapabilities(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) #1

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

declare zeroext i8 @DebugPrintEnabled() #2

declare zeroext i8 @DebugPrintLevelEnabled(i64 noundef) #2

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

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

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

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

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

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i64 @NvmeControllerInit(ptr noundef %0) #0 {
  %2 = alloca i64, align 8
  %3 = alloca ptr, align 8
  %4 = alloca i64, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i64, align 8
  %7 = alloca %struct.NVME_AQA, align 1
  %8 = alloca %struct.NVME_ASQ, align 1
  %9 = alloca %struct.NVME_ACQ, align 1
  %10 = alloca i32, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #3
  %11 = load ptr, ptr %3, align 8, !tbaa !5
  %12 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %11, i32 0, i32 4
  %13 = load ptr, ptr %12, align 8, !tbaa !9
  store ptr %13, ptr %5, align 8, !tbaa !5
  %14 = load ptr, ptr %5, align 8, !tbaa !5
  %15 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %14, i32 0, i32 12
  %16 = load ptr, ptr %15, align 8, !tbaa !17
  %17 = load ptr, ptr %5, align 8, !tbaa !5
  %18 = load ptr, ptr %3, align 8, !tbaa !5
  %19 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %18, i32 0, i32 5
  %20 = call i64 %16(ptr noundef %17, i32 noundef 0, i64 noundef 0, ptr noundef %19)
  store i64 %20, ptr %4, align 8, !tbaa !20
  %21 = load i64, ptr %4, align 8, !tbaa !20
  %22 = icmp slt i64 %21, 0
  br i1 %22, label %23, label %25

23:                                               ; preds = %1
  %24 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %24, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

25:                                               ; preds = %1
  %26 = load ptr, ptr %5, align 8, !tbaa !5
  %27 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %26, i32 0, i32 12
  %28 = load ptr, ptr %27, align 8, !tbaa !17
  %29 = load ptr, ptr %5, align 8, !tbaa !5
  %30 = call i64 %28(ptr noundef %29, i32 noundef 4, i64 noundef 0, ptr noundef %6)
  store i64 %30, ptr %4, align 8, !tbaa !20
  %31 = load i64, ptr %4, align 8, !tbaa !20
  %32 = icmp slt i64 %31, 0
  br i1 %32, label %42, label %33

33:                                               ; preds = %25
  %34 = load i64, ptr %6, align 8, !tbaa !20
  %35 = and i64 %34, 1792
  store i64 %35, ptr %6, align 8, !tbaa !20
  %36 = load ptr, ptr %5, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct._EFI_PCI_IO_PROTOCOL, ptr %36, i32 0, i32 12
  %38 = load ptr, ptr %37, align 8, !tbaa !17
  %39 = load ptr, ptr %5, align 8, !tbaa !5
  %40 = load i64, ptr %6, align 8, !tbaa !20
  %41 = call i64 %38(ptr noundef %39, i32 noundef 2, i64 noundef %40, ptr noundef null)
  store i64 %41, ptr %4, align 8, !tbaa !20
  br label %42

42:                                               ; preds = %33, %25
  %43 = load i64, ptr %4, align 8, !tbaa !20
  %44 = icmp slt i64 %43, 0
  br i1 %44, label %45, label %61

45:                                               ; preds = %42
  br label %46

46:                                               ; preds = %45
  %47 = call zeroext i8 @DebugPrintEnabled()
  %48 = icmp ne i8 %47, 0
  br i1 %48, label %49, label %57

49:                                               ; preds = %46
  br label %50

50:                                               ; preds = %49
  %51 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %52 = icmp ne i8 %51, 0
  br i1 %52, label %53, label %54

53:                                               ; preds = %50
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.13)
  br label %54

54:                                               ; preds = %53, %50
  br label %55

55:                                               ; preds = %54
  br label %56

56:                                               ; preds = %55
  br label %57

57:                                               ; preds = %56, %46
  br label %58

58:                                               ; preds = %57
  br label %59

59:                                               ; preds = %58
  %60 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %60, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

61:                                               ; preds = %42
  %62 = load ptr, ptr %3, align 8, !tbaa !5
  %63 = load ptr, ptr %3, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %63, i32 0, i32 20
  %65 = call i64 @ReadNvmeControllerCapabilities(ptr noundef %62, ptr noundef %64)
  store i64 %65, ptr %4, align 8, !tbaa !20
  %66 = load i64, ptr %4, align 8, !tbaa !20
  %67 = icmp slt i64 %66, 0
  br i1 %67, label %68, label %70

68:                                               ; preds = %61
  %69 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %69, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

70:                                               ; preds = %61
  %71 = load ptr, ptr %3, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %71, i32 0, i32 20
  %73 = getelementptr inbounds %struct.NVME_CAP, ptr %72, i32 0, i32 3
  %74 = load i16, ptr %73, align 2
  %75 = lshr i16 %74, 5
  %76 = and i16 %75, 15
  %77 = zext i16 %76 to i32
  %78 = icmp ne i32 %77, 1
  br i1 %78, label %79, label %94

79:                                               ; preds = %70
  br label %80

80:                                               ; preds = %79
  %81 = call zeroext i8 @DebugPrintEnabled()
  %82 = icmp ne i8 %81, 0
  br i1 %82, label %83, label %91

83:                                               ; preds = %80
  br label %84

84:                                               ; preds = %83
  %85 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %86 = icmp ne i8 %85, 0
  br i1 %86, label %87, label %88

87:                                               ; preds = %84
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.14)
  br label %88

88:                                               ; preds = %87, %84
  br label %89

89:                                               ; preds = %88
  br label %90

90:                                               ; preds = %89
  br label %91

91:                                               ; preds = %90, %80
  br label %92

92:                                               ; preds = %91
  br label %93

93:                                               ; preds = %92
  store i64 -9223372036854775805, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

94:                                               ; preds = %70
  br label %95

95:                                               ; preds = %94
  %96 = call zeroext i8 @DebugAssertEnabled()
  %97 = icmp ne i8 %96, 0
  br i1 %97, label %98, label %109

98:                                               ; preds = %95
  %99 = load ptr, ptr %3, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %99, i32 0, i32 20
  %101 = getelementptr inbounds %struct.NVME_CAP, ptr %100, i32 0, i32 4
  %102 = load i8, ptr %101, align 2
  %103 = and i8 %102, 15
  %104 = zext i8 %103 to i32
  %105 = add nsw i32 %104, 12
  %106 = icmp sle i32 %105, 12
  br i1 %106, label %108, label %107

107:                                              ; preds = %98
  call void @DebugAssert(ptr noundef @.str.15, i64 noundef 849, ptr noundef @.str.16)
  br label %108

108:                                              ; preds = %107, %98
  br label %109

109:                                              ; preds = %108, %95
  br label %110

110:                                              ; preds = %109
  br label %111

111:                                              ; preds = %110
  %112 = load ptr, ptr %3, align 8, !tbaa !5
  %113 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %112, i32 0, i32 19
  %114 = getelementptr inbounds [2 x i16], ptr %113, i64 0, i64 0
  store i16 0, ptr %114, align 2, !tbaa !21
  %115 = load ptr, ptr %3, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %115, i32 0, i32 19
  %117 = getelementptr inbounds [2 x i16], ptr %116, i64 0, i64 1
  store i16 0, ptr %117, align 2, !tbaa !21
  %118 = load ptr, ptr %3, align 8, !tbaa !5
  %119 = call i64 @NvmeDisableController(ptr noundef %118)
  store i64 %119, ptr %4, align 8, !tbaa !20
  %120 = load i64, ptr %4, align 8, !tbaa !20
  %121 = icmp slt i64 %120, 0
  br i1 %121, label %122, label %124

122:                                              ; preds = %111
  %123 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %123, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

124:                                              ; preds = %111
  %125 = load i32, ptr %7, align 1
  %126 = and i32 %125, -4096
  %127 = or i32 %126, 1
  store i32 %127, ptr %7, align 1
  %128 = load i32, ptr %7, align 1
  %129 = and i32 %128, -61441
  %130 = or i32 %129, 0
  store i32 %130, ptr %7, align 1
  %131 = load i32, ptr %7, align 1
  %132 = and i32 %131, -268369921
  %133 = or i32 %132, 65536
  store i32 %133, ptr %7, align 1
  %134 = load i32, ptr %7, align 1
  %135 = and i32 %134, 268435455
  %136 = or i32 %135, 0
  store i32 %136, ptr %7, align 1
  %137 = load i64, ptr %8, align 1
  %138 = and i64 %137, -4096
  %139 = or i64 %138, 0
  store i64 %139, ptr %8, align 1
  %140 = load ptr, ptr %3, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %140, i32 0, i32 11
  %142 = load ptr, ptr %141, align 8, !tbaa !22
  %143 = ptrtoint ptr %142 to i64
  %144 = lshr i64 %143, 12
  %145 = load i64, ptr %8, align 1
  %146 = and i64 %144, 4503599627370495
  %147 = shl i64 %146, 12
  %148 = and i64 %145, 4095
  %149 = or i64 %148, %147
  store i64 %149, ptr %8, align 1
  %150 = load i64, ptr %9, align 1
  %151 = and i64 %150, -4096
  %152 = or i64 %151, 0
  store i64 %152, ptr %9, align 1
  %153 = load ptr, ptr %3, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %153, i32 0, i32 11
  %155 = load ptr, ptr %154, align 8, !tbaa !22
  %156 = getelementptr inbounds i8, ptr %155, i64 4096
  %157 = ptrtoint ptr %156 to i64
  %158 = lshr i64 %157, 12
  %159 = load i64, ptr %9, align 1
  %160 = and i64 %158, 4503599627370495
  %161 = shl i64 %160, 12
  %162 = and i64 %159, 4095
  %163 = or i64 %162, %161
  store i64 %163, ptr %9, align 1
  %164 = load ptr, ptr %3, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %164, i32 0, i32 10
  %166 = load ptr, ptr %165, align 8, !tbaa !23
  %167 = ptrtoint ptr %166 to i64
  %168 = inttoptr i64 %167 to ptr
  %169 = load ptr, ptr %3, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %169, i32 0, i32 12
  %171 = getelementptr inbounds [2 x ptr], ptr %170, i64 0, i64 0
  store ptr %168, ptr %171, align 8, !tbaa !5
  %172 = load ptr, ptr %3, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %172, i32 0, i32 11
  %174 = load ptr, ptr %173, align 8, !tbaa !22
  %175 = ptrtoint ptr %174 to i64
  %176 = inttoptr i64 %175 to ptr
  %177 = load ptr, ptr %3, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %177, i32 0, i32 14
  %179 = getelementptr inbounds [2 x ptr], ptr %178, i64 0, i64 0
  store ptr %176, ptr %179, align 8, !tbaa !5
  %180 = load ptr, ptr %3, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %180, i32 0, i32 10
  %182 = load ptr, ptr %181, align 8, !tbaa !23
  %183 = getelementptr inbounds i8, ptr %182, i64 4096
  %184 = ptrtoint ptr %183 to i64
  %185 = inttoptr i64 %184 to ptr
  %186 = load ptr, ptr %3, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %186, i32 0, i32 13
  %188 = getelementptr inbounds [2 x ptr], ptr %187, i64 0, i64 0
  store ptr %185, ptr %188, align 8, !tbaa !5
  %189 = load ptr, ptr %3, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %189, i32 0, i32 11
  %191 = load ptr, ptr %190, align 8, !tbaa !22
  %192 = getelementptr inbounds i8, ptr %191, i64 4096
  %193 = ptrtoint ptr %192 to i64
  %194 = inttoptr i64 %193 to ptr
  %195 = load ptr, ptr %3, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %195, i32 0, i32 15
  %197 = getelementptr inbounds [2 x ptr], ptr %196, i64 0, i64 0
  store ptr %194, ptr %197, align 8, !tbaa !5
  %198 = load ptr, ptr %3, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %198, i32 0, i32 10
  %200 = load ptr, ptr %199, align 8, !tbaa !23
  %201 = getelementptr inbounds i8, ptr %200, i64 8192
  %202 = ptrtoint ptr %201 to i64
  %203 = inttoptr i64 %202 to ptr
  %204 = load ptr, ptr %3, align 8, !tbaa !5
  %205 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %204, i32 0, i32 12
  %206 = getelementptr inbounds [2 x ptr], ptr %205, i64 0, i64 1
  store ptr %203, ptr %206, align 8, !tbaa !5
  %207 = load ptr, ptr %3, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %207, i32 0, i32 11
  %209 = load ptr, ptr %208, align 8, !tbaa !22
  %210 = getelementptr inbounds i8, ptr %209, i64 8192
  %211 = ptrtoint ptr %210 to i64
  %212 = inttoptr i64 %211 to ptr
  %213 = load ptr, ptr %3, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %213, i32 0, i32 14
  %215 = getelementptr inbounds [2 x ptr], ptr %214, i64 0, i64 1
  store ptr %212, ptr %215, align 8, !tbaa !5
  %216 = load ptr, ptr %3, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %216, i32 0, i32 10
  %218 = load ptr, ptr %217, align 8, !tbaa !23
  %219 = getelementptr inbounds i8, ptr %218, i64 12288
  %220 = ptrtoint ptr %219 to i64
  %221 = inttoptr i64 %220 to ptr
  %222 = load ptr, ptr %3, align 8, !tbaa !5
  %223 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %222, i32 0, i32 13
  %224 = getelementptr inbounds [2 x ptr], ptr %223, i64 0, i64 1
  store ptr %221, ptr %224, align 8, !tbaa !5
  %225 = load ptr, ptr %3, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %225, i32 0, i32 11
  %227 = load ptr, ptr %226, align 8, !tbaa !22
  %228 = getelementptr inbounds i8, ptr %227, i64 12288
  %229 = ptrtoint ptr %228 to i64
  %230 = inttoptr i64 %229 to ptr
  %231 = load ptr, ptr %3, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %231, i32 0, i32 15
  %233 = getelementptr inbounds [2 x ptr], ptr %232, i64 0, i64 1
  store ptr %230, ptr %233, align 8, !tbaa !5
  br label %234

234:                                              ; preds = %124
  %235 = call zeroext i8 @DebugPrintEnabled()
  %236 = icmp ne i8 %235, 0
  br i1 %236, label %237, label %249

237:                                              ; preds = %234
  br label %238

238:                                              ; preds = %237
  %239 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %240 = icmp ne i8 %239, 0
  br i1 %240, label %241, label %246

241:                                              ; preds = %238
  %242 = load ptr, ptr %3, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %242, i32 0, i32 10
  %244 = load ptr, ptr %243, align 8, !tbaa !23
  %245 = ptrtoint ptr %244 to i64
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.17, i64 noundef %245)
  br label %246

246:                                              ; preds = %241, %238
  br label %247

247:                                              ; preds = %246
  br label %248

248:                                              ; preds = %247
  br label %249

249:                                              ; preds = %248, %234
  br label %250

250:                                              ; preds = %249
  br label %251

251:                                              ; preds = %250
  br label %252

252:                                              ; preds = %251
  %253 = call zeroext i8 @DebugPrintEnabled()
  %254 = icmp ne i8 %253, 0
  br i1 %254, label %255, label %267

255:                                              ; preds = %252
  br label %256

256:                                              ; preds = %255
  %257 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %258 = icmp ne i8 %257, 0
  br i1 %258, label %259, label %264

259:                                              ; preds = %256
  %260 = load i32, ptr %7, align 1
  %261 = and i32 %260, 4095
  %262 = trunc i32 %261 to i16
  %263 = zext i16 %262 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.18, i32 noundef %263)
  br label %264

264:                                              ; preds = %259, %256
  br label %265

265:                                              ; preds = %264
  br label %266

266:                                              ; preds = %265
  br label %267

267:                                              ; preds = %266, %252
  br label %268

268:                                              ; preds = %267
  br label %269

269:                                              ; preds = %268
  br label %270

270:                                              ; preds = %269
  %271 = call zeroext i8 @DebugPrintEnabled()
  %272 = icmp ne i8 %271, 0
  br i1 %272, label %273, label %286

273:                                              ; preds = %270
  br label %274

274:                                              ; preds = %273
  %275 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %276 = icmp ne i8 %275, 0
  br i1 %276, label %277, label %283

277:                                              ; preds = %274
  %278 = load i32, ptr %7, align 1
  %279 = lshr i32 %278, 16
  %280 = and i32 %279, 4095
  %281 = trunc i32 %280 to i16
  %282 = zext i16 %281 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.19, i32 noundef %282)
  br label %283

283:                                              ; preds = %277, %274
  br label %284

284:                                              ; preds = %283
  br label %285

285:                                              ; preds = %284
  br label %286

286:                                              ; preds = %285, %270
  br label %287

287:                                              ; preds = %286
  br label %288

288:                                              ; preds = %287
  br label %289

289:                                              ; preds = %288
  %290 = call zeroext i8 @DebugPrintEnabled()
  %291 = icmp ne i8 %290, 0
  br i1 %291, label %292, label %304

292:                                              ; preds = %289
  br label %293

293:                                              ; preds = %292
  %294 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %295 = icmp ne i8 %294, 0
  br i1 %295, label %296, label %301

296:                                              ; preds = %293
  %297 = load ptr, ptr %3, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %297, i32 0, i32 12
  %299 = getelementptr inbounds [2 x ptr], ptr %298, i64 0, i64 0
  %300 = load ptr, ptr %299, align 8, !tbaa !5
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.20, ptr noundef %300)
  br label %301

301:                                              ; preds = %296, %293
  br label %302

302:                                              ; preds = %301
  br label %303

303:                                              ; preds = %302
  br label %304

304:                                              ; preds = %303, %289
  br label %305

305:                                              ; preds = %304
  br label %306

306:                                              ; preds = %305
  br label %307

307:                                              ; preds = %306
  %308 = call zeroext i8 @DebugPrintEnabled()
  %309 = icmp ne i8 %308, 0
  br i1 %309, label %310, label %322

310:                                              ; preds = %307
  br label %311

311:                                              ; preds = %310
  %312 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %313 = icmp ne i8 %312, 0
  br i1 %313, label %314, label %319

314:                                              ; preds = %311
  %315 = load ptr, ptr %3, align 8, !tbaa !5
  %316 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %315, i32 0, i32 13
  %317 = getelementptr inbounds [2 x ptr], ptr %316, i64 0, i64 0
  %318 = load ptr, ptr %317, align 8, !tbaa !5
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.21, ptr noundef %318)
  br label %319

319:                                              ; preds = %314, %311
  br label %320

320:                                              ; preds = %319
  br label %321

321:                                              ; preds = %320
  br label %322

322:                                              ; preds = %321, %307
  br label %323

323:                                              ; preds = %322
  br label %324

324:                                              ; preds = %323
  br label %325

325:                                              ; preds = %324
  %326 = call zeroext i8 @DebugPrintEnabled()
  %327 = icmp ne i8 %326, 0
  br i1 %327, label %328, label %340

328:                                              ; preds = %325
  br label %329

329:                                              ; preds = %328
  %330 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %331 = icmp ne i8 %330, 0
  br i1 %331, label %332, label %337

332:                                              ; preds = %329
  %333 = load ptr, ptr %3, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %333, i32 0, i32 12
  %335 = getelementptr inbounds [2 x ptr], ptr %334, i64 0, i64 1
  %336 = load ptr, ptr %335, align 8, !tbaa !5
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.22, ptr noundef %336)
  br label %337

337:                                              ; preds = %332, %329
  br label %338

338:                                              ; preds = %337
  br label %339

339:                                              ; preds = %338
  br label %340

340:                                              ; preds = %339, %325
  br label %341

341:                                              ; preds = %340
  br label %342

342:                                              ; preds = %341
  br label %343

343:                                              ; preds = %342
  %344 = call zeroext i8 @DebugPrintEnabled()
  %345 = icmp ne i8 %344, 0
  br i1 %345, label %346, label %358

346:                                              ; preds = %343
  br label %347

347:                                              ; preds = %346
  %348 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %349 = icmp ne i8 %348, 0
  br i1 %349, label %350, label %355

350:                                              ; preds = %347
  %351 = load ptr, ptr %3, align 8, !tbaa !5
  %352 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %351, i32 0, i32 13
  %353 = getelementptr inbounds [2 x ptr], ptr %352, i64 0, i64 1
  %354 = load ptr, ptr %353, align 8, !tbaa !5
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.23, ptr noundef %354)
  br label %355

355:                                              ; preds = %350, %347
  br label %356

356:                                              ; preds = %355
  br label %357

357:                                              ; preds = %356
  br label %358

358:                                              ; preds = %357, %343
  br label %359

359:                                              ; preds = %358
  br label %360

360:                                              ; preds = %359
  %361 = load ptr, ptr %3, align 8, !tbaa !5
  %362 = call i64 @WriteNvmeAdminQueueAttributes(ptr noundef %361, ptr noundef %7)
  store i64 %362, ptr %4, align 8, !tbaa !20
  %363 = load i64, ptr %4, align 8, !tbaa !20
  %364 = icmp slt i64 %363, 0
  br i1 %364, label %365, label %367

365:                                              ; preds = %360
  %366 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %366, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

367:                                              ; preds = %360
  %368 = load ptr, ptr %3, align 8, !tbaa !5
  %369 = call i64 @WriteNvmeAdminSubmissionQueueBaseAddress(ptr noundef %368, ptr noundef %8)
  store i64 %369, ptr %4, align 8, !tbaa !20
  %370 = load i64, ptr %4, align 8, !tbaa !20
  %371 = icmp slt i64 %370, 0
  br i1 %371, label %372, label %374

372:                                              ; preds = %367
  %373 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %373, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

374:                                              ; preds = %367
  %375 = load ptr, ptr %3, align 8, !tbaa !5
  %376 = call i64 @WriteNvmeAdminCompletionQueueBaseAddress(ptr noundef %375, ptr noundef %9)
  store i64 %376, ptr %4, align 8, !tbaa !20
  %377 = load i64, ptr %4, align 8, !tbaa !20
  %378 = icmp slt i64 %377, 0
  br i1 %378, label %379, label %381

379:                                              ; preds = %374
  %380 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %380, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

381:                                              ; preds = %374
  %382 = load ptr, ptr %3, align 8, !tbaa !5
  %383 = call i64 @NvmeEnableController(ptr noundef %382)
  store i64 %383, ptr %4, align 8, !tbaa !20
  %384 = load i64, ptr %4, align 8, !tbaa !20
  %385 = icmp slt i64 %384, 0
  br i1 %385, label %386, label %388

386:                                              ; preds = %381
  %387 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %387, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

388:                                              ; preds = %381
  %389 = load ptr, ptr %3, align 8, !tbaa !5
  %390 = call i64 @NvmeCreateIoCompletionQueue(ptr noundef %389)
  store i64 %390, ptr %4, align 8, !tbaa !20
  %391 = load i64, ptr %4, align 8, !tbaa !20
  %392 = icmp slt i64 %391, 0
  br i1 %392, label %393, label %395

393:                                              ; preds = %388
  %394 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %394, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

395:                                              ; preds = %388
  %396 = load ptr, ptr %3, align 8, !tbaa !5
  %397 = call i64 @NvmeCreateIoSubmissionQueue(ptr noundef %396)
  store i64 %397, ptr %4, align 8, !tbaa !20
  %398 = load i64, ptr %4, align 8, !tbaa !20
  %399 = icmp slt i64 %398, 0
  br i1 %399, label %400, label %402

400:                                              ; preds = %395
  %401 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %401, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

402:                                              ; preds = %395
  %403 = call ptr @AllocateZeroPool(i64 noundef 4096)
  %404 = load ptr, ptr %3, align 8, !tbaa !5
  %405 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %404, i32 0, i32 9
  store ptr %403, ptr %405, align 8, !tbaa !24
  %406 = load ptr, ptr %3, align 8, !tbaa !5
  %407 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %406, i32 0, i32 9
  %408 = load ptr, ptr %407, align 8, !tbaa !24
  %409 = icmp eq ptr %408, null
  br i1 %409, label %410, label %411

410:                                              ; preds = %402
  store i64 -9223372036854775799, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

411:                                              ; preds = %402
  %412 = load ptr, ptr %3, align 8, !tbaa !5
  %413 = load ptr, ptr %3, align 8, !tbaa !5
  %414 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %413, i32 0, i32 9
  %415 = load ptr, ptr %414, align 8, !tbaa !24
  %416 = call i64 @NvmeIdentifyController(ptr noundef %412, ptr noundef %415)
  store i64 %416, ptr %4, align 8, !tbaa !20
  %417 = load i64, ptr %4, align 8, !tbaa !20
  %418 = icmp slt i64 %417, 0
  br i1 %418, label %419, label %425

419:                                              ; preds = %411
  %420 = load ptr, ptr %3, align 8, !tbaa !5
  %421 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %420, i32 0, i32 9
  %422 = load ptr, ptr %421, align 8, !tbaa !24
  call void @FreePool(ptr noundef %422)
  %423 = load ptr, ptr %3, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %423, i32 0, i32 9
  store ptr null, ptr %424, align 8, !tbaa !24
  store i64 -9223372036854775794, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

425:                                              ; preds = %411
  %426 = load ptr, ptr %3, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %426, i32 0, i32 9
  %428 = load ptr, ptr %427, align 8, !tbaa !24
  %429 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %428, i32 0, i32 2
  %430 = getelementptr inbounds [20 x i8], ptr %429, i64 0, i64 19
  store i8 0, ptr %430, align 1, !tbaa !25
  %431 = load ptr, ptr %3, align 8, !tbaa !5
  %432 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %431, i32 0, i32 9
  %433 = load ptr, ptr %432, align 8, !tbaa !24
  %434 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %433, i32 0, i32 3
  %435 = getelementptr inbounds [40 x i8], ptr %434, i64 0, i64 39
  store i8 0, ptr %435, align 1, !tbaa !25
  br label %436

436:                                              ; preds = %425
  %437 = call zeroext i8 @DebugPrintEnabled()
  %438 = icmp ne i8 %437, 0
  br i1 %438, label %439, label %447

439:                                              ; preds = %436
  br label %440

440:                                              ; preds = %439
  %441 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %442 = icmp ne i8 %441, 0
  br i1 %442, label %443, label %444

443:                                              ; preds = %440
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.24)
  br label %444

444:                                              ; preds = %443, %440
  br label %445

445:                                              ; preds = %444
  br label %446

446:                                              ; preds = %445
  br label %447

447:                                              ; preds = %446, %436
  br label %448

448:                                              ; preds = %447
  br label %449

449:                                              ; preds = %448
  br label %450

450:                                              ; preds = %449
  %451 = call zeroext i8 @DebugPrintEnabled()
  %452 = icmp ne i8 %451, 0
  br i1 %452, label %453, label %467

453:                                              ; preds = %450
  br label %454

454:                                              ; preds = %453
  %455 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %456 = icmp ne i8 %455, 0
  br i1 %456, label %457, label %464

457:                                              ; preds = %454
  %458 = load ptr, ptr %3, align 8, !tbaa !5
  %459 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %458, i32 0, i32 9
  %460 = load ptr, ptr %459, align 8, !tbaa !24
  %461 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %460, i32 0, i32 0
  %462 = load i16, ptr %461, align 1, !tbaa !26
  %463 = zext i16 %462 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.25, i32 noundef %463)
  br label %464

464:                                              ; preds = %457, %454
  br label %465

465:                                              ; preds = %464
  br label %466

466:                                              ; preds = %465
  br label %467

467:                                              ; preds = %466, %450
  br label %468

468:                                              ; preds = %467
  br label %469

469:                                              ; preds = %468
  br label %470

470:                                              ; preds = %469
  %471 = call zeroext i8 @DebugPrintEnabled()
  %472 = icmp ne i8 %471, 0
  br i1 %472, label %473, label %487

473:                                              ; preds = %470
  br label %474

474:                                              ; preds = %473
  %475 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %476 = icmp ne i8 %475, 0
  br i1 %476, label %477, label %484

477:                                              ; preds = %474
  %478 = load ptr, ptr %3, align 8, !tbaa !5
  %479 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %478, i32 0, i32 9
  %480 = load ptr, ptr %479, align 8, !tbaa !24
  %481 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %480, i32 0, i32 1
  %482 = load i16, ptr %481, align 1, !tbaa !28
  %483 = zext i16 %482 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.26, i32 noundef %483)
  br label %484

484:                                              ; preds = %477, %474
  br label %485

485:                                              ; preds = %484
  br label %486

486:                                              ; preds = %485
  br label %487

487:                                              ; preds = %486, %470
  br label %488

488:                                              ; preds = %487
  br label %489

489:                                              ; preds = %488
  br label %490

490:                                              ; preds = %489
  %491 = call zeroext i8 @DebugPrintEnabled()
  %492 = icmp ne i8 %491, 0
  br i1 %492, label %493, label %506

493:                                              ; preds = %490
  br label %494

494:                                              ; preds = %493
  %495 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %496 = icmp ne i8 %495, 0
  br i1 %496, label %497, label %503

497:                                              ; preds = %494
  %498 = load ptr, ptr %3, align 8, !tbaa !5
  %499 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %498, i32 0, i32 9
  %500 = load ptr, ptr %499, align 8, !tbaa !24
  %501 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %500, i32 0, i32 2
  %502 = getelementptr inbounds [20 x i8], ptr %501, i64 0, i64 0
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.27, ptr noundef %502)
  br label %503

503:                                              ; preds = %497, %494
  br label %504

504:                                              ; preds = %503
  br label %505

505:                                              ; preds = %504
  br label %506

506:                                              ; preds = %505, %490
  br label %507

507:                                              ; preds = %506
  br label %508

508:                                              ; preds = %507
  br label %509

509:                                              ; preds = %508
  %510 = call zeroext i8 @DebugPrintEnabled()
  %511 = icmp ne i8 %510, 0
  br i1 %511, label %512, label %525

512:                                              ; preds = %509
  br label %513

513:                                              ; preds = %512
  %514 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %515 = icmp ne i8 %514, 0
  br i1 %515, label %516, label %522

516:                                              ; preds = %513
  %517 = load ptr, ptr %3, align 8, !tbaa !5
  %518 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %517, i32 0, i32 9
  %519 = load ptr, ptr %518, align 8, !tbaa !24
  %520 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %519, i32 0, i32 3
  %521 = getelementptr inbounds [40 x i8], ptr %520, i64 0, i64 0
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.28, ptr noundef %521)
  br label %522

522:                                              ; preds = %516, %513
  br label %523

523:                                              ; preds = %522
  br label %524

524:                                              ; preds = %523
  br label %525

525:                                              ; preds = %524, %509
  br label %526

526:                                              ; preds = %525
  br label %527

527:                                              ; preds = %526
  br label %528

528:                                              ; preds = %527
  %529 = call zeroext i8 @DebugPrintEnabled()
  %530 = icmp ne i8 %529, 0
  br i1 %530, label %531, label %545

531:                                              ; preds = %528
  br label %532

532:                                              ; preds = %531
  %533 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %534 = icmp ne i8 %533, 0
  br i1 %534, label %535, label %542

535:                                              ; preds = %532
  %536 = load ptr, ptr %3, align 8, !tbaa !5
  %537 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %536, i32 0, i32 9
  %538 = load ptr, ptr %537, align 8, !tbaa !24
  %539 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %538, i32 0, i32 4
  %540 = getelementptr inbounds [8 x i8], ptr %539, i64 0, i64 0
  %541 = load i64, ptr %540, align 1, !tbaa !20
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.29, i64 noundef %541)
  br label %542

542:                                              ; preds = %535, %532
  br label %543

543:                                              ; preds = %542
  br label %544

544:                                              ; preds = %543
  br label %545

545:                                              ; preds = %544, %528
  br label %546

546:                                              ; preds = %545
  br label %547

547:                                              ; preds = %546
  br label %548

548:                                              ; preds = %547
  %549 = call zeroext i8 @DebugPrintEnabled()
  %550 = icmp ne i8 %549, 0
  br i1 %550, label %551, label %565

551:                                              ; preds = %548
  br label %552

552:                                              ; preds = %551
  %553 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %554 = icmp ne i8 %553, 0
  br i1 %554, label %555, label %562

555:                                              ; preds = %552
  %556 = load ptr, ptr %3, align 8, !tbaa !5
  %557 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %556, i32 0, i32 9
  %558 = load ptr, ptr %557, align 8, !tbaa !24
  %559 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %558, i32 0, i32 5
  %560 = load i8, ptr %559, align 1, !tbaa !29
  %561 = zext i8 %560 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.30, i32 noundef %561)
  br label %562

562:                                              ; preds = %555, %552
  br label %563

563:                                              ; preds = %562
  br label %564

564:                                              ; preds = %563
  br label %565

565:                                              ; preds = %564, %548
  br label %566

566:                                              ; preds = %565
  br label %567

567:                                              ; preds = %566
  br label %568

568:                                              ; preds = %567
  %569 = call zeroext i8 @DebugPrintEnabled()
  %570 = icmp ne i8 %569, 0
  br i1 %570, label %571, label %585

571:                                              ; preds = %568
  br label %572

572:                                              ; preds = %571
  %573 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %574 = icmp ne i8 %573, 0
  br i1 %574, label %575, label %582

575:                                              ; preds = %572
  %576 = load ptr, ptr %3, align 8, !tbaa !5
  %577 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %576, i32 0, i32 9
  %578 = load ptr, ptr %577, align 8, !tbaa !24
  %579 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %578, i32 0, i32 6
  %580 = getelementptr inbounds [3 x i8], ptr %579, i64 0, i64 0
  %581 = load i32, ptr %580, align 1, !tbaa !30
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.31, i32 noundef %581)
  br label %582

582:                                              ; preds = %575, %572
  br label %583

583:                                              ; preds = %582
  br label %584

584:                                              ; preds = %583
  br label %585

585:                                              ; preds = %584, %568
  br label %586

586:                                              ; preds = %585
  br label %587

587:                                              ; preds = %586
  br label %588

588:                                              ; preds = %587
  %589 = call zeroext i8 @DebugPrintEnabled()
  %590 = icmp ne i8 %589, 0
  br i1 %590, label %591, label %605

591:                                              ; preds = %588
  br label %592

592:                                              ; preds = %591
  %593 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %594 = icmp ne i8 %593, 0
  br i1 %594, label %595, label %602

595:                                              ; preds = %592
  %596 = load ptr, ptr %3, align 8, !tbaa !5
  %597 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %596, i32 0, i32 9
  %598 = load ptr, ptr %597, align 8, !tbaa !24
  %599 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %598, i32 0, i32 13
  %600 = load i8, ptr %599, align 1, !tbaa !31
  %601 = zext i8 %600 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.32, i32 noundef %601)
  br label %602

602:                                              ; preds = %595, %592
  br label %603

603:                                              ; preds = %602
  br label %604

604:                                              ; preds = %603
  br label %605

605:                                              ; preds = %604, %588
  br label %606

606:                                              ; preds = %605
  br label %607

607:                                              ; preds = %606
  br label %608

608:                                              ; preds = %607
  %609 = call zeroext i8 @DebugPrintEnabled()
  %610 = icmp ne i8 %609, 0
  br i1 %610, label %611, label %625

611:                                              ; preds = %608
  br label %612

612:                                              ; preds = %611
  %613 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %614 = icmp ne i8 %613, 0
  br i1 %614, label %615, label %622

615:                                              ; preds = %612
  %616 = load ptr, ptr %3, align 8, !tbaa !5
  %617 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %616, i32 0, i32 9
  %618 = load ptr, ptr %617, align 8, !tbaa !24
  %619 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %618, i32 0, i32 21
  %620 = load i8, ptr %619, align 1, !tbaa !32
  %621 = zext i8 %620 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.33, i32 noundef %621)
  br label %622

622:                                              ; preds = %615, %612
  br label %623

623:                                              ; preds = %622
  br label %624

624:                                              ; preds = %623
  br label %625

625:                                              ; preds = %624, %608
  br label %626

626:                                              ; preds = %625
  br label %627

627:                                              ; preds = %626
  br label %628

628:                                              ; preds = %627
  %629 = call zeroext i8 @DebugPrintEnabled()
  %630 = icmp ne i8 %629, 0
  br i1 %630, label %631, label %645

631:                                              ; preds = %628
  br label %632

632:                                              ; preds = %631
  %633 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %634 = icmp ne i8 %633, 0
  br i1 %634, label %635, label %642

635:                                              ; preds = %632
  %636 = load ptr, ptr %3, align 8, !tbaa !5
  %637 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %636, i32 0, i32 9
  %638 = load ptr, ptr %637, align 8, !tbaa !24
  %639 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %638, i32 0, i32 22
  %640 = load i8, ptr %639, align 1, !tbaa !33
  %641 = zext i8 %640 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.34, i32 noundef %641)
  br label %642

642:                                              ; preds = %635, %632
  br label %643

643:                                              ; preds = %642
  br label %644

644:                                              ; preds = %643
  br label %645

645:                                              ; preds = %644, %628
  br label %646

646:                                              ; preds = %645
  br label %647

647:                                              ; preds = %646
  br label %648

648:                                              ; preds = %647
  %649 = call zeroext i8 @DebugPrintEnabled()
  %650 = icmp ne i8 %649, 0
  br i1 %650, label %651, label %664

651:                                              ; preds = %648
  br label %652

652:                                              ; preds = %651
  %653 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64)
  %654 = icmp ne i8 %653, 0
  br i1 %654, label %655, label %661

655:                                              ; preds = %652
  %656 = load ptr, ptr %3, align 8, !tbaa !5
  %657 = getelementptr inbounds %struct._NVME_CONTROLLER_PRIVATE_DATA, ptr %656, i32 0, i32 9
  %658 = load ptr, ptr %657, align 8, !tbaa !24
  %659 = getelementptr inbounds %struct.NVME_ADMIN_CONTROLLER_DATA, ptr %658, i32 0, i32 24
  %660 = load i32, ptr %659, align 1, !tbaa !34
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef @.str.35, i32 noundef %660)
  br label %661

661:                                              ; preds = %655, %652
  br label %662

662:                                              ; preds = %661
  br label %663

663:                                              ; preds = %662
  br label %664

664:                                              ; preds = %663, %648
  br label %665

665:                                              ; preds = %664
  br label %666

666:                                              ; preds = %665
  %667 = load i64, ptr %4, align 8, !tbaa !20
  store i64 %667, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %668

668:                                              ; preds = %666, %419, %410, %400, %393, %386, %379, %372, %365, %122, %93, %68, %59, %23
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #3
  %669 = load i64, ptr %2, align 8
  ret i64 %669
}

declare zeroext i8 @DebugAssertEnabled() #2

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

declare ptr @AllocateZeroPool(i64 noundef) #2

declare void @FreePool(ptr noundef) #2

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 32}
!10 = !{!"_NVME_CONTROLLER_PRIVATE_DATA", !11, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !12, i64 40, !6, i64 48, !13, i64 56, !14, 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, !15, i64 238, !6, i64 248}
!11 = !{!"int", !7, i64 0}
!12 = !{!"long long", !7, i64 0}
!13 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !12, i64 16, !11, i64 24}
!14 = !{!"_NVM_EXPRESS_PASS_THRU_PROTOCOL", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32}
!15 = !{!"", !16, i64 0, !7, i64 2, !7, i64 2, !7, i64 2, !7, i64 3, !16, i64 4, !16, i64 4, !16, i64 4, !16, i64 5, !7, i64 6, !7, i64 6, !7, i64 7}
!16 = !{!"short", !7, i64 0}
!17 = !{!18, !6, i64 120}
!18 = !{!"_EFI_PCI_IO_PROTOCOL", !6, i64 0, !6, i64 8, !19, i64 16, !19, i64 32, !19, 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}
!19 = !{!"", !6, i64 0, !6, i64 8}
!20 = !{!12, !12, i64 0}
!21 = !{!16, !16, i64 0}
!22 = !{!10, !6, i64 144}
!23 = !{!10, !6, i64 136}
!24 = !{!10, !6, i64 128}
!25 = !{!7, !7, i64 0}
!26 = !{!27, !16, i64 0}
!27 = !{!"", !16, i64 0, !16, i64 2, !7, i64 4, !7, i64 24, !7, i64 64, !7, i64 72, !7, i64 73, !7, i64 76, !7, i64 77, !7, i64 78, !7, i64 80, !16, i64 256, !7, i64 258, !7, i64 259, !7, i64 260, !7, i64 261, !7, i64 262, !7, i64 263, !7, i64 264, !7, i64 265, !7, i64 266, !7, i64 512, !7, i64 513, !16, i64 514, !11, i64 516, !16, i64 520, !16, i64 522, !7, i64 524, !7, i64 525, !16, i64 526, !16, i64 528, !7, i64 530, !7, i64 531, !16, i64 532, !16, i64 534, !11, i64 536, !7, i64 540, !7, i64 704, !7, i64 2048, !7, i64 3072}
!28 = !{!27, !16, i64 2}
!29 = !{!27, !7, i64 72}
!30 = !{!11, !11, i64 0}
!31 = !{!27, !7, i64 259}
!32 = !{!27, !7, i64 512}
!33 = !{!27, !7, i64 513}
!34 = !{!27, !11, i64 516}


; 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_AQA = type { i32 }
%struct.NVME_ASQ = type { i64 }
%struct.NVME_ACQ = type { i64 }

@.str.13 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [69 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [152 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [22 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local i64 @ReadNvmeControllerCapabilities(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) #1

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

declare zeroext i8 @DebugPrintEnabled() local_unnamed_addr #2

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

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

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

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

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

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

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i64 @NvmeControllerInit(ptr noundef %0) local_unnamed_addr #0 {
  %2 = alloca i64, align 8
  %3 = alloca %struct.NVME_AQA, align 4
  %4 = alloca %struct.NVME_ASQ, align 8
  %5 = alloca %struct.NVME_ACQ, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #3
  %6 = getelementptr inbounds i8, ptr %0, i64 32
  %7 = load ptr, ptr %6, align 8, !tbaa !5
  %8 = getelementptr inbounds i8, ptr %7, i64 120
  %9 = load ptr, ptr %8, align 8, !tbaa !16
  %10 = getelementptr inbounds i8, ptr %0, i64 40
  %11 = tail call i64 %9(ptr noundef %7, i32 noundef 0, i64 noundef 0, ptr noundef nonnull %10) #3
  %12 = icmp slt i64 %11, 0
  br i1 %12, label %247, label %13

13:                                               ; preds = %1
  %14 = load ptr, ptr %8, align 8, !tbaa !16
  %15 = call i64 %14(ptr noundef nonnull %7, i32 noundef 4, i64 noundef 0, ptr noundef nonnull %2) #3
  %16 = icmp slt i64 %15, 0
  br i1 %16, label %.thread, label %17

17:                                               ; preds = %13
  %18 = load i64, ptr %2, align 8, !tbaa !19
  %19 = and i64 %18, 1792
  store i64 %19, ptr %2, align 8, !tbaa !19
  %20 = load ptr, ptr %8, align 8, !tbaa !16
  %21 = call i64 %20(ptr noundef nonnull %7, i32 noundef 2, i64 noundef %19, ptr noundef null) #3
  %22 = icmp slt i64 %21, 0
  br i1 %22, label %.thread, label %27

.thread:                                          ; preds = %13, %17
  %.086143 = phi i64 [ %21, %17 ], [ %15, %13 ]
  %23 = call zeroext i8 @DebugPrintEnabled() #3
  %.not140 = icmp eq i8 %23, 0
  br i1 %.not140, label %247, label %24

24:                                               ; preds = %.thread
  %25 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not141 = icmp eq i8 %25, 0
  br i1 %.not141, label %247, label %26

26:                                               ; preds = %24
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.13) #3
  br label %247

27:                                               ; preds = %17
  %28 = getelementptr inbounds i8, ptr %0, i64 238
  %29 = call i64 @ReadNvmeControllerCapabilities(ptr noundef nonnull %0, ptr noundef nonnull %28)
  %30 = icmp slt i64 %29, 0
  br i1 %30, label %247, label %31

31:                                               ; preds = %27
  %32 = getelementptr inbounds i8, ptr %0, i64 242
  %33 = load i16, ptr %32, align 2
  %34 = and i16 %33, 480
  %.not = icmp eq i16 %34, 32
  br i1 %.not, label %40, label %35

35:                                               ; preds = %31
  %36 = call zeroext i8 @DebugPrintEnabled() #3
  %.not138 = icmp eq i8 %36, 0
  br i1 %.not138, label %247, label %37

37:                                               ; preds = %35
  %38 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not139 = icmp eq i8 %38, 0
  br i1 %.not139, label %247, label %39

39:                                               ; preds = %37
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.14) #3
  br label %247

40:                                               ; preds = %31
  %41 = call zeroext i8 @DebugAssertEnabled() #3
  %.not99 = icmp eq i8 %41, 0
  br i1 %.not99, label %48, label %42

42:                                               ; preds = %40
  %43 = getelementptr inbounds i8, ptr %0, i64 244
  %44 = load i8, ptr %43, align 2
  %45 = and i8 %44, 15
  %46 = icmp eq i8 %45, 0
  br i1 %46, label %48, label %47

47:                                               ; preds = %42
  call void @DebugAssert(ptr noundef nonnull @.str.15, i64 noundef 849, ptr noundef nonnull @.str.16) #3
  br label %48

48:                                               ; preds = %42, %47, %40
  %49 = getelementptr inbounds i8, ptr %0, i64 234
  store i16 0, ptr %49, align 2, !tbaa !20
  %50 = getelementptr inbounds i8, ptr %0, i64 236
  store i16 0, ptr %50, align 2, !tbaa !20
  %51 = call i64 @NvmeDisableController(ptr noundef nonnull %0)
  %52 = icmp slt i64 %51, 0
  br i1 %52, label %247, label %53

53:                                               ; preds = %48
  store i32 65537, ptr %3, align 4
  %54 = getelementptr inbounds i8, ptr %0, i64 144
  %55 = load ptr, ptr %54, align 8, !tbaa !21
  %56 = ptrtoint ptr %55 to i64
  %57 = and i64 %56, -4096
  store i64 %57, ptr %4, align 8
  %58 = getelementptr inbounds i8, ptr %55, i64 4096
  %59 = ptrtoint ptr %58 to i64
  %60 = and i64 %59, -4096
  store i64 %60, ptr %5, align 8
  %61 = getelementptr inbounds i8, ptr %0, i64 136
  %62 = load ptr, ptr %61, align 8, !tbaa !22
  %63 = getelementptr inbounds i8, ptr %0, i64 152
  store ptr %62, ptr %63, align 8, !tbaa !23
  %64 = getelementptr inbounds i8, ptr %0, i64 184
  store ptr %55, ptr %64, align 8, !tbaa !23
  %65 = getelementptr inbounds i8, ptr %62, i64 4096
  %66 = getelementptr inbounds i8, ptr %0, i64 168
  store ptr %65, ptr %66, align 8, !tbaa !23
  %67 = getelementptr inbounds i8, ptr %0, i64 200
  store ptr %58, ptr %67, align 8, !tbaa !23
  %68 = getelementptr inbounds i8, ptr %62, i64 8192
  %69 = getelementptr inbounds i8, ptr %0, i64 160
  store ptr %68, ptr %69, align 8, !tbaa !23
  %70 = getelementptr inbounds i8, ptr %55, i64 8192
  %71 = getelementptr inbounds i8, ptr %0, i64 192
  store ptr %70, ptr %71, align 8, !tbaa !23
  %72 = getelementptr inbounds i8, ptr %62, i64 12288
  %73 = getelementptr inbounds i8, ptr %0, i64 176
  store ptr %72, ptr %73, align 8, !tbaa !23
  %74 = getelementptr inbounds i8, ptr %55, i64 12288
  %75 = getelementptr inbounds i8, ptr %0, i64 208
  store ptr %74, ptr %75, align 8, !tbaa !23
  %76 = call zeroext i8 @DebugPrintEnabled() #3
  %.not100 = icmp eq i8 %76, 0
  br i1 %.not100, label %82, label %77

77:                                               ; preds = %53
  %78 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not101 = icmp eq i8 %78, 0
  br i1 %.not101, label %82, label %79

79:                                               ; preds = %77
  %80 = load ptr, ptr %61, align 8, !tbaa !22
  %81 = ptrtoint ptr %80 to i64
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.17, i64 noundef %81) #3
  br label %82

82:                                               ; preds = %53, %79, %77
  %83 = call zeroext i8 @DebugPrintEnabled() #3
  %.not102 = icmp eq i8 %83, 0
  br i1 %.not102, label %89, label %84

84:                                               ; preds = %82
  %85 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not103 = icmp eq i8 %85, 0
  br i1 %.not103, label %89, label %86

86:                                               ; preds = %84
  %87 = load i32, ptr %3, align 4
  %88 = and i32 %87, 4095
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.18, i32 noundef %88) #3
  br label %89

89:                                               ; preds = %82, %86, %84
  %90 = call zeroext i8 @DebugPrintEnabled() #3
  %.not104 = icmp eq i8 %90, 0
  br i1 %.not104, label %97, label %91

91:                                               ; preds = %89
  %92 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not105 = icmp eq i8 %92, 0
  br i1 %.not105, label %97, label %93

93:                                               ; preds = %91
  %94 = load i32, ptr %3, align 4
  %95 = lshr i32 %94, 16
  %96 = and i32 %95, 4095
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.19, i32 noundef %96) #3
  br label %97

97:                                               ; preds = %89, %93, %91
  %98 = call zeroext i8 @DebugPrintEnabled() #3
  %.not106 = icmp eq i8 %98, 0
  br i1 %.not106, label %103, label %99

99:                                               ; preds = %97
  %100 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not107 = icmp eq i8 %100, 0
  br i1 %.not107, label %103, label %101

101:                                              ; preds = %99
  %102 = load ptr, ptr %63, align 8, !tbaa !23
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.20, ptr noundef %102) #3
  br label %103

103:                                              ; preds = %97, %101, %99
  %104 = call zeroext i8 @DebugPrintEnabled() #3
  %.not108 = icmp eq i8 %104, 0
  br i1 %.not108, label %109, label %105

105:                                              ; preds = %103
  %106 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not109 = icmp eq i8 %106, 0
  br i1 %.not109, label %109, label %107

107:                                              ; preds = %105
  %108 = load ptr, ptr %66, align 8, !tbaa !23
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.21, ptr noundef %108) #3
  br label %109

109:                                              ; preds = %103, %107, %105
  %110 = call zeroext i8 @DebugPrintEnabled() #3
  %.not110 = icmp eq i8 %110, 0
  br i1 %.not110, label %115, label %111

111:                                              ; preds = %109
  %112 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not111 = icmp eq i8 %112, 0
  br i1 %.not111, label %115, label %113

113:                                              ; preds = %111
  %114 = load ptr, ptr %69, align 8, !tbaa !23
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.22, ptr noundef %114) #3
  br label %115

115:                                              ; preds = %109, %113, %111
  %116 = call zeroext i8 @DebugPrintEnabled() #3
  %.not112 = icmp eq i8 %116, 0
  br i1 %.not112, label %121, label %117

117:                                              ; preds = %115
  %118 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not113 = icmp eq i8 %118, 0
  br i1 %.not113, label %121, label %119

119:                                              ; preds = %117
  %120 = load ptr, ptr %73, align 8, !tbaa !23
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.23, ptr noundef %120) #3
  br label %121

121:                                              ; preds = %117, %119, %115
  %122 = call i64 @WriteNvmeAdminQueueAttributes(ptr noundef nonnull %0, ptr noundef nonnull %3)
  %123 = icmp slt i64 %122, 0
  br i1 %123, label %247, label %124

124:                                              ; preds = %121
  %125 = call i64 @WriteNvmeAdminSubmissionQueueBaseAddress(ptr noundef nonnull %0, ptr noundef nonnull %4)
  %126 = icmp slt i64 %125, 0
  br i1 %126, label %247, label %127

127:                                              ; preds = %124
  %128 = call i64 @WriteNvmeAdminCompletionQueueBaseAddress(ptr noundef nonnull %0, ptr noundef nonnull %5)
  %129 = icmp slt i64 %128, 0
  br i1 %129, label %247, label %130

130:                                              ; preds = %127
  %131 = call i64 @NvmeEnableController(ptr noundef nonnull %0)
  %132 = icmp slt i64 %131, 0
  br i1 %132, label %247, label %133

133:                                              ; preds = %130
  %134 = call i64 @NvmeCreateIoCompletionQueue(ptr noundef nonnull %0)
  %135 = icmp slt i64 %134, 0
  br i1 %135, label %247, label %136

136:                                              ; preds = %133
  %137 = call i64 @NvmeCreateIoSubmissionQueue(ptr noundef nonnull %0)
  %138 = icmp slt i64 %137, 0
  br i1 %138, label %247, label %139

139:                                              ; preds = %136
  %140 = call ptr @AllocateZeroPool(i64 noundef 4096) #3
  %141 = getelementptr inbounds i8, ptr %0, i64 128
  store ptr %140, ptr %141, align 8, !tbaa !24
  %142 = icmp eq ptr %140, null
  br i1 %142, label %247, label %143

143:                                              ; preds = %139
  %144 = call i64 @NvmeIdentifyController(ptr noundef nonnull %0, ptr noundef nonnull %140)
  %145 = icmp slt i64 %144, 0
  %146 = load ptr, ptr %141, align 8, !tbaa !24
  br i1 %145, label %147, label %148

147:                                              ; preds = %143
  call void @FreePool(ptr noundef %146) #3
  store ptr null, ptr %141, align 8, !tbaa !24
  br label %247

148:                                              ; preds = %143
  %149 = getelementptr inbounds i8, ptr %146, i64 23
  store i8 0, ptr %149, align 1, !tbaa !25
  %150 = load ptr, ptr %141, align 8, !tbaa !24
  %151 = getelementptr inbounds i8, ptr %150, i64 63
  store i8 0, ptr %151, align 1, !tbaa !25
  %152 = call zeroext i8 @DebugPrintEnabled() #3
  %.not114 = icmp eq i8 %152, 0
  br i1 %.not114, label %156, label %153

153:                                              ; preds = %148
  %154 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not115 = icmp eq i8 %154, 0
  br i1 %.not115, label %156, label %155

155:                                              ; preds = %153
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.24) #3
  br label %156

156:                                              ; preds = %148, %155, %153
  %157 = call zeroext i8 @DebugPrintEnabled() #3
  %.not116 = icmp eq i8 %157, 0
  br i1 %.not116, label %164, label %158

158:                                              ; preds = %156
  %159 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not117 = icmp eq i8 %159, 0
  br i1 %.not117, label %164, label %160

160:                                              ; preds = %158
  %161 = load ptr, ptr %141, align 8, !tbaa !24
  %162 = load i16, ptr %161, align 1, !tbaa !26
  %163 = zext i16 %162 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.25, i32 noundef %163) #3
  br label %164

164:                                              ; preds = %156, %160, %158
  %165 = call zeroext i8 @DebugPrintEnabled() #3
  %.not118 = icmp eq i8 %165, 0
  br i1 %.not118, label %173, label %166

166:                                              ; preds = %164
  %167 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not119 = icmp eq i8 %167, 0
  br i1 %.not119, label %173, label %168

168:                                              ; preds = %166
  %169 = load ptr, ptr %141, align 8, !tbaa !24
  %170 = getelementptr inbounds i8, ptr %169, i64 2
  %171 = load i16, ptr %170, align 1, !tbaa !28
  %172 = zext i16 %171 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.26, i32 noundef %172) #3
  br label %173

173:                                              ; preds = %164, %168, %166
  %174 = call zeroext i8 @DebugPrintEnabled() #3
  %.not120 = icmp eq i8 %174, 0
  br i1 %.not120, label %180, label %175

175:                                              ; preds = %173
  %176 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not121 = icmp eq i8 %176, 0
  br i1 %.not121, label %180, label %177

177:                                              ; preds = %175
  %178 = load ptr, ptr %141, align 8, !tbaa !24
  %179 = getelementptr inbounds i8, ptr %178, i64 4
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.27, ptr noundef nonnull %179) #3
  br label %180

180:                                              ; preds = %173, %177, %175
  %181 = call zeroext i8 @DebugPrintEnabled() #3
  %.not122 = icmp eq i8 %181, 0
  br i1 %.not122, label %187, label %182

182:                                              ; preds = %180
  %183 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not123 = icmp eq i8 %183, 0
  br i1 %.not123, label %187, label %184

184:                                              ; preds = %182
  %185 = load ptr, ptr %141, align 8, !tbaa !24
  %186 = getelementptr inbounds i8, ptr %185, i64 24
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.28, ptr noundef nonnull %186) #3
  br label %187

187:                                              ; preds = %180, %184, %182
  %188 = call zeroext i8 @DebugPrintEnabled() #3
  %.not124 = icmp eq i8 %188, 0
  br i1 %.not124, label %195, label %189

189:                                              ; preds = %187
  %190 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not125 = icmp eq i8 %190, 0
  br i1 %.not125, label %195, label %191

191:                                              ; preds = %189
  %192 = load ptr, ptr %141, align 8, !tbaa !24
  %193 = getelementptr inbounds i8, ptr %192, i64 64
  %194 = load i64, ptr %193, align 1, !tbaa !19
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.29, i64 noundef %194) #3
  br label %195

195:                                              ; preds = %187, %191, %189
  %196 = call zeroext i8 @DebugPrintEnabled() #3
  %.not126 = icmp eq i8 %196, 0
  br i1 %.not126, label %204, label %197

197:                                              ; preds = %195
  %198 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not127 = icmp eq i8 %198, 0
  br i1 %.not127, label %204, label %199

199:                                              ; preds = %197
  %200 = load ptr, ptr %141, align 8, !tbaa !24
  %201 = getelementptr inbounds i8, ptr %200, i64 72
  %202 = load i8, ptr %201, align 1, !tbaa !29
  %203 = zext i8 %202 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.30, i32 noundef %203) #3
  br label %204

204:                                              ; preds = %195, %199, %197
  %205 = call zeroext i8 @DebugPrintEnabled() #3
  %.not128 = icmp eq i8 %205, 0
  br i1 %.not128, label %212, label %206

206:                                              ; preds = %204
  %207 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not129 = icmp eq i8 %207, 0
  br i1 %.not129, label %212, label %208

208:                                              ; preds = %206
  %209 = load ptr, ptr %141, align 8, !tbaa !24
  %210 = getelementptr inbounds i8, ptr %209, i64 73
  %211 = load i32, ptr %210, align 1, !tbaa !30
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.31, i32 noundef %211) #3
  br label %212

212:                                              ; preds = %204, %208, %206
  %213 = call zeroext i8 @DebugPrintEnabled() #3
  %.not130 = icmp eq i8 %213, 0
  br i1 %.not130, label %221, label %214

214:                                              ; preds = %212
  %215 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not131 = icmp eq i8 %215, 0
  br i1 %.not131, label %221, label %216

216:                                              ; preds = %214
  %217 = load ptr, ptr %141, align 8, !tbaa !24
  %218 = getelementptr inbounds i8, ptr %217, i64 259
  %219 = load i8, ptr %218, align 1, !tbaa !31
  %220 = zext i8 %219 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.32, i32 noundef %220) #3
  br label %221

221:                                              ; preds = %212, %216, %214
  %222 = call zeroext i8 @DebugPrintEnabled() #3
  %.not132 = icmp eq i8 %222, 0
  br i1 %.not132, label %230, label %223

223:                                              ; preds = %221
  %224 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not133 = icmp eq i8 %224, 0
  br i1 %.not133, label %230, label %225

225:                                              ; preds = %223
  %226 = load ptr, ptr %141, align 8, !tbaa !24
  %227 = getelementptr inbounds i8, ptr %226, i64 512
  %228 = load i8, ptr %227, align 1, !tbaa !32
  %229 = zext i8 %228 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.33, i32 noundef %229) #3
  br label %230

230:                                              ; preds = %221, %225, %223
  %231 = call zeroext i8 @DebugPrintEnabled() #3
  %.not134 = icmp eq i8 %231, 0
  br i1 %.not134, label %239, label %232

232:                                              ; preds = %230
  %233 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not135 = icmp eq i8 %233, 0
  br i1 %.not135, label %239, label %234

234:                                              ; preds = %232
  %235 = load ptr, ptr %141, align 8, !tbaa !24
  %236 = getelementptr inbounds i8, ptr %235, i64 513
  %237 = load i8, ptr %236, align 1, !tbaa !33
  %238 = zext i8 %237 to i32
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.34, i32 noundef %238) #3
  br label %239

239:                                              ; preds = %230, %234, %232
  %240 = call zeroext i8 @DebugPrintEnabled() #3
  %.not136 = icmp eq i8 %240, 0
  br i1 %.not136, label %247, label %241

241:                                              ; preds = %239
  %242 = call zeroext i8 @DebugPrintLevelEnabled(i64 noundef 64) #3
  %.not137 = icmp eq i8 %242, 0
  br i1 %.not137, label %247, label %243

243:                                              ; preds = %241
  %244 = load ptr, ptr %141, align 8, !tbaa !24
  %245 = getelementptr inbounds i8, ptr %244, i64 516
  %246 = load i32, ptr %245, align 1, !tbaa !34
  call void (i64, ptr, ...) @DebugPrint(i64 noundef 64, ptr noundef nonnull @.str.35, i32 noundef %246) #3
  br label %247

247:                                              ; preds = %239, %243, %241, %139, %136, %133, %130, %127, %124, %121, %48, %35, %39, %37, %27, %.thread, %26, %24, %1, %147
  %.0 = phi i64 [ -9223372036854775794, %147 ], [ %11, %1 ], [ %.086143, %24 ], [ %.086143, %26 ], [ %.086143, %.thread ], [ %29, %27 ], [ -9223372036854775805, %37 ], [ -9223372036854775805, %39 ], [ -9223372036854775805, %35 ], [ %51, %48 ], [ %122, %121 ], [ %125, %124 ], [ %128, %127 ], [ %131, %130 ], [ %134, %133 ], [ %137, %136 ], [ -9223372036854775799, %139 ], [ %144, %241 ], [ %144, %243 ], [ %144, %239 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %3) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2) #3
  ret i64 %.0
}

declare zeroext i8 @DebugAssertEnabled() local_unnamed_addr #2

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

declare ptr @AllocateZeroPool(i64 noundef) local_unnamed_addr #2

declare void @FreePool(ptr noundef) local_unnamed_addr #2

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !10, i64 32}
!6 = !{!"_NVME_CONTROLLER_PRIVATE_DATA", !7, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !11, i64 40, !10, i64 48, !12, i64 56, !13, 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, !14, i64 238, !10, i64 248}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"long long", !8, i64 0}
!12 = !{!"", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !11, i64 16, !7, i64 24}
!13 = !{!"_NVM_EXPRESS_PASS_THRU_PROTOCOL", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32}
!14 = !{!"", !15, i64 0, !8, i64 2, !8, i64 2, !8, i64 2, !8, i64 3, !15, i64 4, !15, i64 4, !15, i64 4, !15, i64 5, !8, i64 6, !8, i64 6, !8, i64 7}
!15 = !{!"short", !8, i64 0}
!16 = !{!17, !10, i64 120}
!17 = !{!"_EFI_PCI_IO_PROTOCOL", !10, i64 0, !10, i64 8, !18, i64 16, !18, i64 32, !18, 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, !11, i64 144, !10, i64 152}
!18 = !{!"", !10, i64 0, !10, i64 8}
!19 = !{!11, !11, i64 0}
!20 = !{!15, !15, i64 0}
!21 = !{!6, !10, i64 144}
!22 = !{!6, !10, i64 136}
!23 = !{!10, !10, i64 0}
!24 = !{!6, !10, i64 128}
!25 = !{!8, !8, i64 0}
!26 = !{!27, !15, i64 0}
!27 = !{!"", !15, i64 0, !15, i64 2, !8, i64 4, !8, i64 24, !8, i64 64, !8, i64 72, !8, i64 73, !8, i64 76, !8, i64 77, !8, i64 78, !8, i64 80, !15, i64 256, !8, i64 258, !8, i64 259, !8, i64 260, !8, i64 261, !8, i64 262, !8, i64 263, !8, i64 264, !8, i64 265, !8, i64 266, !8, i64 512, !8, i64 513, !15, i64 514, !7, i64 516, !15, i64 520, !15, i64 522, !8, i64 524, !8, i64 525, !15, i64 526, !15, i64 528, !8, i64 530, !8, i64 531, !15, i64 532, !15, i64 534, !7, i64 536, !8, i64 540, !8, i64 704, !8, i64 2048, !8, i64 3072}
!28 = !{!27, !15, i64 2}
!29 = !{!27, !8, i64 72}
!30 = !{!7, !7, i64 0}
!31 = !{!27, !8, i64 259}
!32 = !{!27, !8, i64 512}
!33 = !{!27, !8, i64 513}
!34 = !{!27, !7, i64 516}


; Effective O3 passes: CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,SROAPass,SimplifyCFGPass,TailCallElimPass