diff --git a/llvm/lib/Target/DirectX/DXILResource.h b/llvm/lib/Target/DirectX/DXILResource.h --- a/llvm/lib/Target/DirectX/DXILResource.h +++ b/llvm/lib/Target/DirectX/DXILResource.h @@ -106,7 +106,7 @@ public: UAVResource(uint32_t I, hlsl::FrontendResource R); - + ResourceBase::Kinds getShape() const { return Shape; } MDNode *write() const; void print(raw_ostream &O) const; }; diff --git a/llvm/lib/Target/DirectX/DXILTypedBufferLowering.cpp b/llvm/lib/Target/DirectX/DXILTypedBufferLowering.cpp --- a/llvm/lib/Target/DirectX/DXILTypedBufferLowering.cpp +++ b/llvm/lib/Target/DirectX/DXILTypedBufferLowering.cpp @@ -22,8 +22,6 @@ #include "llvm/IR/IRBuilder.h" #include "llvm/IR/Instruction.h" #include "llvm/IR/Instructions.h" -#include "llvm/IR/IntrinsicInst.h" -#include "llvm/IR/Intrinsics.h" #include "llvm/IR/IntrinsicsDirectX.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" @@ -36,6 +34,48 @@ using namespace llvm; using namespace llvm::dxil; +namespace { +class HandleCache { + Module &M; + SmallDenseMap HandleMap; + uint64_t RangeID; + ConstantInt *UAVIndex; + +public: + HandleCache(const UAVResource &UAV, Module &M) + : M(M), RangeID(UAV.getRangeID()), + UAVIndex(ConstantInt::get(Type::getInt32Ty(M.getContext()), + UAV.getIndex())) {} + + CallInst *getHandle(Instruction *User, Value *ResourceOffset) { + // make handle for User. + Function *F = User->getParent()->getParent(); + Value *ResIndex = UAVIndex; + IRBuilder<> B(ResIndex->getContext()); + if (auto *ResourceOffsetI = dyn_cast_or_null(ResourceOffset)) + B.SetInsertPoint(ResourceOffsetI->getNextNode()); + else + B.SetInsertPoint(&*F->getEntryBlock().getFirstInsertionPt()); + + if (ResourceOffset) + ResIndex = B.CreateAdd( + ResIndex, B.CreateZExtOrTrunc(ResourceOffset, ResIndex->getType())); + + auto It = HandleMap.find(ResIndex); + CallInst *Hdl = nullptr; + if (It == HandleMap.end()) { + DXILOpBuilder DXILB(M, B); + Hdl = DXILB.createCreateHandle( + static_cast(hlsl::ResourceClass::UAV), RangeID, ResIndex, + false); + HandleMap[ResIndex] = Hdl; + } else + Hdl = It->second; + return Hdl; + } +}; +} // namespace + static bool lowerUAVAccess(Module &M, dxil::Resources &Res) { // FIXME: Allocate resource binding first. // See https://github.com/llvm/llvm-project/issues/58051 @@ -44,49 +84,50 @@ if (UAVs.empty()) return false; const DataLayout &DL = M.getDataLayout(); - LLVMContext &Ctx = M.getContext(); + // Datalayout to help calculate array index by set ptr size to 1 byte. + // So the offset will be the array index. + // Pointer size, abi alignment, prefered alignment, index size. + DataLayout ResourceDL("p:8:8:8:32"); for (const auto &UAV : UAVs) { + if (UAV.getShape() != hlsl::ResourceKind::TypedBuffer) + continue; + assert(UAV.getIndex() != -1U && "unallocated binding"); GlobalVariable *GV = UAV.getVariable(); + + std::vector ArrayAccessList; + MemAccessLowerHelper::collectMemAccess(GV, ArrayAccessList, ResourceDL); + // Save Resource Index and number of users for the Resource Index. + std::vector> ResIndexList; std::vector AccessList; - for (User *U : make_early_inc_range(GV->users())) { - if (auto *SI = dyn_cast(U)) { + for (auto &Access : ArrayAccessList) { + uint32_t Count = AccessList.size(); + if (auto *SI = dyn_cast(Access.User)) { Value *V = SI->getValueOperand(); // FIXME: use createHandle generated in clangCodeGen. // See https://github.com/llvm/llvm-project/issues/58031. SI->eraseFromParent(); MemAccessLowerHelper::collectMemAccess(V, AccessList, DL); - } else if (auto *IntrinsicCI = dyn_cast(U)) { - if (IntrinsicCI->getIntrinsicID() == Intrinsic::invariant_start || - IntrinsicCI->getIntrinsicID() == Intrinsic::invariant_end) - IntrinsicCI->eraseFromParent(); - } else if (LoadInst *LI = dyn_cast(U)) + } else if (auto *LI = dyn_cast(Access.User)) MemAccessLowerHelper::collectMemAccess(LI, AccessList, DL); - // FIXME: support array of resource. - // See https://github.com/llvm/llvm-project/issues/58486 + + if (uint32_t Size = AccessList.size() - Count) + ResIndexList.emplace_back(std::make_pair(Access.Offset.Index, Size)); } + HandleCache Handles(UAV, M); SmallDenseMap HandleMap; - uint64_t RangeID = UAV.getRangeID(); - ConstantInt *UAVIndex = - ConstantInt::get(Type::getInt32Ty(Ctx), UAV.getIndex()); - assert(UAVIndex->getLimitedValue() != -1ULL && "unallocated binding"); + auto ResIndexIt = ResIndexList.begin(); for (auto &Access : AccessList) { - Value *Index = Access.Offset.Index; + Value *ResIndex = ResIndexIt->first; + --(ResIndexIt->second); + // Update Resource Index when number of users is 0. + if (!ResIndexIt->second) + ++ResIndexIt; + Instruction *User = Access.User; - // make handle in the Function. - Function *F = User->getParent()->getParent(); - auto It = HandleMap.find(F); - CallInst *Hdl = nullptr; - if (It == HandleMap.end()) { - IRBuilder<> B(&*F->getEntryBlock().getFirstInsertionPt()); - DXILOpBuilder DXILB(M, B); - Hdl = DXILB.createCreateHandle( - static_cast(hlsl::ResourceClass::UAV), RangeID, UAVIndex, - false); - HandleMap[F] = Hdl; - } else - Hdl = It->second; + CallInst *Hdl = Handles.getHandle(User, ResIndex); + Value *Index = Access.Offset.Index; if (StoreInst *SI = dyn_cast(User)) { Value *V = SI->getValueOperand(); // Skip the store on hdl. diff --git a/llvm/lib/Target/DirectX/MemAccessLowerHelper.h b/llvm/lib/Target/DirectX/MemAccessLowerHelper.h --- a/llvm/lib/Target/DirectX/MemAccessLowerHelper.h +++ b/llvm/lib/Target/DirectX/MemAccessLowerHelper.h @@ -35,18 +35,30 @@ TypedBufMemOffset appendGEPOffset(GEPOperator *GEP, const DataLayout &DL); }; +// For array like RWBuffer U[2][2]. +// Index is 2*X + Y for U[X][Y]; +struct ArrayOffset { + Value *Index = nullptr; + ArrayOffset appendGEPOffset(GEPOperator *GEP, const DataLayout &DL); +}; + template struct MemAccess { OffsetT Offset; Instruction *User; // The instruction which access memory like Load/Store. }; using TypedBufMemAccess = MemAccess; +using ArrayMemAccess = MemAccess; /// Collect all memory access for typed buffer global /// variable \c Ptr. void collectMemAccess(llvm::Value *Ptr, std::vector &AccessList, const llvm::DataLayout &DL); +/// Collect all memory access for array global +/// variable \c Ptr. +void collectMemAccess(llvm::Value *Ptr, std::vector &AccessList, + const llvm::DataLayout &DL); } // namespace MemAccessLowerHelper diff --git a/llvm/lib/Target/DirectX/MemAccessLowerHelper.cpp b/llvm/lib/Target/DirectX/MemAccessLowerHelper.cpp --- a/llvm/lib/Target/DirectX/MemAccessLowerHelper.cpp +++ b/llvm/lib/Target/DirectX/MemAccessLowerHelper.cpp @@ -14,6 +14,8 @@ #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/Instructions.h" +#include "llvm/IR/IntrinsicInst.h" +#include "llvm/IR/Intrinsics.h" #include "llvm/IR/Operator.h" using namespace llvm; @@ -56,7 +58,14 @@ static void collectMemAccess(llvm::Value *Ptr, std::vector> &AccessList, const llvm::DataLayout &DL) { - for (llvm::User *U : Ptr->users()) { + for (llvm::User *U : make_early_inc_range(Ptr->users())) { + if (auto *IntrinsicCI = dyn_cast(U)) { + if (IntrinsicCI->getIntrinsicID() == Intrinsic::invariant_start || + IntrinsicCI->getIntrinsicID() == Intrinsic::invariant_end) { + IntrinsicCI->eraseFromParent(); + continue; + } + } T Offset; ::collectUserMemAccess(U, Offset, AccessList, DL); } @@ -67,3 +76,31 @@ const llvm::DataLayout &DL) { return ::collectMemAccess(Ptr, AccessList, DL); } + +void llvm::dxil::MemAccessLowerHelper::collectMemAccess( + llvm::Value *Ptr, std::vector &AccessList, + const llvm::DataLayout &DL) { + return ::collectMemAccess(Ptr, AccessList, DL); +} + +ArrayOffset llvm::dxil::MemAccessLowerHelper::ArrayOffset::appendGEPOffset( + GEPOperator *GEP, const DataLayout &DL) { + Value *NewIndex = Index; + IRBuilder<> B(GEP->getContext()); + if (auto *Inst = dyn_cast(GEP)) + B.SetInsertPoint(Inst); + if (GEP->hasAllConstantIndices()) { + SmallVector IdxList(GEP->idx_begin(), GEP->idx_end()); + NewIndex = B.getInt32( + DL.getIndexedOffsetInType(GEP->getSourceElementType(), IdxList)); + if (Index) + NewIndex = B.CreateAdd(Index, NewIndex); + } else { + Value *Offset = EmitGEPOffset(&B, DL, GEP, /*NoAssumptions=*/true); + if (Index) + NewIndex = B.CreateAdd(Index, Offset); + else + NewIndex = Offset; + } + return {NewIndex}; +} diff --git a/llvm/test/CodeGen/DirectX/typed_buf_array.ll b/llvm/test/CodeGen/DirectX/typed_buf_array.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/typed_buf_array.ll @@ -0,0 +1,587 @@ +; RUN: opt -S -dxil-typedbuf-lower < %s | FileCheck %s +target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64" +target triple = "dxil-unknown-shadermodel6.0-compute" + +;RWBuffer AU[2][64] : register(u2); +;RWBuffer AUI[64][2] : register(u2, space1); +;AU[ID%2][ID%64][ID] = AUI[5][1][ID]; + +; Check index for RWBuffer AUI[64][2]: register(u2, space1); AUI[5][1] -> 11 + 2 = 13. +;CHECK: %[[InputHDL:.+]] = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 1, i32 13, i1 false) +;CHECK: %[[ID:.+]] = tail call i32 @llvm.dx.thread.id(i32 0) + +;CHECK:%[[LD:.+]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle %[[InputHDL]], i32 %[[ID]], i32 poison) +;CHECK:%[[LD_X:.+]] = extractvalue %dx.types.ResRet.f32 %[[LD]], 0 + +; Check index for RWBuffer AU[2][64] : register(u2); AU[ID%2][ID%64]. +;CHECK: %[[REM2:.+]] = and i32 %[[ID]], 1 +;CHECK: %[[REM64:.+]] = and i32 %[[ID]], 63 +;CHECK: %[[ArrayIndexHigh:.+]] = mul i32 %[[REM2]], 64 +;CHECK: %[[ArrayIndex:.+]] = add i32 %[[ArrayIndexHigh]], %[[REM64]] +;CHECK: %[[ResIndex:.+]] = add i32 2, %[[ArrayIndex]] + +;CHECK:%[[OutputHDL:.+]] = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 %[[ResIndex]], i1 false) +;CHECK:call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle %[[OutputHDL]], i32 %[[ID]], i32 poison, float %[[LD_X]], float poison, float poison, float poison, i8 1) +;CHECK-NEXT:ret void + +%"class.hlsl::RWBuffer" = type { ptr } + +@"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A" = local_unnamed_addr global [2 x [64 x %"class.hlsl::RWBuffer"]] zeroinitializer, align 4 +@"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A" = local_unnamed_addr global [64 x [2 x %"class.hlsl::RWBuffer"]] zeroinitializer, align 4 + +; Function Attrs: mustprogress norecurse nounwind willreturn +define void @main() local_unnamed_addr #0 { +entry: + %0 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %0, ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", align 4, !tbaa !6 + %1 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %1, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 1), align 4, !tbaa !6 + %2 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %2, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 2), align 4, !tbaa !6 + %3 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %3, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 3), align 4, !tbaa !6 + %4 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %4, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 4), align 4, !tbaa !6 + %5 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %5, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 5), align 4, !tbaa !6 + %6 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %6, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 6), align 4, !tbaa !6 + %7 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %7, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 7), align 4, !tbaa !6 + %8 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %8, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 8), align 4, !tbaa !6 + %9 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %9, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 9), align 4, !tbaa !6 + %10 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %10, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 10), align 4, !tbaa !6 + %11 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %11, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 11), align 4, !tbaa !6 + %12 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %12, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 12), align 4, !tbaa !6 + %13 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %13, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 13), align 4, !tbaa !6 + %14 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %14, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 14), align 4, !tbaa !6 + %15 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %15, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 15), align 4, !tbaa !6 + %16 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %16, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 16), align 4, !tbaa !6 + %17 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %17, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 17), align 4, !tbaa !6 + %18 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %18, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 18), align 4, !tbaa !6 + %19 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %19, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 19), align 4, !tbaa !6 + %20 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %20, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 20), align 4, !tbaa !6 + %21 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %21, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 21), align 4, !tbaa !6 + %22 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %22, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 22), align 4, !tbaa !6 + %23 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %23, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 23), align 4, !tbaa !6 + %24 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %24, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 24), align 4, !tbaa !6 + %25 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %25, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 25), align 4, !tbaa !6 + %26 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %26, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 26), align 4, !tbaa !6 + %27 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %27, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 27), align 4, !tbaa !6 + %28 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %28, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 28), align 4, !tbaa !6 + %29 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %29, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 29), align 4, !tbaa !6 + %30 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %30, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 30), align 4, !tbaa !6 + %31 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %31, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 31), align 4, !tbaa !6 + %32 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %32, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 32), align 4, !tbaa !6 + %33 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %33, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 33), align 4, !tbaa !6 + %34 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %34, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 34), align 4, !tbaa !6 + %35 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %35, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 35), align 4, !tbaa !6 + %36 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %36, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 36), align 4, !tbaa !6 + %37 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %37, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 37), align 4, !tbaa !6 + %38 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %38, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 38), align 4, !tbaa !6 + %39 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %39, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 39), align 4, !tbaa !6 + %40 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %40, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 40), align 4, !tbaa !6 + %41 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %41, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 41), align 4, !tbaa !6 + %42 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %42, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 42), align 4, !tbaa !6 + %43 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %43, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 43), align 4, !tbaa !6 + %44 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %44, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 44), align 4, !tbaa !6 + %45 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %45, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 45), align 4, !tbaa !6 + %46 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %46, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 46), align 4, !tbaa !6 + %47 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %47, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 47), align 4, !tbaa !6 + %48 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %48, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 48), align 4, !tbaa !6 + %49 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %49, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 49), align 4, !tbaa !6 + %50 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %50, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 50), align 4, !tbaa !6 + %51 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %51, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 51), align 4, !tbaa !6 + %52 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %52, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 52), align 4, !tbaa !6 + %53 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %53, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 53), align 4, !tbaa !6 + %54 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %54, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 54), align 4, !tbaa !6 + %55 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %55, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 55), align 4, !tbaa !6 + %56 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %56, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 56), align 4, !tbaa !6 + %57 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %57, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 57), align 4, !tbaa !6 + %58 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %58, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 58), align 4, !tbaa !6 + %59 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %59, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 59), align 4, !tbaa !6 + %60 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %60, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 60), align 4, !tbaa !6 + %61 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %61, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 61), align 4, !tbaa !6 + %62 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %62, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 62), align 4, !tbaa !6 + %63 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %63, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 63), align 4, !tbaa !6 + %64 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %64, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 0), align 4, !tbaa !6 + %65 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %65, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 1), align 4, !tbaa !6 + %66 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %66, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 2), align 4, !tbaa !6 + %67 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %67, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 3), align 4, !tbaa !6 + %68 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %68, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 4), align 4, !tbaa !6 + %69 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %69, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 5), align 4, !tbaa !6 + %70 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %70, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 6), align 4, !tbaa !6 + %71 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %71, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 7), align 4, !tbaa !6 + %72 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %72, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 8), align 4, !tbaa !6 + %73 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %73, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 9), align 4, !tbaa !6 + %74 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %74, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 10), align 4, !tbaa !6 + %75 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %75, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 11), align 4, !tbaa !6 + %76 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %76, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 12), align 4, !tbaa !6 + %77 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %77, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 13), align 4, !tbaa !6 + %78 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %78, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 14), align 4, !tbaa !6 + %79 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %79, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 15), align 4, !tbaa !6 + %80 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %80, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 16), align 4, !tbaa !6 + %81 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %81, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 17), align 4, !tbaa !6 + %82 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %82, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 18), align 4, !tbaa !6 + %83 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %83, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 19), align 4, !tbaa !6 + %84 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %84, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 20), align 4, !tbaa !6 + %85 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %85, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 21), align 4, !tbaa !6 + %86 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %86, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 22), align 4, !tbaa !6 + %87 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %87, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 23), align 4, !tbaa !6 + %88 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %88, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 24), align 4, !tbaa !6 + %89 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %89, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 25), align 4, !tbaa !6 + %90 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %90, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 26), align 4, !tbaa !6 + %91 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %91, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 27), align 4, !tbaa !6 + %92 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %92, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 28), align 4, !tbaa !6 + %93 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %93, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 29), align 4, !tbaa !6 + %94 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %94, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 30), align 4, !tbaa !6 + %95 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %95, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 31), align 4, !tbaa !6 + %96 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %96, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 32), align 4, !tbaa !6 + %97 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %97, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 33), align 4, !tbaa !6 + %98 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %98, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 34), align 4, !tbaa !6 + %99 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %99, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 35), align 4, !tbaa !6 + %100 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %100, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 36), align 4, !tbaa !6 + %101 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %101, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 37), align 4, !tbaa !6 + %102 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %102, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 38), align 4, !tbaa !6 + %103 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %103, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 39), align 4, !tbaa !6 + %104 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %104, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 40), align 4, !tbaa !6 + %105 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %105, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 41), align 4, !tbaa !6 + %106 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %106, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 42), align 4, !tbaa !6 + %107 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %107, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 43), align 4, !tbaa !6 + %108 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %108, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 44), align 4, !tbaa !6 + %109 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %109, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 45), align 4, !tbaa !6 + %110 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %110, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 46), align 4, !tbaa !6 + %111 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %111, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 47), align 4, !tbaa !6 + %112 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %112, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 48), align 4, !tbaa !6 + %113 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %113, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 49), align 4, !tbaa !6 + %114 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %114, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 50), align 4, !tbaa !6 + %115 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %115, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 51), align 4, !tbaa !6 + %116 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %116, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 52), align 4, !tbaa !6 + %117 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %117, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 53), align 4, !tbaa !6 + %118 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %118, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 54), align 4, !tbaa !6 + %119 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %119, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 55), align 4, !tbaa !6 + %120 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %120, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 56), align 4, !tbaa !6 + %121 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %121, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 57), align 4, !tbaa !6 + %122 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %122, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 58), align 4, !tbaa !6 + %123 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %123, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 59), align 4, !tbaa !6 + %124 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %124, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 60), align 4, !tbaa !6 + %125 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %125, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 61), align 4, !tbaa !6 + %126 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %126, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 62), align 4, !tbaa !6 + %127 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %127, ptr getelementptr inbounds ([2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 63), align 4, !tbaa !6 + %128 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %128, ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", align 4, !tbaa !6 + %129 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %129, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 0, i32 1), align 4, !tbaa !6 + %130 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %130, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 0), align 4, !tbaa !6 + %131 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %131, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 1, i32 1), align 4, !tbaa !6 + %132 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %132, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 2, i32 0), align 4, !tbaa !6 + %133 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %133, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 2, i32 1), align 4, !tbaa !6 + %134 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %134, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 3, i32 0), align 4, !tbaa !6 + %135 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %135, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 3, i32 1), align 4, !tbaa !6 + %136 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %136, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 4, i32 0), align 4, !tbaa !6 + %137 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %137, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 4, i32 1), align 4, !tbaa !6 + %138 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %138, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 5, i32 0), align 4, !tbaa !6 + %139 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %139, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 5, i32 1), align 4, !tbaa !6 + %140 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %140, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 6, i32 0), align 4, !tbaa !6 + %141 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %141, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 6, i32 1), align 4, !tbaa !6 + %142 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %142, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 7, i32 0), align 4, !tbaa !6 + %143 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %143, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 7, i32 1), align 4, !tbaa !6 + %144 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %144, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 8, i32 0), align 4, !tbaa !6 + %145 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %145, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 8, i32 1), align 4, !tbaa !6 + %146 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %146, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 9, i32 0), align 4, !tbaa !6 + %147 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %147, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 9, i32 1), align 4, !tbaa !6 + %148 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %148, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 10, i32 0), align 4, !tbaa !6 + %149 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %149, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 10, i32 1), align 4, !tbaa !6 + %150 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %150, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 11, i32 0), align 4, !tbaa !6 + %151 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %151, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 11, i32 1), align 4, !tbaa !6 + %152 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %152, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 12, i32 0), align 4, !tbaa !6 + %153 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %153, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 12, i32 1), align 4, !tbaa !6 + %154 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %154, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 13, i32 0), align 4, !tbaa !6 + %155 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %155, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 13, i32 1), align 4, !tbaa !6 + %156 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %156, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 14, i32 0), align 4, !tbaa !6 + %157 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %157, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 14, i32 1), align 4, !tbaa !6 + %158 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %158, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 15, i32 0), align 4, !tbaa !6 + %159 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %159, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 15, i32 1), align 4, !tbaa !6 + %160 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %160, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 16, i32 0), align 4, !tbaa !6 + %161 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %161, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 16, i32 1), align 4, !tbaa !6 + %162 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %162, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 17, i32 0), align 4, !tbaa !6 + %163 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %163, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 17, i32 1), align 4, !tbaa !6 + %164 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %164, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 18, i32 0), align 4, !tbaa !6 + %165 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %165, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 18, i32 1), align 4, !tbaa !6 + %166 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %166, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 19, i32 0), align 4, !tbaa !6 + %167 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %167, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 19, i32 1), align 4, !tbaa !6 + %168 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %168, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 20, i32 0), align 4, !tbaa !6 + %169 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %169, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 20, i32 1), align 4, !tbaa !6 + %170 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %170, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 21, i32 0), align 4, !tbaa !6 + %171 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %171, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 21, i32 1), align 4, !tbaa !6 + %172 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %172, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 22, i32 0), align 4, !tbaa !6 + %173 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %173, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 22, i32 1), align 4, !tbaa !6 + %174 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %174, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 23, i32 0), align 4, !tbaa !6 + %175 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %175, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 23, i32 1), align 4, !tbaa !6 + %176 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %176, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 24, i32 0), align 4, !tbaa !6 + %177 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %177, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 24, i32 1), align 4, !tbaa !6 + %178 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %178, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 25, i32 0), align 4, !tbaa !6 + %179 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %179, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 25, i32 1), align 4, !tbaa !6 + %180 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %180, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 26, i32 0), align 4, !tbaa !6 + %181 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %181, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 26, i32 1), align 4, !tbaa !6 + %182 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %182, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 27, i32 0), align 4, !tbaa !6 + %183 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %183, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 27, i32 1), align 4, !tbaa !6 + %184 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %184, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 28, i32 0), align 4, !tbaa !6 + %185 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %185, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 28, i32 1), align 4, !tbaa !6 + %186 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %186, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 29, i32 0), align 4, !tbaa !6 + %187 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %187, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 29, i32 1), align 4, !tbaa !6 + %188 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %188, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 30, i32 0), align 4, !tbaa !6 + %189 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %189, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 30, i32 1), align 4, !tbaa !6 + %190 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %190, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 31, i32 0), align 4, !tbaa !6 + %191 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %191, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 31, i32 1), align 4, !tbaa !6 + %192 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %192, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 32, i32 0), align 4, !tbaa !6 + %193 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %193, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 32, i32 1), align 4, !tbaa !6 + %194 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %194, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 33, i32 0), align 4, !tbaa !6 + %195 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %195, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 33, i32 1), align 4, !tbaa !6 + %196 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %196, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 34, i32 0), align 4, !tbaa !6 + %197 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %197, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 34, i32 1), align 4, !tbaa !6 + %198 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %198, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 35, i32 0), align 4, !tbaa !6 + %199 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %199, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 35, i32 1), align 4, !tbaa !6 + %200 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %200, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 36, i32 0), align 4, !tbaa !6 + %201 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %201, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 36, i32 1), align 4, !tbaa !6 + %202 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %202, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 37, i32 0), align 4, !tbaa !6 + %203 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %203, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 37, i32 1), align 4, !tbaa !6 + %204 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %204, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 38, i32 0), align 4, !tbaa !6 + %205 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %205, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 38, i32 1), align 4, !tbaa !6 + %206 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %206, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 39, i32 0), align 4, !tbaa !6 + %207 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %207, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 39, i32 1), align 4, !tbaa !6 + %208 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %208, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 40, i32 0), align 4, !tbaa !6 + %209 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %209, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 40, i32 1), align 4, !tbaa !6 + %210 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %210, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 41, i32 0), align 4, !tbaa !6 + %211 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %211, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 41, i32 1), align 4, !tbaa !6 + %212 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %212, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 42, i32 0), align 4, !tbaa !6 + %213 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %213, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 42, i32 1), align 4, !tbaa !6 + %214 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %214, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 43, i32 0), align 4, !tbaa !6 + %215 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %215, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 43, i32 1), align 4, !tbaa !6 + %216 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %216, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 44, i32 0), align 4, !tbaa !6 + %217 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %217, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 44, i32 1), align 4, !tbaa !6 + %218 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %218, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 45, i32 0), align 4, !tbaa !6 + %219 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %219, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 45, i32 1), align 4, !tbaa !6 + %220 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %220, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 46, i32 0), align 4, !tbaa !6 + %221 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %221, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 46, i32 1), align 4, !tbaa !6 + %222 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %222, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 47, i32 0), align 4, !tbaa !6 + %223 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %223, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 47, i32 1), align 4, !tbaa !6 + %224 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %224, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 48, i32 0), align 4, !tbaa !6 + %225 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %225, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 48, i32 1), align 4, !tbaa !6 + %226 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %226, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 49, i32 0), align 4, !tbaa !6 + %227 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %227, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 49, i32 1), align 4, !tbaa !6 + %228 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %228, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 50, i32 0), align 4, !tbaa !6 + %229 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %229, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 50, i32 1), align 4, !tbaa !6 + %230 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %230, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 51, i32 0), align 4, !tbaa !6 + %231 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %231, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 51, i32 1), align 4, !tbaa !6 + %232 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %232, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 52, i32 0), align 4, !tbaa !6 + %233 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %233, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 52, i32 1), align 4, !tbaa !6 + %234 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %234, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 53, i32 0), align 4, !tbaa !6 + %235 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %235, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 53, i32 1), align 4, !tbaa !6 + %236 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %236, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 54, i32 0), align 4, !tbaa !6 + %237 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %237, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 54, i32 1), align 4, !tbaa !6 + %238 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %238, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 55, i32 0), align 4, !tbaa !6 + %239 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %239, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 55, i32 1), align 4, !tbaa !6 + %240 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %240, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 56, i32 0), align 4, !tbaa !6 + %241 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %241, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 56, i32 1), align 4, !tbaa !6 + %242 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %242, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 57, i32 0), align 4, !tbaa !6 + %243 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %243, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 57, i32 1), align 4, !tbaa !6 + %244 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %244, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 58, i32 0), align 4, !tbaa !6 + %245 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %245, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 58, i32 1), align 4, !tbaa !6 + %246 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %246, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 59, i32 0), align 4, !tbaa !6 + %247 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %247, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 59, i32 1), align 4, !tbaa !6 + %248 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %248, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 60, i32 0), align 4, !tbaa !6 + %249 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %249, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 60, i32 1), align 4, !tbaa !6 + %250 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %250, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 61, i32 0), align 4, !tbaa !6 + %251 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %251, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 61, i32 1), align 4, !tbaa !6 + %252 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %252, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 62, i32 0), align 4, !tbaa !6 + %253 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %253, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 62, i32 1), align 4, !tbaa !6 + %254 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %254, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 63, i32 0), align 4, !tbaa !6 + %255 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %255, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 63, i32 1), align 4, !tbaa !6 + %256 = tail call i32 @llvm.dx.thread.id(i32 0) + %257 = load ptr, ptr getelementptr inbounds ([64 x [2 x %"class.hlsl::RWBuffer"]], ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", i32 0, i32 5, i32 1), align 4, !tbaa !6 + %arrayidx.i.i = getelementptr inbounds float, ptr %257, i32 %256 + %258 = load float, ptr %arrayidx.i.i, align 4, !tbaa !11 + %rem.i = and i32 %256, 1 + %rem1.i = and i32 %256, 63 + %arrayidx2.i = getelementptr inbounds [2 x [64 x %"class.hlsl::RWBuffer"]], ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", i32 0, i32 %rem.i, i32 %rem1.i + %259 = load ptr, ptr %arrayidx2.i, align 4, !tbaa !6 + %arrayidx.i7.i = getelementptr inbounds float, ptr %259, i32 %256 + store float %258, ptr %arrayidx.i7.i, align 4, !tbaa !11 + ret void +} + +; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn +declare i32 @llvm.dx.thread.id(i32 %0) #1 + +; Function Attrs: mustprogress nounwind willreturn +declare ptr @llvm.dx.create.handle(i8 %0) #2 + +attributes #0 = { mustprogress norecurse nounwind willreturn "frame-pointer"="all" "hlsl.numthreads"="64,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } +attributes #1 = { mustprogress nofree nosync nounwind readnone willreturn } +attributes #2 = { mustprogress nounwind willreturn } + +!hlsl.uavs = !{!0, !1} +!llvm.module.flags = !{!2, !3} +!dx.valver = !{!4} +!llvm.ident = !{!5} + +!0 = !{ptr @"?AU@@3PAY0EA@V?$RWBuffer@M@hlsl@@A", !"RWBuffer", i32 0, i32 10, i32 2, i32 0} +!1 = !{ptr @"?AUI@@3PAY01V?$RWBuffer@M@hlsl@@A", !"RWBuffer", i32 1, i32 10, i32 2, i32 1} +!2 = !{i32 1, !"wchar_size", i32 4} +!3 = !{i32 7, !"frame-pointer", i32 2} +!4 = !{i32 1, i32 7} +!5 = !{!"clang version 16.0.0 (https://github.com/llvm/llvm-project.git 0b4d05611d4745493490893d0e61b73e947d08d6)"} +!6 = !{!7, !8, i64 0} +!7 = !{!"?AV?$RWBuffer@M@hlsl@@", !8, i64 0} +!8 = !{!"any pointer", !9, i64 0} +!9 = !{!"omnipotent char", !10, i64 0} +!10 = !{!"Simple C++ TBAA"} +!11 = !{!12, !12, i64 0} +!12 = !{!"float", !9, i64 0} diff --git a/llvm/test/CodeGen/DirectX/typed_buf_array2.ll b/llvm/test/CodeGen/DirectX/typed_buf_array2.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/typed_buf_array2.ll @@ -0,0 +1,123 @@ +; RUN: opt -S -dxil-typedbuf-lower < %s | FileCheck %s + +;RWBuffer AU[16] : register(u2); +; AU[ID%16][ID] = AU[5][ID]; +; AU[(ID+8)%16][ID] = AU[3][ID]; + +target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64" +target triple = "dxil-unknown-shadermodel6.0-compute" + + +; CHECK: %[[HDL3:.+]] = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 5, i1 false) +; CHECK: %[[HDL5:.+]] = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 7, i1 false) + +; CHECK: %[[ID:.+]] = tail call i32 @llvm.dx.thread.id(i32 0) + +; CHECK: %[[LD1:.+]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle %[[HDL5]], i32 %[[ID]], i32 poison) +; CHECK: %[[LD1_X:.+]] = extractvalue %dx.types.ResRet.f32 %[[LD1]], 0 + +; CHECK: %[[REM16:.+]] = and i32 %[[ID]], 15 +; CHECK: %[[ResIndex1:.+]] = add i32 2, %[[REM16]] +; CHECK: %[[HDLREM16:.+]] = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 %[[ResIndex1]], i1 false) + +; CHECK: call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle %[[HDLREM16]], i32 %[[ID]], i32 poison, float %[[LD1_X]], float poison, float poison, float poison, i8 1) + + +; CHECK: %[[LD2:.+]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle %[[HDL3]], i32 %[[ID]], i32 poison) +; CHECK: %[[LD2_X:.+]] = extractvalue %dx.types.ResRet.f32 %[[LD2]], 0 + +; CHECK: %[[ID_8:.+]] = add i32 %18, 8 +; CHECK: %[[ID_8_REM16:.+]] = and i32 %[[ID_8]], 15 +; CHECK: %[[ResIndex2:.+]] = add i32 2, %[[ID_8_REM16]] +; CHECK: %[[HDL_ID8_REM16:.+]] = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 %[[ResIndex2]], i1 false) + +; CHECK: call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle %[[HDL_ID8_REM16]], i32 %[[ID]], i32 poison, float %[[LD2_X]], float poison, float poison, float poison, i8 1) +; CHECK-NEXT: ret void + +%"class.hlsl::RWBuffer" = type { ptr } + +@"?AU@@3PAV?$RWBuffer@M@hlsl@@A" = local_unnamed_addr global [16 x %"class.hlsl::RWBuffer"] zeroinitializer, align 4 + +; Function Attrs: mustprogress norecurse nounwind willreturn +define void @main() local_unnamed_addr #0 { +entry: + %0 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %0, ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", align 4, !tbaa !5 + %1 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %1, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 1), align 4, !tbaa !5 + %2 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %2, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 2), align 4, !tbaa !5 + %3 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %3, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 3), align 4, !tbaa !5 + %4 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %4, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 4), align 4, !tbaa !5 + %5 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %5, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 5), align 4, !tbaa !5 + %6 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %6, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 6), align 4, !tbaa !5 + %7 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %7, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 7), align 4, !tbaa !5 + %8 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %8, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 8), align 4, !tbaa !5 + %9 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %9, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 9), align 4, !tbaa !5 + %10 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %10, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 10), align 4, !tbaa !5 + %11 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %11, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 11), align 4, !tbaa !5 + %12 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %12, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 12), align 4, !tbaa !5 + %13 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %13, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 13), align 4, !tbaa !5 + %14 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %14, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 14), align 4, !tbaa !5 + %15 = tail call ptr @llvm.dx.create.handle(i8 1) + store ptr %15, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 15), align 4, !tbaa !5 + %16 = tail call i32 @llvm.dx.thread.id(i32 0) + %17 = load ptr, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 5), align 4, !tbaa !5 + %arrayidx.i.i = getelementptr inbounds float, ptr %17, i32 %16 + %18 = load float, ptr %arrayidx.i.i, align 4, !tbaa !10 + %rem.i = and i32 %16, 15 + %arrayidx.i = getelementptr inbounds [16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 %rem.i + %19 = load ptr, ptr %arrayidx.i, align 4, !tbaa !5 + %arrayidx.i11.i = getelementptr inbounds float, ptr %19, i32 %16 + store float %18, ptr %arrayidx.i11.i, align 4, !tbaa !10 + %20 = load ptr, ptr getelementptr inbounds ([16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 3), align 4, !tbaa !5 + %arrayidx.i12.i = getelementptr inbounds float, ptr %20, i32 %16 + %21 = load float, ptr %arrayidx.i12.i, align 4, !tbaa !10 + %add.i = add i32 %16, 8 + %rem3.i = and i32 %add.i, 15 + %arrayidx4.i = getelementptr inbounds [16 x %"class.hlsl::RWBuffer"], ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", i32 0, i32 %rem3.i + %22 = load ptr, ptr %arrayidx4.i, align 4, !tbaa !5 + %arrayidx.i13.i = getelementptr inbounds float, ptr %22, i32 %16 + store float %21, ptr %arrayidx.i13.i, align 4, !tbaa !10 + ret void +} + +; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn +declare i32 @llvm.dx.thread.id(i32 %0) #1 + +; Function Attrs: mustprogress nounwind willreturn +declare ptr @llvm.dx.create.handle(i8 %0) #2 + +attributes #0 = { mustprogress norecurse nounwind willreturn "frame-pointer"="all" "hlsl.numthreads"="8,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } +attributes #1 = { mustprogress nofree nosync nounwind readnone willreturn } +attributes #2 = { mustprogress nounwind willreturn } + +!hlsl.uavs = !{!0} +!llvm.module.flags = !{!1, !2} +!dx.valver = !{!3} +!llvm.ident = !{!4} + +!0 = !{ptr @"?AU@@3PAV?$RWBuffer@M@hlsl@@A", !"RWBuffer", i32 0, i32 10, i32 2, i32 0} +!1 = !{i32 1, !"wchar_size", i32 4} +!2 = !{i32 7, !"frame-pointer", i32 2} +!3 = !{i32 1, i32 7} +!4 = !{!"clang version 16.0.0 (https://github.com/llvm/llvm-project.git 0b4d05611d4745493490893d0e61b73e947d08d6)"} +!5 = !{!6, !7, i64 0} +!6 = !{!"?AV?$RWBuffer@M@hlsl@@", !7, i64 0} +!7 = !{!"any pointer", !8, i64 0} +!8 = !{!"omnipotent char", !9, i64 0} +!9 = !{!"Simple C++ TBAA"} +!10 = !{!11, !11, i64 0} +!11 = !{!"float", !8, i64 0}