diff --git a/lib/HLSL/HLOperationLower.cpp b/lib/HLSL/HLOperationLower.cpp index 96ebda43ac..5a0dadf7f4 100644 --- a/lib/HLSL/HLOperationLower.cpp +++ b/lib/HLSL/HLOperationLower.cpp @@ -4335,18 +4335,15 @@ void Split64bitValForStore(Type *EltTy, ArrayRef vals, unsigned size, } void TranslateStore(DxilResource::Kind RK, Value *handle, Value *val, - Value *offset, IRBuilder<> &Builder, hlsl::OP *OP, - Value *sampIdx = nullptr) { + Value *Idx, Value *offset, IRBuilder<> &Builder, + hlsl::OP *OP, Value *sampIdx = nullptr) { Type *Ty = val->getType(); - - // This function is no longer used for lowering stores to a - // structured buffer. - DXASSERT_NOMSG(RK != DxilResource::Kind::StructuredBuffer); - OP::OpCode opcode = OP::OpCode::NumOpCodes; + bool IsTyped = true; switch (RK) { case DxilResource::Kind::RawBuffer: case DxilResource::Kind::StructuredBuffer: + IsTyped = false; opcode = OP::OpCode::RawBufferStore; break; case DxilResource::Kind::TypedBuffer: @@ -4364,10 +4361,6 @@ void TranslateStore(DxilResource::Kind RK, Value *handle, Value *val, break; } - bool isTyped = opcode == OP::OpCode::TextureStore || - opcode == OP::OpCode::TextureStoreSample || - RK == DxilResource::Kind::TypedBuffer; - Type *i32Ty = Builder.getInt32Ty(); Type *i64Ty = Builder.getInt64Ty(); Type *doubleTy = Builder.getDoubleTy(); @@ -4390,7 +4383,7 @@ void TranslateStore(DxilResource::Kind RK, Value *handle, Value *val, alignValue = 4; Constant *Alignment = OP->GetI32Const(alignValue); bool is64 = EltTy == i64Ty || EltTy == doubleTy; - if (is64 && isTyped) { + if (is64 && IsTyped) { EltTy = i32Ty; } @@ -4406,38 +4399,42 @@ void TranslateStore(DxilResource::Kind RK, Value *handle, Value *val, storeArgs.emplace_back(opArg); // opcode storeArgs.emplace_back(handle); // resource handle - unsigned offset0Idx = 0; - if (RK == DxilResource::Kind::RawBuffer || - RK == DxilResource::Kind::TypedBuffer) { - // Offset 0 - if (offset->getType()->isVectorTy()) { - Value *scalarOffset = Builder.CreateExtractElement(offset, (uint64_t)0); - storeArgs.emplace_back(scalarOffset); // offset + unsigned OffsetIdx = 0; + if (opcode == OP::OpCode::RawBufferStore || + opcode == OP::OpCode::BufferStore) { + // Append Coord0 (Index) value. + if (Idx->getType()->isVectorTy()) { + Value *ScalarIdx = Builder.CreateExtractElement(Idx, (uint64_t)0); + storeArgs.emplace_back(ScalarIdx); // Coord0 (Index). } else { - storeArgs.emplace_back(offset); // offset + storeArgs.emplace_back(Idx); // Coord0 (Index). } - // Store offset0 for later use - offset0Idx = storeArgs.size() - 1; + // Store OffsetIdx representing the argument that may need to be incremented + // later to load additional chunks of data. + // Only structured buffers can use the offset parameter. + // Others must increment the index. + if (RK == DxilResource::Kind::StructuredBuffer) + OffsetIdx = storeArgs.size(); + else + OffsetIdx = storeArgs.size() - 1; - // Offset 1 - storeArgs.emplace_back(undefI); + // Coord1 (Offset). + // Only relevant when storing more than 4 elements to structured buffers. + storeArgs.emplace_back(offset); } else { // texture store unsigned coordSize = DxilResource::GetNumCoords(RK); // Set x first. - if (offset->getType()->isVectorTy()) - storeArgs.emplace_back(Builder.CreateExtractElement(offset, (uint64_t)0)); + if (Idx->getType()->isVectorTy()) + storeArgs.emplace_back(Builder.CreateExtractElement(Idx, (uint64_t)0)); else - storeArgs.emplace_back(offset); - - // Store offset0 for later use - offset0Idx = storeArgs.size() - 1; + storeArgs.emplace_back(Idx); for (unsigned i = 1; i < 3; i++) { if (i < coordSize) - storeArgs.emplace_back(Builder.CreateExtractElement(offset, i)); + storeArgs.emplace_back(Builder.CreateExtractElement(Idx, i)); else storeArgs.emplace_back(undefI); } @@ -4464,30 +4461,24 @@ void TranslateStore(DxilResource::Kind RK, Value *handle, Value *val, } for (unsigned j = 0; j < storeArgsList.size(); j++) { - - // For second and subsequent store calls, increment the offset0 (i.e. store - // index) + // For second and subsequent store calls, increment the resource-appropriate + // index or offset parameter. if (j > 0) { - // Greater than four-components store is not allowed for - // TypedBuffer and Textures. So greater than four elements - // scenario should only get hit here for RawBuffer. - DXASSERT_NOMSG(RK == DxilResource::Kind::RawBuffer); unsigned EltSize = OP->GetAllocSizeForType(EltTy); - unsigned newOffset = EltSize * MaxStoreElemCount * j; - Value *newOffsetVal = ConstantInt::get(Builder.getInt32Ty(), newOffset); - newOffsetVal = - Builder.CreateAdd(storeArgsList[0][offset0Idx], newOffsetVal); - storeArgsList[j][offset0Idx] = newOffsetVal; + unsigned NewCoord = EltSize * MaxStoreElemCount * j; + Value *NewCoordVal = ConstantInt::get(Builder.getInt32Ty(), NewCoord); + NewCoordVal = Builder.CreateAdd(storeArgsList[0][OffsetIdx], NewCoordVal); + storeArgsList[j][OffsetIdx] = NewCoordVal; } - // values + // Set value parameters. uint8_t mask = 0; if (Ty->isVectorTy()) { unsigned vecSize = std::min((j + 1) * MaxStoreElemCount, Ty->getVectorNumElements()) - (j * MaxStoreElemCount); Value *emptyVal = undefVal; - if (isTyped) { + if (IsTyped) { mask = DXIL::kCompMask_All; emptyVal = Builder.CreateExtractElement(val, (uint64_t)0); } @@ -4503,7 +4494,7 @@ void TranslateStore(DxilResource::Kind RK, Value *handle, Value *val, } } else { - if (isTyped) { + if (IsTyped) { mask = DXIL::kCompMask_All; storeArgsList[j].emplace_back(val); storeArgsList[j].emplace_back(val); @@ -4518,7 +4509,7 @@ void TranslateStore(DxilResource::Kind RK, Value *handle, Value *val, } } - if (is64 && isTyped) { + if (is64 && IsTyped) { unsigned size = 1; if (Ty->isVectorTy()) { size = @@ -4576,7 +4567,8 @@ Value *TranslateResourceStore(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode, Value *val = CI->getArgOperand(HLOperandIndex::kStoreValOpIdx); Value *offset = CI->getArgOperand(HLOperandIndex::kStoreOffsetOpIdx); - TranslateStore(RK, handle, val, offset, Builder, hlslOP); + Value *UndefI = UndefValue::get(Builder.getInt32Ty()); + TranslateStore(RK, handle, val, offset, UndefI, Builder, hlslOP); return nullptr; } @@ -7907,40 +7899,11 @@ Value *TranslateStructBufMatLd(CallInst *CI, IRBuilder<> &Builder, void TranslateStructBufMatSt(Type *matType, IRBuilder<> &Builder, Value *handle, hlsl::OP *OP, Value *bufIdx, Value *baseOffset, Value *val, const DataLayout &DL) { - HLMatrixType MatTy = HLMatrixType::cast(matType); - Type *EltTy = MatTy.getElementTypeForMem(); - - val = MatTy.emitLoweredRegToMem(val, Builder); - - unsigned EltSize = DL.getTypeAllocSize(EltTy); - Constant *Alignment = OP->GetI32Const(EltSize); - Value *offset = baseOffset; - if (baseOffset == nullptr) - offset = OP->GetU32Const(0); - - unsigned matSize = MatTy.getNumElements(); - Value *undefElt = UndefValue::get(EltTy); - - unsigned storeSize = matSize; - if (matSize % 4) { - storeSize = matSize + 4 - (matSize & 3); - } - std::vector elts(storeSize, undefElt); - for (unsigned i = 0; i < matSize; i++) - elts[i] = Builder.CreateExtractElement(val, i); - - for (unsigned i = 0; i < matSize; i += 4) { - uint8_t mask = 0; - for (unsigned j = 0; j < 4 && (i + j) < matSize; j++) { - if (elts[i + j] != undefElt) - mask |= (1 << j); - } - GenerateStructBufSt(handle, bufIdx, offset, EltTy, OP, Builder, - {elts[i], elts[i + 1], elts[i + 2], elts[i + 3]}, mask, - Alignment); - // Update offset by 4*4bytes. - offset = Builder.CreateAdd(offset, OP->GetU32Const(4 * EltSize)); - } + [[maybe_unused]] HLMatrixType MatTy = HLMatrixType::cast(matType); + DXASSERT(MatTy.getLoweredVectorType(false /*MemRepr*/) == val->getType(), + "helper type should match vectorized matrix"); + TranslateStore(DxilResource::Kind::StructuredBuffer, handle, val, bufIdx, + baseOffset, Builder, OP); } void TranslateStructBufMatLdSt(CallInst *CI, Value *handle, HLResource::Kind RK, @@ -8085,6 +8048,9 @@ void TranslateStructBufMatSubscript(CallInst *CI, Value *handle, GEP->eraseFromParent(); } else if (StoreInst *stUser = dyn_cast(subsUser)) { + // Store elements of matrix in a struct. Needs to be done one scalar at a + // time even for vectors in the case that matrix orientation spreads the + // indexed scalars throughout the matrix vector. IRBuilder<> stBuilder(stUser); Value *Val = stUser->getValueOperand(); if (Val->getType()->isVectorTy()) { @@ -8108,6 +8074,9 @@ void TranslateStructBufMatSubscript(CallInst *CI, Value *handle, LoadInst *ldUser = cast(subsUser); IRBuilder<> ldBuilder(ldUser); Value *ldData = UndefValue::get(resultType); + // Load elements of matrix in a struct. Needs to be done one scalar at a + // time even for vectors in the case that matrix orientation spreads the + // indexed scalars throughout the matrix vector. if (resultType->isVectorTy()) { for (unsigned i = 0; i < resultSize; i++) { Value *ResultElt; @@ -8248,30 +8217,9 @@ void TranslateStructBufSubscriptUser(Instruction *user, Value *handle, LdInst->eraseFromParent(); } else if (StoreInst *StInst = dyn_cast(user)) { // Store of scalar/vector within a struct or structured raw store. - Type *Ty = StInst->getValueOperand()->getType(); - Type *pOverloadTy = Ty->getScalarType(); - Value *offset = baseOffset; - Value *val = StInst->getValueOperand(); - Value *undefVal = llvm::UndefValue::get(pOverloadTy); - Value *vals[] = {undefVal, undefVal, undefVal, undefVal}; - uint8_t mask = 0; - if (Ty->isVectorTy()) { - unsigned vectorNumElements = Ty->getVectorNumElements(); - DXASSERT(vectorNumElements <= 4, "up to 4 elements in vector"); - assert(vectorNumElements <= 4); - for (unsigned i = 0; i < vectorNumElements; i++) { - vals[i] = Builder.CreateExtractElement(val, i); - mask |= (1 << i); - } - } else { - vals[0] = val; - mask = DXIL::kCompMask_X; - } - Constant *alignment = - OP->GetI32Const(DL.getTypeAllocSize(Ty->getScalarType())); - GenerateStructBufSt(handle, bufIdx, offset, pOverloadTy, OP, Builder, vals, - mask, alignment); + TranslateStore(DxilResource::Kind::StructuredBuffer, handle, val, bufIdx, + baseOffset, Builder, OP); StInst->eraseFromParent(); } else if (BitCastInst *BCI = dyn_cast(user)) { // Recurse users @@ -8418,14 +8366,15 @@ void TranslateTypedBufferSubscript(CallInst *CI, HLOperationLowerHelper &helper, User *user = *(It++); Instruction *I = cast(user); IRBuilder<> Builder(I); + Value *UndefI = UndefValue::get(Builder.getInt32Ty()); if (LoadInst *ldInst = dyn_cast(user)) { TranslateTypedBufSubscript(CI, RK, RC, handle, ldInst, Builder, hlslOP, helper.dataLayout); } else if (StoreInst *stInst = dyn_cast(user)) { Value *val = stInst->getValueOperand(); TranslateStore(RK, handle, val, - CI->getArgOperand(HLOperandIndex::kStoreOffsetOpIdx), - Builder, hlslOP); + CI->getArgOperand(HLOperandIndex::kSubscriptIndexOpIdx), + UndefI, Builder, hlslOP); // delete the st stInst->eraseFromParent(); } else if (GetElementPtrInst *GEP = dyn_cast(user)) { @@ -8450,9 +8399,10 @@ void TranslateTypedBufferSubscript(CallInst *CI, HLOperationLowerHelper &helper, // Generate St. // Reset insert point, UpdateVectorElt may move SI to different block. StBuilder.SetInsertPoint(SI); - TranslateStore(RK, handle, ldVal, - CI->getArgOperand(HLOperandIndex::kStoreOffsetOpIdx), - StBuilder, hlslOP); + TranslateStore( + RK, handle, ldVal, + CI->getArgOperand(HLOperandIndex::kSubscriptIndexOpIdx), UndefI, + StBuilder, hlslOP); SI->eraseFromParent(); continue; } @@ -8642,9 +8592,10 @@ void TranslateHLSubscript(CallInst *CI, HLSubscriptOpcode opcode, } else { StoreInst *stInst = cast(*U); Value *val = stInst->getValueOperand(); + Value *UndefI = UndefValue::get(Builder.getInt32Ty()); TranslateStore(RK, handle, val, - CI->getArgOperand(HLOperandIndex::kStoreOffsetOpIdx), - Builder, hlslOP, mipLevel); + CI->getArgOperand(HLOperandIndex::kSubscriptIndexOpIdx), + UndefI, Builder, hlslOP, mipLevel); stInst->eraseFromParent(); } Translated = true; diff --git a/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-store.hlsl b/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-store.hlsl new file mode 100644 index 0000000000..fa070ceca5 --- /dev/null +++ b/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-store.hlsl @@ -0,0 +1,192 @@ +// RUN: %dxc -fcgl -T vs_6_6 %s | FileCheck %s + +// Source file for DxilGen IR test for buffer store lowering + +template +struct Vector { + float4 pad1; + double pad2; + vector v; + Vector operator+(Vector vec) { + Vector ret; + ret.pad1 = 0.0; + ret.pad2 = 0.0; + ret.v = v + vec.v; + return ret; + } +}; + +template +struct Matrix { + float4 pad1; + matrix m; + Matrix operator+(Matrix mat) { + Matrix ret; + ret.m = m + mat.m; + return ret; + } +}; + +RWByteAddressBuffer BabBuf : register(u1); +RWStructuredBuffer< float2 > VecBuf : register(u2); +RWStructuredBuffer< float[2] > ArrBuf : register(u3); +RWStructuredBuffer< Vector > SVecBuf : register(u4); +RWStructuredBuffer< float2x2 > MatBuf : register(u5); +RWStructuredBuffer< Matrix > SMatBuf : register(u6); + +ConsumeStructuredBuffer< float2 > CVecBuf : register(u7); +ConsumeStructuredBuffer< float[2] > CArrBuf : register(u8); +ConsumeStructuredBuffer< Vector > CSVecBuf : register(u9); +ConsumeStructuredBuffer< float2x2 > CMatBuf : register(u10); +ConsumeStructuredBuffer< Matrix > CSMatBuf : register(u11); + +AppendStructuredBuffer< float2 > AVecBuf : register(u12); +AppendStructuredBuffer< float[2] > AArrBuf : register(u13); +AppendStructuredBuffer< Vector > ASVecBuf : register(u14); +AppendStructuredBuffer< float2x2 > AMatBuf : register(u15); +AppendStructuredBuffer< Matrix > ASMatBuf : register(u16); + +void main(uint ix0 : IX0) { + + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 0 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %struct.RWByteAddressBuffer + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer undef) + // CHECK: call <2 x i1> @"dx.hl.op.ro.<2 x i1> (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 1 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %struct.RWByteAddressBuffer + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer undef) + // CHECK: call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, <2 x i1>)"(i32 277, %dx.types.Handle [[anhdl]], i32 [[ix]], <2 x i1> + BabBuf.Store(ix0 + 1, BabBuf.Load< bool2 >(ix0 + 0)); + + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 1 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %struct.RWByteAddressBuffer + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer undef) + // CHECK: call [2 x float]* @"dx.hl.op.ro.[2 x float]* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 2 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %struct.RWByteAddressBuffer + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer undef) + // CHECK: call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, [2 x float]*)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]], [2 x float] + BabBuf.Store(ix0 + 2, BabBuf.Load< float[2] >(ix0 + 1)); + + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 2 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %struct.RWByteAddressBuffer + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer undef) + // CHECK: call %"struct.Vector"* @"dx.hl.op.ro.%\22struct.Vector\22* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 3 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %struct.RWByteAddressBuffer + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer undef) + // CHECK: call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, %\22struct.Vector\22*)"(i32 277, %dx.types.Handle [[anhdl]], i32 [[ix]], %"struct.Vector" + BabBuf.Store >(ix0 + 3, BabBuf.Load< Vector >(ix0 + 2)); + + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 3 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %struct.RWByteAddressBuffer + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer undef) + // CHECK: call %class.matrix.float.2.2 @"dx.hl.op.ro.%class.matrix.float.2.2 (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 4 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %struct.RWByteAddressBuffer + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer undef) + // CHECK: call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, %class.matrix.float.2.2)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]], %class.matrix.float.2.2 + BabBuf.Store(ix0 + 4, BabBuf.Load< float2x2 >(ix0 + 3)); + + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 4 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %struct.RWByteAddressBuffer + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer undef) + // CHECK: [[MSS:%.*]] = call %"struct.Matrix"* @"dx.hl.op.ro.%\22struct.Matrix\22* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 5 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %struct.RWByteAddressBuffer + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer undef) + // CHECK: call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, %\22struct.Matrix\22*)"(i32 277, %dx.types.Handle [[anhdl]], i32 [[ix]], %"struct.Matrix" + BabBuf.Store >(ix0 + 5, BabBuf.Load< Matrix >(ix0 + 4)); + + + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 0 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 {{[0-9]*}}, %"class.RWStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.RWStructuredBuffer >" undef) + // CHECK: call <2 x float>* @"dx.hl.subscript.[].rn.<2 x float>* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]] + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 1 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 {{[0-9]*}}, %"class.RWStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 {{[0-9]*}}, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.RWStructuredBuffer >" undef) + // CHECK: call <2 x float>* @"dx.hl.subscript.[].rn.<2 x float>* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + VecBuf[ix0 + 1] = VecBuf[ix0 + 0]; + + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 2 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer\22)"(i32 {{[0-9]*}}, %"class.RWStructuredBuffer" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.RWStructuredBuffer" undef) + // CHECK: call [2 x float]* @"dx.hl.subscript.[].rn.[2 x float]* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 1 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer\22)"(i32 {{[0-9]*}}, %"class.RWStructuredBuffer" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.RWStructuredBuffer" undef) + // CHECK: call [2 x float]* @"dx.hl.subscript.[].rn.[2 x float]* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + ArrBuf[ix0 + 2] = ArrBuf[ix0 + 1]; + + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 3 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 {{[0-9]*}}, %"class.RWStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4876, i32 32 }, %"class.RWStructuredBuffer >" undef) + // CHECK: call %"struct.Vector"* @"dx.hl.subscript.[].rn.%\22struct.Vector\22* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 2 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 {{[0-9]*}}, %"class.RWStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4876, i32 32 }, %"class.RWStructuredBuffer >" undef) + // CHECK: call %"struct.Vector"* @"dx.hl.subscript.[].rn.%\22struct.Vector\22* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + SVecBuf[ix0 + 3] = SVecBuf[ix0 + 2]; + + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 4 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 {{[0-9]*}}, %"class.RWStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 16 }, %"class.RWStructuredBuffer >" undef) + // CHECK: [[SS:%.*]] = call %class.matrix.float.2.2* @"dx.hl.subscript.[].rn.%class.matrix.float.2.2* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 3 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 {{[0-9]*}}, %"class.RWStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 16 }, %"class.RWStructuredBuffer >" undef) + // CHECK: call %class.matrix.float.2.2* @"dx.hl.subscript.[].rn.%class.matrix.float.2.2* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + MatBuf[ix0 + 4] = MatBuf[ix0 + 3]; + + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 5 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 {{[0-9]*}}, %"class.RWStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 32 }, %"class.RWStructuredBuffer >" undef) + // CHECK: [[MSS:%.*]] = call %"struct.Matrix"* @"dx.hl.subscript.[].rn.%\22struct.Matrix\22* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ix:%.*]] = add i32 {{%.*}}, 4 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 {{[0-9]*}}, %"class.RWStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 32 }, %"class.RWStructuredBuffer >" undef) + // CHECK: call %"struct.Matrix"* @"dx.hl.subscript.[].rn.%\22struct.Matrix\22* (i32, %dx.types.Handle, i32)"(i32 {{[0-9]*}}, %dx.types.Handle [[anhdl]], i32 [[ix]]) + SMatBuf[ix0 + 5] = SMatBuf[ix0 + 4]; + + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32 0, %"class.ConsumeStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.ConsumeStructuredBuffer >" undef) + // CHECK: [[cn:%.*]] = call <2 x float> @"dx.hl.op..consume<2 x float> (i32, %dx.types.Handle)"(i32 283, %dx.types.Handle [[anhdl]]) + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32 0, %"class.AppendStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.AppendStructuredBuffer >" undef) + // CHECK: call void @"dx.hl.op..appendvoid (i32, %dx.types.Handle, <2 x float>)"(i32 226, %dx.types.Handle [[anhdl]], <2 x float> [[cn]]) + AVecBuf.Append(CVecBuf.Consume()); + + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer\22)"(i32 0, %"class.ConsumeStructuredBuffer" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.ConsumeStructuredBuffer" undef) + // CHECK: [[cn:%.*]] = call [2 x float]* @"dx.hl.op..consume[2 x float]* (i32, %dx.types.Handle)"(i32 283, %dx.types.Handle [[anhdl]]) + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer\22)"(i32 0, %"class.AppendStructuredBuffer" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.AppendStructuredBuffer" undef) + // CHECK: call void @"dx.hl.op..appendvoid (i32, %dx.types.Handle, [2 x float]*)"(i32 226, %dx.types.Handle [[anhdl]], [2 x float]* + AArrBuf.Append(CArrBuf.Consume()); + + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32 0, %"class.ConsumeStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4876, i32 32 }, %"class.ConsumeStructuredBuffer >" undef) + // CHECK: [[cn:%.*]] = call %"struct.Vector"* @"dx.hl.op..consume%\22struct.Vector\22* (i32, %dx.types.Handle)"(i32 283, %dx.types.Handle [[anhdl]]) + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32 0, %"class.AppendStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4876, i32 32 }, %"class.AppendStructuredBuffer >" undef) + // CHECK: call void @"dx.hl.op..appendvoid (i32, %dx.types.Handle, %\22struct.Vector\22*)"(i32 226, %dx.types.Handle [[anhdl]], %"struct.Vector"* + ASVecBuf.Append(CSVecBuf.Consume()); + + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32 0, %"class.ConsumeStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 16 }, %"class.ConsumeStructuredBuffer >" undef) + // CHECK: [[cn:%.*]] = call %class.matrix.float.2.2 @"dx.hl.op..consume%class.matrix.float.2.2 (i32, %dx.types.Handle)"(i32 283, %dx.types.Handle [[anhdl]]) + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32 0, %"class.AppendStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 16 }, %"class.AppendStructuredBuffer >" undef) + // CHECK: call void @"dx.hl.op..appendvoid (i32, %dx.types.Handle, %class.matrix.float.2.2)"(i32 226, %dx.types.Handle [[anhdl]], %class.matrix.float.2.2 [[cn]]) + AMatBuf.Append(CMatBuf.Consume()); + + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32 0, %"class.ConsumeStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 32 }, %"class.ConsumeStructuredBuffer >" undef) + // CHECK: [[cn:%.*]] = call %"struct.Matrix"* @"dx.hl.op..consume%\22struct.Matrix\22* (i32, %dx.types.Handle)"(i32 283, %dx.types.Handle [[anhdl]]) + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32 0, %"class.AppendStructuredBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 32 }, %"class.AppendStructuredBuffer >" undef) + // CHECK: call void @"dx.hl.op..appendvoid (i32, %dx.types.Handle, %\22struct.Matrix\22*)"(i32 226, %dx.types.Handle [[anhdl]], %"struct.Matrix"* + ASMatBuf.Append(CSMatBuf.Consume()); + +} diff --git a/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-store.ll b/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-store.ll new file mode 100644 index 0000000000..540ab85819 --- /dev/null +++ b/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-store.ll @@ -0,0 +1,822 @@ +; RUN: %dxopt %s -hlsl-passes-resume -dxilgen -S | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64" +target triple = "dxil-ms-dx" + +%struct.RWByteAddressBuffer = type { i32 } +%"class.RWStructuredBuffer >" = type { <2 x float> } +%"class.RWStructuredBuffer" = type { [2 x float] } +%"class.RWStructuredBuffer >" = type { %"struct.Vector" } +%"struct.Vector" = type { <4 x float>, double, <2 x float> } +%"class.RWStructuredBuffer >" = type { %class.matrix.float.2.2 } +%class.matrix.float.2.2 = type { [2 x <2 x float>] } +%"class.RWStructuredBuffer >" = type { %"struct.Matrix" } +%"struct.Matrix" = type { <4 x float>, %class.matrix.float.2.2 } +%"class.ConsumeStructuredBuffer >" = type { <2 x float> } +%"class.ConsumeStructuredBuffer" = type { [2 x float] } +%"class.ConsumeStructuredBuffer >" = type { %"struct.Vector" } +%"class.ConsumeStructuredBuffer >" = type { %class.matrix.float.2.2 } +%"class.ConsumeStructuredBuffer >" = type { %"struct.Matrix" } +%"class.AppendStructuredBuffer >" = type { <2 x float> } +%"class.AppendStructuredBuffer" = type { [2 x float] } +%"class.AppendStructuredBuffer >" = type { %"struct.Vector" } +%"class.AppendStructuredBuffer >" = type { %class.matrix.float.2.2 } +%"class.AppendStructuredBuffer >" = type { %"struct.Matrix" } +%dx.types.Handle = type { i8* } +%dx.types.ResourceProperties = type { i32, i32 } + +@"\01?BabBuf@@3URWByteAddressBuffer@@A" = external global %struct.RWByteAddressBuffer, align 4 +@"\01?VecBuf@@3V?$RWStructuredBuffer@V?$vector@M$01@@@@A" = external global %"class.RWStructuredBuffer >", align 4 +@"\01?ArrBuf@@3V?$RWStructuredBuffer@$$BY01M@@A" = external global %"class.RWStructuredBuffer", align 4 +@"\01?SVecBuf@@3V?$RWStructuredBuffer@U?$Vector@M$01@@@@A" = external global %"class.RWStructuredBuffer >", align 8 +@"\01?MatBuf@@3V?$RWStructuredBuffer@V?$matrix@M$01$01@@@@A" = external global %"class.RWStructuredBuffer >", align 4 +@"\01?SMatBuf@@3V?$RWStructuredBuffer@U?$Matrix@M$01$01@@@@A" = external global %"class.RWStructuredBuffer >", align 4 +@"\01?CVecBuf@@3V?$ConsumeStructuredBuffer@V?$vector@M$01@@@@A" = external global %"class.ConsumeStructuredBuffer >", align 4 +@"\01?CArrBuf@@3V?$ConsumeStructuredBuffer@$$BY01M@@A" = external global %"class.ConsumeStructuredBuffer", align 4 +@"\01?CSVecBuf@@3V?$ConsumeStructuredBuffer@U?$Vector@M$01@@@@A" = external global %"class.ConsumeStructuredBuffer >", align 8 +@"\01?CMatBuf@@3V?$ConsumeStructuredBuffer@V?$matrix@M$01$01@@@@A" = external global %"class.ConsumeStructuredBuffer >", align 4 +@"\01?CSMatBuf@@3V?$ConsumeStructuredBuffer@U?$Matrix@M$01$01@@@@A" = external global %"class.ConsumeStructuredBuffer >", align 4 +@"\01?AVecBuf@@3V?$AppendStructuredBuffer@V?$vector@M$01@@@@A" = external global %"class.AppendStructuredBuffer >", align 4 +@"\01?AArrBuf@@3V?$AppendStructuredBuffer@$$BY01M@@A" = external global %"class.AppendStructuredBuffer", align 4 +@"\01?ASVecBuf@@3V?$AppendStructuredBuffer@U?$Vector@M$01@@@@A" = external global %"class.AppendStructuredBuffer >", align 8 +@"\01?AMatBuf@@3V?$AppendStructuredBuffer@V?$matrix@M$01$01@@@@A" = external global %"class.AppendStructuredBuffer >", align 4 +@"\01?ASMatBuf@@3V?$AppendStructuredBuffer@U?$Matrix@M$01$01@@@@A" = external global %"class.AppendStructuredBuffer >", align 4 + +; CHECK-LABEL: define void @main(i32 %ix0) +; Function Attrs: nounwind +define void @main(i32 %ix0) #0 { +bb: + ; CHECK: [[pix:%.*]] = call i32 @dx.op.loadInput.i32(i32 4, i32 0, i32 0, i8 0, i32 undef) + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @dx.op.createHandleForLib.struct.RWByteAddressBuffer(i32 160, %struct.RWByteAddressBuffer + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32(i32 139, %dx.types.Handle [[anhdl]], i32 [[pix]], i32 undef, i8 3, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x i32> undef, i32 [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <2 x i32> [[ping]], i32 [[val1]], i64 1 + ; CHECK: [[bvec:%.*]] = icmp ne <2 x i32> [[pong]], zeroinitializer + + %tmp = load %struct.RWByteAddressBuffer, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A" ; line:60 col:32 + %tmp1 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 0, %struct.RWByteAddressBuffer %tmp) ; line:60 col:32 + %tmp2 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 14, %dx.types.Handle %tmp1, %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer zeroinitializer) ; line:60 col:32 + %tmp3 = call <2 x i1> @"dx.hl.op.ro.<2 x i1> (i32, %dx.types.Handle, i32)"(i32 231, %dx.types.Handle %tmp2, i32 %ix0) ; line:60 col:32 + + ; CHECK: [[stix:%.*]] = add i32 [[pix]], 1 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @dx.op.createHandleForLib.struct.RWByteAddressBuffer(i32 160, %struct.RWByteAddressBuffer + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }) + ; CHECK: [[vec2:%.*]] = zext <2 x i1> [[bvec]] to <2 x i32> + ; CHECK: [[val0:%.*]] = extractelement <2 x i32> [[vec2]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i32> [[vec2]], i64 1 + ; CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle [[anhdl]], i32 [[stix]], i32 undef, i32 [[val0]], i32 [[val1]], i32 undef, i32 undef, i8 3, i32 4) + %tmp4 = add i32 %ix0, 1 ; line:60 col:27 + %tmp5 = load %struct.RWByteAddressBuffer, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A" ; line:60 col:3 + %tmp6 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 0, %struct.RWByteAddressBuffer %tmp5) ; line:60 col:3 + %tmp7 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 14, %dx.types.Handle %tmp6, %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer zeroinitializer) ; line:60 col:3 + call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, <2 x i1>)"(i32 277, %dx.types.Handle %tmp7, i32 %tmp4, <2 x i1> %tmp3) ; line:60 col:3 + + ; CHECK: [[ix:%.*]] = add i32 [[pix]], 1 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @dx.op.createHandleForLib.struct.RWByteAddressBuffer(i32 160, %struct.RWByteAddressBuffer + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }) + ; CHECK: [[lix:%.*]] = add i32 0, [[ix]] + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[lix]], i32 undef, i8 1, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[lix:%.*]] = add i32 4, [[ix]] + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[lix]], i32 undef, i8 1, i32 4) + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + + %tmp8 = add i32 %ix0, 1 ; line:70 col:63 + %tmp9 = load %struct.RWByteAddressBuffer, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A" ; line:70 col:35 + %tmp10 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 0, %struct.RWByteAddressBuffer %tmp9) ; line:70 col:35 + %tmp11 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 14, %dx.types.Handle %tmp10, %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer zeroinitializer) ; line:70 col:35 + %tmp12 = call [2 x float]* @"dx.hl.op.ro.[2 x float]* (i32, %dx.types.Handle, i32)"(i32 231, %dx.types.Handle %tmp11, i32 %tmp8) ; line:70 col:35 + %tmp13 = getelementptr inbounds [2 x float], [2 x float]* %tmp12, i32 0, i32 0 ; line:70 col:3 + %tmp14 = load float, float* %tmp13 ; line:70 col:3 + %tmp15 = getelementptr inbounds [2 x float], [2 x float]* %tmp12, i32 0, i32 1 ; line:70 col:3 + %tmp16 = load float, float* %tmp15 ; line:70 col:3 + + + ; CHECK: [[ix:%.*]] = add i32 [[pix]], 2 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @dx.op.createHandleForLib.struct.RWByteAddressBuffer(i32 160, %struct.RWByteAddressBuffer + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }) + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, float [[val0]], float undef, float undef, float undef, i8 1, i32 4) + ; CHECK: [[stix:%.*]] = add i32 [[ix]], 4 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[stix]], i32 undef, float [[val1]], float undef, float undef, float undef, i8 1, i32 4) + + %tmp17 = add i32 %ix0, 2 ; line:70 col:30 + %tmp18 = load %struct.RWByteAddressBuffer, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A" ; line:70 col:3 + %tmp19 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 0, %struct.RWByteAddressBuffer %tmp18) ; line:70 col:3 + %tmp20 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 14, %dx.types.Handle %tmp19, %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer zeroinitializer) ; line:70 col:3 + call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, float)"(i32 277, %dx.types.Handle %tmp20, i32 %tmp17, float %tmp14) ; line:70 col:3 + %tmp21 = add i32 %tmp17, 4 ; line:70 col:3 + call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, float)"(i32 277, %dx.types.Handle %tmp20, i32 %tmp21, float %tmp16) ; line:70 col:3 + + ; CHECK: [[ix:%.*]] = add i32 [[pix]], 2 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @dx.op.createHandleForLib.struct.RWByteAddressBuffer(i32 160, %struct.RWByteAddressBuffer + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }) + ; CHECK: [[lix:%.*]] = add i32 0, [[ix]] + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[lix]], i32 undef, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[vec4:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + ; CHECK: [[lix:%.*]] = add i32 16, [[ix]] + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f64 @dx.op.rawBufferLoad.f64(i32 139, %dx.types.Handle [[anhdl]], i32 [[lix]], i32 undef, i8 1, i32 4) + ; CHECK: [[dval:%.*]] = extractvalue %dx.types.ResRet.f64 [[ld]], 0 + ; CHECK: [[lix:%.*]] = add i32 24, [[ix]] + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[lix]], i32 undef, i8 3, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x float> undef, float [[val0]], i64 0 + ; CHECK: [[vec2:%.*]] = insertelement <2 x float> [[ping]], float [[val1]], i64 1 + %tmp22 = add i32 %ix0, 2 ; line:80 col:78 + %tmp23 = load %struct.RWByteAddressBuffer, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A" ; line:80 col:43 + %tmp24 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 0, %struct.RWByteAddressBuffer %tmp23) ; line:80 col:43 + %tmp25 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 14, %dx.types.Handle %tmp24, %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer zeroinitializer) ; line:80 col:43 + %tmp26 = call %"struct.Vector"* @"dx.hl.op.ro.%\22struct.Vector\22* (i32, %dx.types.Handle, i32)"(i32 231, %dx.types.Handle %tmp25, i32 %tmp22) ; line:80 col:43 + %tmp27 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp26, i32 0, i32 0 ; line:80 col:3 + %tmp28 = load <4 x float>, <4 x float>* %tmp27 ; line:80 col:3 + %tmp29 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp26, i32 0, i32 1 ; line:80 col:3 + %tmp30 = load double, double* %tmp29 ; line:80 col:3 + %tmp31 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp26, i32 0, i32 2 ; line:80 col:3 + %tmp32 = load <2 x float>, <2 x float>* %tmp31 ; line:80 col:3 + + ; CHECK: [[ix:%.*]] = add i32 [[pix]], 3 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @dx.op.createHandleForLib.struct.RWByteAddressBuffer(i32 160, %struct.RWByteAddressBuffer + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }) + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[vec4]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[vec4]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[vec4]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[vec4]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + ; CHECK: [[stix:%.*]] = add i32 [[ix]], 16 + ; CHECK: call void @dx.op.rawBufferStore.f64(i32 140, %dx.types.Handle [[anhdl]], i32 [[stix]], i32 undef, double [[dval]] + ; CHECK: [[stix:%.*]] = add i32 [[ix]], 24 + ; CHECK: [[val0:%.*]] = extractelement <2 x float> [[vec2]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x float> [[vec2]], i64 1 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[stix]], i32 undef, float [[val0]], float [[val1]], float undef, float undef, i8 3, i32 4) + %tmp33 = add i32 %ix0, 3 ; line:80 col:38 + %tmp34 = load %struct.RWByteAddressBuffer, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A" ; line:80 col:3 + %tmp35 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 0, %struct.RWByteAddressBuffer %tmp34) ; line:80 col:3 + %tmp36 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 14, %dx.types.Handle %tmp35, %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer zeroinitializer) ; line:80 col:3 + call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, <4 x float>)"(i32 277, %dx.types.Handle %tmp36, i32 %tmp33, <4 x float> %tmp28) ; line:80 col:3 + %tmp37 = add i32 %tmp33, 16 ; line:80 col:3 + call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, double)"(i32 277, %dx.types.Handle %tmp36, i32 %tmp37, double %tmp30) ; line:80 col:3 + %tmp38 = add i32 %tmp33, 24 ; line:80 col:3 + call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, <2 x float>)"(i32 277, %dx.types.Handle %tmp36, i32 %tmp38, <2 x float> %tmp32) ; line:80 col:3 + + + ; CHECK: [[lix:%.*]] = add i32 [[pix]], 3 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @dx.op.createHandleForLib.struct.RWByteAddressBuffer(i32 160, %struct.RWByteAddressBuffer + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[lix]], i32 undef, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[rvec4:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + %tmp39 = add i32 %ix0, 3 ; line:90 col:63 + %tmp40 = load %struct.RWByteAddressBuffer, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A" ; line:90 col:35 + %tmp41 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 0, %struct.RWByteAddressBuffer %tmp40) ; line:90 col:35 + %tmp42 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 14, %dx.types.Handle %tmp41, %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer zeroinitializer) ; line:90 col:35 + %tmp43 = call <4 x float> @"dx.hl.op.ro.<4 x float> (i32, %dx.types.Handle, i32)"(i32 231, %dx.types.Handle %tmp42, i32 %tmp39) ; line:90 col:35 + + ; CHECK: [[stix:%.*]] = add i32 [[pix]], 4 + ; CHECK: [[cvec4:%.*]] = shufflevector <4 x float> [[rvec4]], <4 x float> [[rvec4]], <4 x i32> + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @dx.op.createHandleForLib.struct.RWByteAddressBuffer(i32 160, %struct.RWByteAddressBuffer + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }) + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[cvec4]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[cvec4]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[cvec4]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[cvec4]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[stix]], i32 undef, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + %tmp44 = add i32 %ix0, 4 ; line:90 col:30 + %row2col = shufflevector <4 x float> %tmp43, <4 x float> %tmp43, <4 x i32> ; line:90 col:3 + %tmp45 = load %struct.RWByteAddressBuffer, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A" ; line:90 col:3 + %tmp46 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 0, %struct.RWByteAddressBuffer %tmp45) ; line:90 col:3 + %tmp47 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 14, %dx.types.Handle %tmp46, %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer zeroinitializer) ; line:90 col:3 + call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, <4 x float>)"(i32 277, %dx.types.Handle %tmp47, i32 %tmp44, <4 x float> %row2col) ; line:90 col:3 + + + ; CHECK: [[ix:%.*]] = add i32 [[pix]], 4 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @dx.op.createHandleForLib.struct.RWByteAddressBuffer(i32 160, %struct.RWByteAddressBuffer + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }) + ; CHECK: [[lix:%.*]] = add i32 0, [[ix]] + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[lix]], i32 undef, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[vec4:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + ; CHECK: [[lix:%.*]] = add i32 16, [[ix]] + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[lix]], i32 undef, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[mat:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + %tmp48 = add i32 %ix0, 4 ; line:100 col:82 + %tmp49 = load %struct.RWByteAddressBuffer, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A" ; line:100 col:45 + %tmp50 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 0, %struct.RWByteAddressBuffer %tmp49) ; line:100 col:45 + %tmp51 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 14, %dx.types.Handle %tmp50, %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer zeroinitializer) ; line:100 col:45 + %tmp52 = call %"struct.Matrix"* @"dx.hl.op.ro.%\22struct.Matrix\22* (i32, %dx.types.Handle, i32)"(i32 231, %dx.types.Handle %tmp51, i32 %tmp48) ; line:100 col:45 + %tmp53 = getelementptr inbounds %"struct.Matrix", %"struct.Matrix"* %tmp52, i32 0, i32 0 ; line:100 col:3 + %tmp54 = load <4 x float>, <4 x float>* %tmp53 ; line:100 col:3 + %tmp55 = getelementptr inbounds %"struct.Matrix", %"struct.Matrix"* %tmp52, i32 0, i32 1 ; line:100 col:3 + %tmp56 = call <4 x float> @"dx.hl.matldst.colLoad.<4 x float> (i32, %class.matrix.float.2.2*)"(i32 0, %class.matrix.float.2.2* %tmp55) ; line:100 col:3 + + ; CHECK: [[ix:%.*]] = add i32 [[pix]], 5 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @dx.op.createHandleForLib.struct.RWByteAddressBuffer(i32 160, %struct.RWByteAddressBuffer + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4107, i32 0 }) + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[vec4]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[vec4]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[vec4]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[vec4]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + ; CHECK: [[stix:%.*]] = add i32 [[ix]], 16 + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[mat]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[mat]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[mat]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[mat]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[stix]], i32 undef, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + %tmp57 = add i32 %ix0, 5 ; line:100 col:40 + %tmp58 = load %struct.RWByteAddressBuffer, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A" ; line:100 col:3 + %tmp59 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32 0, %struct.RWByteAddressBuffer %tmp58) ; line:100 col:3 + %tmp60 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32 14, %dx.types.Handle %tmp59, %dx.types.ResourceProperties { i32 4107, i32 0 }, %struct.RWByteAddressBuffer zeroinitializer) ; line:100 col:3 + call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, <4 x float>)"(i32 277, %dx.types.Handle %tmp60, i32 %tmp57, <4 x float> %tmp54) ; line:100 col:3 + %tmp61 = add i32 %tmp57, 16 ; line:100 col:3 + call void @"dx.hl.op..void (i32, %dx.types.Handle, i32, <4 x float>)"(i32 277, %dx.types.Handle %tmp60, i32 %tmp61, <4 x float> %tmp56) ; line:100 col:3 + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer >"(i32 160, %"class.RWStructuredBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[pix]], i32 0, i8 3, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x float> undef, float [[val0]], i64 0 + ; CHECK: [[vec2:%.*]] = insertelement <2 x float> [[ping]], float [[val1]], i64 1 + %tmp62 = load %"class.RWStructuredBuffer >", %"class.RWStructuredBuffer >"* @"\01?VecBuf@@3V?$RWStructuredBuffer@V?$vector@M$01@@@@A" ; line:111 col:21 + %tmp63 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 0, %"class.RWStructuredBuffer >" %tmp62) ; line:111 col:21 + %tmp64 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp63, %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.RWStructuredBuffer >" zeroinitializer) ; line:111 col:21 + %tmp65 = call <2 x float>* @"dx.hl.subscript.[].rn.<2 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp64, i32 %ix0) ; line:111 col:21 + %tmp66 = load <2 x float>, <2 x float>* %tmp65 ; line:111 col:21 + + ; CHECK: [[stix:%.*]] = add i32 [[pix]], 1 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer >"(i32 160, %"class.RWStructuredBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }) + ; CHECK: [[val0:%.*]] = extractelement <2 x float> [[vec2]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x float> [[vec2]], i64 1 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[stix]], i32 0, float [[val0]], float [[val1]], float undef, float undef, i8 3, i32 4) + %tmp67 = add i32 %ix0, 1 ; line:111 col:14 + %tmp68 = load %"class.RWStructuredBuffer >", %"class.RWStructuredBuffer >"* @"\01?VecBuf@@3V?$RWStructuredBuffer@V?$vector@M$01@@@@A" ; line:111 col:3 + %tmp69 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 0, %"class.RWStructuredBuffer >" %tmp68) ; line:111 col:3 + %tmp70 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp69, %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.RWStructuredBuffer >" zeroinitializer) ; line:111 col:3 + %tmp71 = call <2 x float>* @"dx.hl.subscript.[].rn.<2 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp70, i32 %tmp67) ; line:111 col:3 + store <2 x float> %tmp66, <2 x float>* %tmp71 ; line:111 col:19 + + + ; CHECK: [[stix:%.*]] = add i32 [[pix]], 2 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" + ; CHECK: [[sthdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }) + ; CHECK: [[lix:%.*]] = add i32 [[pix]], 1 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" + ; CHECK: [[ldhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4108, i32 8 }) + + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[ldhdl]], i32 [[lix]], i32 0, i8 1, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[sthdl]], i32 [[stix]], i32 0, float [[val0]], float undef, float undef, float undef, i8 1, i32 4) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[ldhdl]], i32 [[lix]], i32 4, i8 1, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[sthdl]], i32 [[stix]], i32 4, float [[val0]], float undef, float undef, float undef, i8 1, i32 4) + %tmp72 = add i32 %ix0, 2 ; line:121 col:14 + %tmp73 = load %"class.RWStructuredBuffer", %"class.RWStructuredBuffer"* @"\01?ArrBuf@@3V?$RWStructuredBuffer@$$BY01M@@A" ; line:121 col:3 + %tmp74 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer\22)"(i32 0, %"class.RWStructuredBuffer" %tmp73) ; line:121 col:3 + %tmp75 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer\22)"(i32 14, %dx.types.Handle %tmp74, %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.RWStructuredBuffer" zeroinitializer) ; line:121 col:3 + %tmp76 = call [2 x float]* @"dx.hl.subscript.[].rn.[2 x float]* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp75, i32 %tmp72) ; line:121 col:3 + %tmp77 = add i32 %ix0, 1 ; line:121 col:32 + %tmp78 = load %"class.RWStructuredBuffer", %"class.RWStructuredBuffer"* @"\01?ArrBuf@@3V?$RWStructuredBuffer@$$BY01M@@A" ; line:121 col:21 + %tmp79 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer\22)"(i32 0, %"class.RWStructuredBuffer" %tmp78) ; line:121 col:21 + %tmp80 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer\22)"(i32 14, %dx.types.Handle %tmp79, %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.RWStructuredBuffer" zeroinitializer) ; line:121 col:21 + %tmp81 = call [2 x float]* @"dx.hl.subscript.[].rn.[2 x float]* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp80, i32 %tmp77) ; line:121 col:21 + %tmp82 = getelementptr inbounds [2 x float], [2 x float]* %tmp76, i32 0, i32 0 ; line:121 col:21 + %tmp83 = getelementptr inbounds [2 x float], [2 x float]* %tmp81, i32 0, i32 0 ; line:121 col:21 + %tmp84 = load float, float* %tmp83 ; line:121 col:21 + store float %tmp84, float* %tmp82 ; line:121 col:21 + %tmp85 = getelementptr inbounds [2 x float], [2 x float]* %tmp76, i32 0, i32 1 ; line:121 col:21 + %tmp86 = getelementptr inbounds [2 x float], [2 x float]* %tmp81, i32 0, i32 1 ; line:121 col:21 + %tmp87 = load float, float* %tmp86 ; line:121 col:21 + store float %tmp87, float* %tmp85 ; line:121 col:21 + + + ; CHECK: [[stix:%.*]] = add i32 [[pix]], 3 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer >"(i32 160, %"class.RWStructuredBuffer >" + ; CHECK: [[sthdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4876, i32 32 }) + ; CHECK: [[lix:%.*]] = add i32 [[pix]], 2 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer >"(i32 160, %"class.RWStructuredBuffer >" + ; CHECK: [[ldhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4876, i32 32 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[ldhdl]], i32 [[lix]], i32 0, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[vec4:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[vec4]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[vec4]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[vec4]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[vec4]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[sthdl]], i32 [[stix]], i32 0, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f64 @dx.op.rawBufferLoad.f64(i32 139, %dx.types.Handle [[ldhdl]], i32 [[lix]], i32 16, i8 1, i32 8) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f64 [[ld]], 0 + ; CHECK: call void @dx.op.rawBufferStore.f64(i32 140, %dx.types.Handle [[sthdl]], i32 [[stix]], i32 16, double [[val0]], double undef, double undef, double undef, i8 1, i32 8) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[ldhdl]], i32 [[lix]], i32 24, i8 3, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x float> undef, float [[val0]], i64 0 + ; CHECK: [[vec2:%.*]] = insertelement <2 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[val0:%.*]] = extractelement <2 x float> [[vec2]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x float> [[vec2]], i64 1 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[sthdl]], i32 [[stix]], i32 24, float [[val0]], float [[val1]], float undef, float undef, i8 3, i32 4) + %tmp88 = add i32 %ix0, 3 ; line:131 col:15 + %tmp89 = load %"class.RWStructuredBuffer >", %"class.RWStructuredBuffer >"* @"\01?SVecBuf@@3V?$RWStructuredBuffer@U?$Vector@M$01@@@@A" ; line:131 col:3 + %tmp90 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 0, %"class.RWStructuredBuffer >" %tmp89) ; line:131 col:3 + %tmp91 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp90, %dx.types.ResourceProperties { i32 4876, i32 32 }, %"class.RWStructuredBuffer >" zeroinitializer) ; line:131 col:3 + %tmp92 = call %"struct.Vector"* @"dx.hl.subscript.[].rn.%\22struct.Vector\22* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp91, i32 %tmp88) ; line:131 col:3 + %tmp93 = add i32 %ix0, 2 ; line:131 col:34 + %tmp94 = load %"class.RWStructuredBuffer >", %"class.RWStructuredBuffer >"* @"\01?SVecBuf@@3V?$RWStructuredBuffer@U?$Vector@M$01@@@@A" ; line:131 col:22 + %tmp95 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 0, %"class.RWStructuredBuffer >" %tmp94) ; line:131 col:22 + %tmp96 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp95, %dx.types.ResourceProperties { i32 4876, i32 32 }, %"class.RWStructuredBuffer >" zeroinitializer) ; line:131 col:22 + %tmp97 = call %"struct.Vector"* @"dx.hl.subscript.[].rn.%\22struct.Vector\22* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp96, i32 %tmp93) ; line:131 col:22 + %tmp98 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp92, i32 0, i32 0 ; line:131 col:22 + %tmp99 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp97, i32 0, i32 0 ; line:131 col:22 + %tmp100 = load <4 x float>, <4 x float>* %tmp99 ; line:131 col:22 + store <4 x float> %tmp100, <4 x float>* %tmp98 ; line:131 col:22 + %tmp101 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp92, i32 0, i32 1 ; line:131 col:22 + %tmp102 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp97, i32 0, i32 1 ; line:131 col:22 + %tmp103 = load double, double* %tmp102 ; line:131 col:22 + store double %tmp103, double* %tmp101 ; line:131 col:22 + %tmp104 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp92, i32 0, i32 2 ; line:131 col:22 + %tmp105 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp97, i32 0, i32 2 ; line:131 col:22 + %tmp106 = load <2 x float>, <2 x float>* %tmp105 ; line:131 col:22 + store <2 x float> %tmp106, <2 x float>* %tmp104 ; line:131 col:22 + + + ; CHECK: [[stix:%.*]] = add i32 [[pix]], 4 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer >"(i32 160, %"class.RWStructuredBuffer >" + ; CHECK: [[sthdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 16 }) + ; CHECK: [[lix:%.*]] = add i32 [[pix]], 3 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer >"(i32 160, %"class.RWStructuredBuffer >" + ; CHECK: [[ldhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 16 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[ldhdl]], i32 [[lix]], i32 0, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[vec4:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[vec4]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[vec4]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[vec4]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[vec4]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[sthdl]], i32 [[stix]], i32 0, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + %tmp107 = add i32 %ix0, 4 ; line:141 col:14 + %tmp108 = load %"class.RWStructuredBuffer >", %"class.RWStructuredBuffer >"* @"\01?MatBuf@@3V?$RWStructuredBuffer@V?$matrix@M$01$01@@@@A" ; line:141 col:3 + %tmp109 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 0, %"class.RWStructuredBuffer >" %tmp108) ; line:141 col:3 + %tmp110 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp109, %dx.types.ResourceProperties { i32 4620, i32 16 }, %"class.RWStructuredBuffer >" zeroinitializer) ; line:141 col:3 + %tmp111 = call %class.matrix.float.2.2* @"dx.hl.subscript.[].rn.%class.matrix.float.2.2* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp110, i32 %tmp107) ; line:141 col:3 + %tmp112 = add i32 %ix0, 3 ; line:141 col:32 + %tmp113 = load %"class.RWStructuredBuffer >", %"class.RWStructuredBuffer >"* @"\01?MatBuf@@3V?$RWStructuredBuffer@V?$matrix@M$01$01@@@@A" ; line:141 col:21 + %tmp114 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 0, %"class.RWStructuredBuffer >" %tmp113) ; line:141 col:21 + %tmp115 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp114, %dx.types.ResourceProperties { i32 4620, i32 16 }, %"class.RWStructuredBuffer >" zeroinitializer) ; line:141 col:21 + %tmp116 = call %class.matrix.float.2.2* @"dx.hl.subscript.[].rn.%class.matrix.float.2.2* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp115, i32 %tmp112) ; line:141 col:21 + %tmp117 = call <4 x float> @"dx.hl.matldst.colLoad.<4 x float> (i32, %class.matrix.float.2.2*)"(i32 0, %class.matrix.float.2.2* %tmp116) ; line:141 col:21 + %tmp118 = call <4 x float> @"dx.hl.matldst.colStore.<4 x float> (i32, %class.matrix.float.2.2*, <4 x float>)"(i32 1, %class.matrix.float.2.2* %tmp111, <4 x float> %tmp117) ; line:141 col:19 + + + ; CHECK: [[stix:%.*]] = add i32 [[pix]], 5 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer >"(i32 160, %"class.RWStructuredBuffer >" + ; CHECK: [[sthdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 32 }) + ; CHECK: [[lix:%.*]] = add i32 [[pix]], 4 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer >"(i32 160, %"class.RWStructuredBuffer >" + ; CHECK: [[ldhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4620, i32 32 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[ldhdl]], i32 [[lix]], i32 0, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[vec4:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[vec4]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[vec4]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[vec4]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[vec4]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[sthdl]], i32 [[stix]], i32 0, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[ldhdl]], i32 [[lix]], i32 16, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[vec4:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[vec4]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[vec4]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[vec4]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[vec4]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[sthdl]], i32 [[stix]], i32 16, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + %tmp119 = add i32 %ix0, 5 ; line:151 col:15 + %tmp120 = load %"class.RWStructuredBuffer >", %"class.RWStructuredBuffer >"* @"\01?SMatBuf@@3V?$RWStructuredBuffer@U?$Matrix@M$01$01@@@@A" ; line:151 col:3 + %tmp121 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 0, %"class.RWStructuredBuffer >" %tmp120) ; line:151 col:3 + %tmp122 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp121, %dx.types.ResourceProperties { i32 4620, i32 32 }, %"class.RWStructuredBuffer >" zeroinitializer) ; line:151 col:3 + %tmp123 = call %"struct.Matrix"* @"dx.hl.subscript.[].rn.%\22struct.Matrix\22* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp122, i32 %tmp119) ; line:151 col:3 + %tmp124 = add i32 %ix0, 4 ; line:151 col:34 + %tmp125 = load %"class.RWStructuredBuffer >", %"class.RWStructuredBuffer >"* @"\01?SMatBuf@@3V?$RWStructuredBuffer@U?$Matrix@M$01$01@@@@A" ; line:151 col:22 + %tmp126 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32 0, %"class.RWStructuredBuffer >" %tmp125) ; line:151 col:22 + %tmp127 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp126, %dx.types.ResourceProperties { i32 4620, i32 32 }, %"class.RWStructuredBuffer >" zeroinitializer) ; line:151 col:22 + %tmp128 = call %"struct.Matrix"* @"dx.hl.subscript.[].rn.%\22struct.Matrix\22* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp127, i32 %tmp124) ; line:151 col:22 + %tmp129 = getelementptr inbounds %"struct.Matrix", %"struct.Matrix"* %tmp123, i32 0, i32 0 ; line:151 col:22 + %tmp130 = getelementptr inbounds %"struct.Matrix", %"struct.Matrix"* %tmp128, i32 0, i32 0 ; line:151 col:22 + %tmp131 = load <4 x float>, <4 x float>* %tmp130 ; line:151 col:22 + store <4 x float> %tmp131, <4 x float>* %tmp129 ; line:151 col:22 + %tmp132 = getelementptr inbounds %"struct.Matrix", %"struct.Matrix"* %tmp123, i32 0, i32 1 ; line:151 col:22 + %tmp133 = getelementptr inbounds %"struct.Matrix", %"struct.Matrix"* %tmp128, i32 0, i32 1 ; line:151 col:22 + %tmp134 = call <4 x float> @"dx.hl.matldst.colLoad.<4 x float> (i32, %class.matrix.float.2.2*)"(i32 0, %class.matrix.float.2.2* %tmp133) ; line:151 col:22 + %tmp135 = call <4 x float> @"dx.hl.matldst.colStore.<4 x float> (i32, %class.matrix.float.2.2*, <4 x float>)"(i32 1, %class.matrix.float.2.2* %tmp132, <4 x float> %tmp134) ; line:151 col:22 + + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.ConsumeStructuredBuffer >"(i32 160, %"class.ConsumeStructuredBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 36876, i32 8 }) + ; CHECK: [[ct:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[anhdl]], i8 -1) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 0, i8 3, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x float> undef, float [[val0]], i64 0 + ; CHECK: [[vec2:%.*]] = insertelement <2 x float> [[ping]], float [[val1]], i64 1 + %tmp136 = load %"class.ConsumeStructuredBuffer >", %"class.ConsumeStructuredBuffer >"* @"\01?CVecBuf@@3V?$ConsumeStructuredBuffer@V?$vector@M$01@@@@A" ; line:159 col:18 + %tmp137 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32 0, %"class.ConsumeStructuredBuffer >" %tmp136) ; line:159 col:18 + %tmp138 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp137, %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.ConsumeStructuredBuffer >" zeroinitializer) ; line:159 col:18 + %tmp139 = call i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32 281, %dx.types.Handle %tmp138) #0 ; line:159 col:18 + %tmp140 = call <2 x float>* @"dx.hl.subscript.[].rn.<2 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp138, i32 %tmp139) #0 ; line:159 col:18 + %tmp141 = load <2 x float>, <2 x float>* %tmp140 ; line:159 col:18 + + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.AppendStructuredBuffer >"(i32 160, %"class.AppendStructuredBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 36876, i32 8 }) + ; CHECK: [[ct:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[anhdl]], i8 1) + ; CHECK: [[val0:%.*]] = extractelement <2 x float> [[vec2]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x float> [[vec2]], i64 1 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 0, float [[val0]], float [[val1]], float undef, float undef, i8 3, i32 4) + %tmp142 = load %"class.AppendStructuredBuffer >", %"class.AppendStructuredBuffer >"* @"\01?AVecBuf@@3V?$AppendStructuredBuffer@V?$vector@M$01@@@@A" ; line:159 col:3 + %tmp143 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32 0, %"class.AppendStructuredBuffer >" %tmp142) ; line:159 col:3 + %tmp144 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp143, %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.AppendStructuredBuffer >" zeroinitializer) ; line:159 col:3 + %tmp145 = call i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32 282, %dx.types.Handle %tmp144) #0 ; line:159 col:3 + %tmp146 = call <2 x float>* @"dx.hl.subscript.[].rn.<2 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp144, i32 %tmp145) #0 ; line:159 col:3 + store <2 x float> %tmp141, <2 x float>* %tmp146 ; line:159 col:3 + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.ConsumeStructuredBuffer"(i32 160, %"class.ConsumeStructuredBuffer" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 36876, i32 8 }) + ; CHECK: [[ct:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[anhdl]], i8 -1) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 0, i8 1, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 4, i8 1, i32 4) + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + + %tmp147 = load %"class.ConsumeStructuredBuffer", %"class.ConsumeStructuredBuffer"* @"\01?CArrBuf@@3V?$ConsumeStructuredBuffer@$$BY01M@@A" ; line:167 col:18 + %tmp148 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer\22)"(i32 0, %"class.ConsumeStructuredBuffer" %tmp147) ; line:167 col:18 + %tmp149 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer\22)"(i32 14, %dx.types.Handle %tmp148, %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.ConsumeStructuredBuffer" zeroinitializer) ; line:167 col:18 + %tmp150 = call i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32 281, %dx.types.Handle %tmp149) #0 ; line:167 col:18 + %tmp151 = call [2 x float]* @"dx.hl.subscript.[].rn.[2 x float]* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp149, i32 %tmp150) #0 ; line:167 col:18 + %tmp152 = getelementptr inbounds [2 x float], [2 x float]* %tmp151, i32 0, i32 0 ; line:167 col:3 + %tmp153 = load float, float* %tmp152 ; line:167 col:3 + %tmp154 = getelementptr inbounds [2 x float], [2 x float]* %tmp151, i32 0, i32 1 ; line:167 col:3 + %tmp155 = load float, float* %tmp154 ; line:167 col:3 + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.AppendStructuredBuffer"(i32 160, %"class.AppendStructuredBuffer" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 36876, i32 8 }) + ; CHECK: [[ct:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[anhdl]], i8 1) + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 0, float [[val0]], float undef, float undef, float undef, i8 1, i32 4) + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 4, float [[val1]], float undef, float undef, float undef, i8 1, i32 4) + + %tmp156 = load %"class.AppendStructuredBuffer", %"class.AppendStructuredBuffer"* @"\01?AArrBuf@@3V?$AppendStructuredBuffer@$$BY01M@@A" ; line:167 col:3 + %tmp157 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer\22)"(i32 0, %"class.AppendStructuredBuffer" %tmp156) ; line:167 col:3 + %tmp158 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer\22)"(i32 14, %dx.types.Handle %tmp157, %dx.types.ResourceProperties { i32 4108, i32 8 }, %"class.AppendStructuredBuffer" zeroinitializer) ; line:167 col:3 + %tmp159 = call i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32 282, %dx.types.Handle %tmp158) #0 ; line:167 col:3 + %tmp160 = call [2 x float]* @"dx.hl.subscript.[].rn.[2 x float]* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp158, i32 %tmp159) #0 ; line:167 col:3 + %tmp161 = getelementptr inbounds [2 x float], [2 x float]* %tmp160, i32 0, i32 0 ; line:167 col:3 + store float %tmp153, float* %tmp161 ; line:167 col:3 + %tmp162 = getelementptr inbounds [2 x float], [2 x float]* %tmp160, i32 0, i32 1 ; line:167 col:3 + store float %tmp155, float* %tmp162 ; line:167 col:3 + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.ConsumeStructuredBuffer >"(i32 160, %"class.ConsumeStructuredBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 37644, i32 32 }) + ; CHECK: [[ct:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[anhdl]], i8 -1) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 0, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[vec4:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f64 @dx.op.rawBufferLoad.f64(i32 139, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 16, i8 1, i32 8) + ; CHECK: [[dval:%.*]] = extractvalue %dx.types.ResRet.f64 [[ld]], 0 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 24, i8 3, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x float> undef, float [[val0]], i64 0 + ; CHECK: [[vec2:%.*]] = insertelement <2 x float> [[ping]], float [[val1]], i64 1 + + %tmp163 = load %"class.ConsumeStructuredBuffer >", %"class.ConsumeStructuredBuffer >"* @"\01?CSVecBuf@@3V?$ConsumeStructuredBuffer@U?$Vector@M$01@@@@A" ; line:175 col:19 + %tmp164 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32 0, %"class.ConsumeStructuredBuffer >" %tmp163) ; line:175 col:19 + %tmp165 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp164, %dx.types.ResourceProperties { i32 4876, i32 32 }, %"class.ConsumeStructuredBuffer >" zeroinitializer) ; line:175 col:19 + %tmp166 = call i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32 281, %dx.types.Handle %tmp165) #0 ; line:175 col:19 + %tmp167 = call %"struct.Vector"* @"dx.hl.subscript.[].rn.%\22struct.Vector\22* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp165, i32 %tmp166) #0 ; line:175 col:19 + %tmp168 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp167, i32 0, i32 0 ; line:175 col:3 + %tmp169 = load <4 x float>, <4 x float>* %tmp168 ; line:175 col:3 + %tmp170 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp167, i32 0, i32 1 ; line:175 col:3 + %tmp171 = load double, double* %tmp170 ; line:175 col:3 + %tmp172 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp167, i32 0, i32 2 ; line:175 col:3 + %tmp173 = load <2 x float>, <2 x float>* %tmp172 ; line:175 col:3 + + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.AppendStructuredBuffer >"(i32 160, %"class.AppendStructuredBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 37644, i32 32 }) + ; CHECK: [[ct:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[anhdl]], i8 1) + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[vec4]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[vec4]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[vec4]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[vec4]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 0, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + ; CHECK: call void @dx.op.rawBufferStore.f64(i32 140, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 16, double [[dval]], double undef, double undef, double undef, i8 1, i32 8) + ; CHECK: [[val0:%.*]] = extractelement <2 x float> [[vec2]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x float> [[vec2]], i64 1 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 24, float [[val0]], float [[val1]], float undef, float undef, i8 3, i32 4) + %tmp174 = load %"class.AppendStructuredBuffer >", %"class.AppendStructuredBuffer >"* @"\01?ASVecBuf@@3V?$AppendStructuredBuffer@U?$Vector@M$01@@@@A" ; line:175 col:3 + %tmp175 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32 0, %"class.AppendStructuredBuffer >" %tmp174) ; line:175 col:3 + %tmp176 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp175, %dx.types.ResourceProperties { i32 4876, i32 32 }, %"class.AppendStructuredBuffer >" zeroinitializer) ; line:175 col:3 + %tmp177 = call i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32 282, %dx.types.Handle %tmp176) #0 ; line:175 col:3 + %tmp178 = call %"struct.Vector"* @"dx.hl.subscript.[].rn.%\22struct.Vector\22* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp176, i32 %tmp177) #0 ; line:175 col:3 + %tmp179 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp178, i32 0, i32 0 ; line:175 col:3 + store <4 x float> %tmp169, <4 x float>* %tmp179 ; line:175 col:3 + %tmp180 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp178, i32 0, i32 1 ; line:175 col:3 + store double %tmp171, double* %tmp180 ; line:175 col:3 + %tmp181 = getelementptr inbounds %"struct.Vector", %"struct.Vector"* %tmp178, i32 0, i32 2 ; line:175 col:3 + store <2 x float> %tmp173, <2 x float>* %tmp181 ; line:175 col:3 + + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.ConsumeStructuredBuffer >"(i32 160, %"class.ConsumeStructuredBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 37388, i32 16 }) + ; CHECK: [[ct:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[anhdl]], i8 -1) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 0, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[vec4:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + ; CHECK: [[rvec4:%.*]] = shufflevector <4 x float> [[vec4]], <4 x float> [[vec4]], <4 x i32> + %tmp182 = load %"class.ConsumeStructuredBuffer >", %"class.ConsumeStructuredBuffer >"* @"\01?CMatBuf@@3V?$ConsumeStructuredBuffer@V?$matrix@M$01$01@@@@A" ; line:183 col:18 + %tmp183 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32 0, %"class.ConsumeStructuredBuffer >" %tmp182) ; line:183 col:18 + %tmp184 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp183, %dx.types.ResourceProperties { i32 4620, i32 16 }, %"class.ConsumeStructuredBuffer >" zeroinitializer) ; line:183 col:18 + %tmp185 = call i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32 281, %dx.types.Handle %tmp184) #0 ; line:183 col:18 + %tmp186 = call %class.matrix.float.2.2* @"dx.hl.subscript.[].rn.%class.matrix.float.2.2* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp184, i32 %tmp185) #0 ; line:183 col:18 + %tmp187 = call <4 x float> @"dx.hl.matldst.colLoad.<4 x float> (i32, %class.matrix.float.2.2*)"(i32 0, %class.matrix.float.2.2* %tmp186) ; line:183 col:18 + %col2row10 = shufflevector <4 x float> %tmp187, <4 x float> %tmp187, <4 x i32> ; line:183 col:18 + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.AppendStructuredBuffer >"(i32 160, %"class.AppendStructuredBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 37388, i32 16 }) + ; CHECK: [[ct:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[anhdl]], i8 1) + ; CHECK: [[cvec4:%.*]] = shufflevector <4 x float> [[rvec4]], <4 x float> [[rvec4]], <4 x i32> + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[cvec4]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[cvec4]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[cvec4]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[cvec4]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 0, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + + %tmp188 = load %"class.AppendStructuredBuffer >", %"class.AppendStructuredBuffer >"* @"\01?AMatBuf@@3V?$AppendStructuredBuffer@V?$matrix@M$01$01@@@@A" ; line:183 col:3 + %tmp189 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32 0, %"class.AppendStructuredBuffer >" %tmp188) ; line:183 col:3 + %tmp190 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp189, %dx.types.ResourceProperties { i32 4620, i32 16 }, %"class.AppendStructuredBuffer >" zeroinitializer) ; line:183 col:3 + %tmp191 = call i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32 282, %dx.types.Handle %tmp190) #0 ; line:183 col:3 + %tmp192 = call %class.matrix.float.2.2* @"dx.hl.subscript.[].rn.%class.matrix.float.2.2* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp190, i32 %tmp191) #0 ; line:183 col:3 + %row2col11 = shufflevector <4 x float> %col2row10, <4 x float> %col2row10, <4 x i32> ; line:183 col:3 + call void @"dx.hl.matldst.colStore.void (i32, %class.matrix.float.2.2*, <4 x float>)"(i32 1, %class.matrix.float.2.2* %tmp192, <4 x float> %row2col11) ; line:183 col:3 + + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.ConsumeStructuredBuffer >"(i32 160, %"class.ConsumeStructuredBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 37388, i32 32 }) + ; CHECK: [[ct:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[anhdl]], i8 -1) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 0, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[vec4:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 16, i8 15, i32 4) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 3 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <4 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[ping:%.*]] = insertelement <4 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[mat:%.*]] = insertelement <4 x float> [[ping]], float [[val3]], i64 3 + %tmp193 = load %"class.ConsumeStructuredBuffer >", %"class.ConsumeStructuredBuffer >"* @"\01?CSMatBuf@@3V?$ConsumeStructuredBuffer@U?$Matrix@M$01$01@@@@A" ; line:191 col:19 + %tmp194 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32 0, %"class.ConsumeStructuredBuffer >" %tmp193) ; line:191 col:19 + %tmp195 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp194, %dx.types.ResourceProperties { i32 4620, i32 32 }, %"class.ConsumeStructuredBuffer >" zeroinitializer) ; line:191 col:19 + %tmp196 = call i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32 281, %dx.types.Handle %tmp195) #0 ; line:191 col:19 + %tmp197 = call %"struct.Matrix"* @"dx.hl.subscript.[].rn.%\22struct.Matrix\22* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp195, i32 %tmp196) #0 ; line:191 col:19 + %tmp198 = getelementptr inbounds %"struct.Matrix", %"struct.Matrix"* %tmp197, i32 0, i32 0 ; line:191 col:3 + %tmp199 = load <4 x float>, <4 x float>* %tmp198 ; line:191 col:3 + %tmp200 = getelementptr inbounds %"struct.Matrix", %"struct.Matrix"* %tmp197, i32 0, i32 1 ; line:191 col:3 + %tmp201 = call <4 x float> @"dx.hl.matldst.colLoad.<4 x float> (i32, %class.matrix.float.2.2*)"(i32 0, %class.matrix.float.2.2* %tmp200) ; line:191 col:3 + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.AppendStructuredBuffer >"(i32 160, %"class.AppendStructuredBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 37388, i32 32 }) + ; CHECK: [[ct:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[anhdl]], i8 1) + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[vec4]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[vec4]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[vec4]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[vec4]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 0, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + ; CHECK: [[val0:%.*]] = extractelement <4 x float> [[mat]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <4 x float> [[mat]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <4 x float> [[mat]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <4 x float> [[mat]], i64 3 + ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[anhdl]], i32 [[ct]], i32 16, float [[val0]], float [[val1]], float [[val2]], float [[val3]] + + %tmp202 = load %"class.AppendStructuredBuffer >", %"class.AppendStructuredBuffer >"* @"\01?ASMatBuf@@3V?$AppendStructuredBuffer@U?$Matrix@M$01$01@@@@A" ; line:191 col:3 + %tmp203 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32 0, %"class.AppendStructuredBuffer >" %tmp202) ; line:191 col:3 + %tmp204 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32 14, %dx.types.Handle %tmp203, %dx.types.ResourceProperties { i32 4620, i32 32 }, %"class.AppendStructuredBuffer >" zeroinitializer) ; line:191 col:3 + %tmp205 = call i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32 282, %dx.types.Handle %tmp204) #0 ; line:191 col:3 + %tmp206 = call %"struct.Matrix"* @"dx.hl.subscript.[].rn.%\22struct.Matrix\22* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp204, i32 %tmp205) #0 ; line:191 col:3 + %tmp207 = getelementptr inbounds %"struct.Matrix", %"struct.Matrix"* %tmp206, i32 0, i32 0 ; line:191 col:3 + store <4 x float> %tmp199, <4 x float>* %tmp207 ; line:191 col:3 + %tmp208 = getelementptr inbounds %"struct.Matrix", %"struct.Matrix"* %tmp206, i32 0, i32 1 ; line:191 col:3 + %tmp209 = call <4 x float> @"dx.hl.matldst.colStore.<4 x float> (i32, %class.matrix.float.2.2*, <4 x float>)"(i32 1, %class.matrix.float.2.2* %tmp208, <4 x float> %tmp201) ; line:191 col:3 + + + ; CHECK: ret void + ret void ; line:193 col:1 +} + +declare void @"dx.hl.op..void (i32, %dx.types.Handle, i32, <2 x i1>)"(i32, %dx.types.Handle, i32, <2 x i1>) #0 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %struct.RWByteAddressBuffer)"(i32, %struct.RWByteAddressBuffer) #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RWByteAddressBuffer) #1 +declare <2 x i1> @"dx.hl.op.ro.<2 x i1> (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #2 +declare [2 x float]* @"dx.hl.op.ro.[2 x float]* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #2 +declare %"struct.Vector"* @"dx.hl.op.ro.%\22struct.Vector\22* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #2 +declare %"struct.Matrix"* @"dx.hl.op.ro.%\22struct.Matrix\22* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #2 +declare <2 x float>* @"dx.hl.subscript.[].rn.<2 x float>* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32, %"class.RWStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWStructuredBuffer >") #1 +declare [2 x float]* @"dx.hl.subscript.[].rn.[2 x float]* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer\22)"(i32, %"class.RWStructuredBuffer") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWStructuredBuffer") #1 +declare %"struct.Vector"* @"dx.hl.subscript.[].rn.%\22struct.Vector\22* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32, %"class.RWStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWStructuredBuffer >") #1 +declare %class.matrix.float.2.2* @"dx.hl.subscript.[].rn.%class.matrix.float.2.2* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32, %"class.RWStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWStructuredBuffer >") #1 +declare %"struct.Matrix"* @"dx.hl.subscript.[].rn.%\22struct.Matrix\22* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWStructuredBuffer >\22)"(i32, %"class.RWStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWStructuredBuffer >") #1 +declare i32 @"dx.hl.op..i32 (i32, %dx.types.Handle)"(i32, %dx.types.Handle) #0 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32, %"class.AppendStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.AppendStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32, %"class.ConsumeStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.ConsumeStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer\22)"(i32, %"class.AppendStructuredBuffer") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.AppendStructuredBuffer") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer\22)"(i32, %"class.ConsumeStructuredBuffer") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.ConsumeStructuredBuffer") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32, %"class.AppendStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.AppendStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32, %"class.ConsumeStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.ConsumeStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32, %"class.AppendStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.AppendStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32, %"class.ConsumeStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.ConsumeStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.AppendStructuredBuffer >\22)"(i32, %"class.AppendStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.AppendStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.AppendStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.ConsumeStructuredBuffer >\22)"(i32, %"class.ConsumeStructuredBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.ConsumeStructuredBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.ConsumeStructuredBuffer >") #1 +declare void @"dx.hl.op..void (i32, %dx.types.Handle, i32, float)"(i32, %dx.types.Handle, i32, float) #0 +declare void @"dx.hl.op..void (i32, %dx.types.Handle, i32, <4 x float>)"(i32, %dx.types.Handle, i32, <4 x float>) #0 +declare void @"dx.hl.op..void (i32, %dx.types.Handle, i32, double)"(i32, %dx.types.Handle, i32, double) #0 +declare void @"dx.hl.op..void (i32, %dx.types.Handle, i32, <2 x float>)"(i32, %dx.types.Handle, i32, <2 x float>) #0 +declare <4 x float> @"dx.hl.op.ro.<4 x float> (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #2 +declare <4 x float> @"dx.hl.matldst.colLoad.<4 x float> (i32, %class.matrix.float.2.2*)"(i32, %class.matrix.float.2.2*) #2 +declare <4 x float> @"dx.hl.matldst.colStore.<4 x float> (i32, %class.matrix.float.2.2*, <4 x float>)"(i32, %class.matrix.float.2.2*, <4 x float>) #0 +declare void @"dx.hl.matldst.colStore.void (i32, %class.matrix.float.2.2*, <4 x float>)"(i32, %class.matrix.float.2.2*, <4 x float>) #0 + +attributes #0 = { nounwind } +attributes #1 = { nounwind readnone } +attributes #2 = { nounwind readonly } + +!dx.version = !{!3} +!dx.valver = !{!4} +!dx.shaderModel = !{!5} +!dx.typeAnnotations = !{!6, !43} +!dx.entryPoints = !{!50} +!dx.fnprops = !{!72} +!dx.options = !{!73, !74} + +!3 = !{i32 1, i32 6} +!4 = !{i32 1, i32 9} +!5 = !{!"vs", i32 6, i32 6} +!6 = !{i32 0, %"class.RWStructuredBuffer >" undef, !7, %"class.RWStructuredBuffer" undef, !12, %"class.RWStructuredBuffer >" undef, !16, %"struct.Vector" undef, !21, %"class.RWStructuredBuffer >" undef, !29, %"class.RWStructuredBuffer >" undef, !35, %"struct.Matrix" undef, !39, %"class.ConsumeStructuredBuffer >" undef, !7, %"class.ConsumeStructuredBuffer" undef, !12, %"class.ConsumeStructuredBuffer >" undef, !16, %"class.ConsumeStructuredBuffer >" undef, !29, %"class.ConsumeStructuredBuffer >" undef, !35, %"class.AppendStructuredBuffer >" undef, !7, %"class.AppendStructuredBuffer" undef, !12, %"class.AppendStructuredBuffer >" undef, !16, %"class.AppendStructuredBuffer >" undef, !29, %"class.AppendStructuredBuffer >" undef, !35} +!7 = !{i32 8, !8, !9} +!8 = !{i32 6, !"h", i32 3, i32 0, i32 7, i32 9} +!9 = !{i32 0, !10} +!10 = !{!11} +!11 = !{i32 0, <2 x float> undef} +!12 = !{i32 20, !8, !13} +!13 = !{i32 0, !14} +!14 = !{!15} +!15 = !{i32 0, [2 x float] undef} +!16 = !{i32 32, !17, !18} +!17 = !{i32 6, !"h", i32 3, i32 0} +!18 = !{i32 0, !19} +!19 = !{!20} +!20 = !{i32 0, %"struct.Vector" undef} +!21 = !{i32 32, !22, !23, !24, !25} +!22 = !{i32 6, !"pad1", i32 3, i32 0, i32 7, i32 9} +!23 = !{i32 6, !"pad2", i32 3, i32 16, i32 7, i32 10} +!24 = !{i32 6, !"v", i32 3, i32 24, i32 7, i32 9} +!25 = !{i32 0, !26} +!26 = !{!27, !28} +!27 = !{i32 0, float undef} +!28 = !{i32 1, i64 2} +!29 = !{i32 24, !30, !32} +!30 = !{i32 6, !"h", i32 2, !31, i32 3, i32 0, i32 7, i32 9} +!31 = !{i32 2, i32 2, i32 2} +!32 = !{i32 0, !33} +!33 = !{!34} +!34 = !{i32 0, %class.matrix.float.2.2 undef} +!35 = !{i32 40, !17, !36} +!36 = !{i32 0, !37} +!37 = !{!38} +!38 = !{i32 0, %"struct.Matrix" undef} +!39 = !{i32 40, !22, !40, !41} +!40 = !{i32 6, !"m", i32 2, !31, i32 3, i32 16, i32 7, i32 9} +!41 = !{i32 0, !42} +!42 = !{!27, !28, !28} +!43 = !{i32 1, void (i32)* @main, !44} +!44 = !{!45, !47} +!45 = !{i32 1, !46, !46} +!46 = !{} +!47 = !{i32 0, !48, !49} +!48 = !{i32 4, !"IX0", i32 7, i32 5} +!49 = !{i32 0} +!50 = !{void (i32)* @main, !"main", null, !51, null} +!51 = !{null, !52, null, null} +!52 = !{!53, !54, !56, !57, !59, !61, !62, !63, !64, !65, !66, !67, !68, !69, !70, !71} +!53 = !{i32 0, %struct.RWByteAddressBuffer* @"\01?BabBuf@@3URWByteAddressBuffer@@A", !"BabBuf", i32 0, i32 1, i32 1, i32 11, i1 false, i1 false, i1 false, null} +!54 = !{i32 1, %"class.RWStructuredBuffer >"* @"\01?VecBuf@@3V?$RWStructuredBuffer@V?$vector@M$01@@@@A", !"VecBuf", i32 0, i32 2, i32 1, i32 12, i1 false, i1 false, i1 false, !55} +!55 = !{i32 1, i32 8} +!56 = !{i32 2, %"class.RWStructuredBuffer"* @"\01?ArrBuf@@3V?$RWStructuredBuffer@$$BY01M@@A", !"ArrBuf", i32 0, i32 3, i32 1, i32 12, i1 false, i1 false, i1 false, !55} +!57 = !{i32 3, %"class.RWStructuredBuffer >"* @"\01?SVecBuf@@3V?$RWStructuredBuffer@U?$Vector@M$01@@@@A", !"SVecBuf", i32 0, i32 4, i32 1, i32 12, i1 false, i1 false, i1 false, !58} +!58 = !{i32 1, i32 32} +!59 = !{i32 4, %"class.RWStructuredBuffer >"* @"\01?MatBuf@@3V?$RWStructuredBuffer@V?$matrix@M$01$01@@@@A", !"MatBuf", i32 0, i32 5, i32 1, i32 12, i1 false, i1 false, i1 false, !60} +!60 = !{i32 1, i32 16} +!61 = !{i32 5, %"class.RWStructuredBuffer >"* @"\01?SMatBuf@@3V?$RWStructuredBuffer@U?$Matrix@M$01$01@@@@A", !"SMatBuf", i32 0, i32 6, i32 1, i32 12, i1 false, i1 false, i1 false, !58} +!62 = !{i32 6, %"class.ConsumeStructuredBuffer >"* @"\01?CVecBuf@@3V?$ConsumeStructuredBuffer@V?$vector@M$01@@@@A", !"CVecBuf", i32 0, i32 7, i32 1, i32 12, i1 false, i1 false, i1 false, !55} +!63 = !{i32 7, %"class.ConsumeStructuredBuffer"* @"\01?CArrBuf@@3V?$ConsumeStructuredBuffer@$$BY01M@@A", !"CArrBuf", i32 0, i32 8, i32 1, i32 12, i1 false, i1 false, i1 false, !55} +!64 = !{i32 8, %"class.ConsumeStructuredBuffer >"* @"\01?CSVecBuf@@3V?$ConsumeStructuredBuffer@U?$Vector@M$01@@@@A", !"CSVecBuf", i32 0, i32 9, i32 1, i32 12, i1 false, i1 false, i1 false, !58} +!65 = !{i32 9, %"class.ConsumeStructuredBuffer >"* @"\01?CMatBuf@@3V?$ConsumeStructuredBuffer@V?$matrix@M$01$01@@@@A", !"CMatBuf", i32 0, i32 10, i32 1, i32 12, i1 false, i1 false, i1 false, !60} +!66 = !{i32 10, %"class.ConsumeStructuredBuffer >"* @"\01?CSMatBuf@@3V?$ConsumeStructuredBuffer@U?$Matrix@M$01$01@@@@A", !"CSMatBuf", i32 0, i32 11, i32 1, i32 12, i1 false, i1 false, i1 false, !58} +!67 = !{i32 11, %"class.AppendStructuredBuffer >"* @"\01?AVecBuf@@3V?$AppendStructuredBuffer@V?$vector@M$01@@@@A", !"AVecBuf", i32 0, i32 12, i32 1, i32 12, i1 false, i1 false, i1 false, !55} +!68 = !{i32 12, %"class.AppendStructuredBuffer"* @"\01?AArrBuf@@3V?$AppendStructuredBuffer@$$BY01M@@A", !"AArrBuf", i32 0, i32 13, i32 1, i32 12, i1 false, i1 false, i1 false, !55} +!69 = !{i32 13, %"class.AppendStructuredBuffer >"* @"\01?ASVecBuf@@3V?$AppendStructuredBuffer@U?$Vector@M$01@@@@A", !"ASVecBuf", i32 0, i32 14, i32 1, i32 12, i1 false, i1 false, i1 false, !58} +!70 = !{i32 14, %"class.AppendStructuredBuffer >"* @"\01?AMatBuf@@3V?$AppendStructuredBuffer@V?$matrix@M$01$01@@@@A", !"AMatBuf", i32 0, i32 15, i32 1, i32 12, i1 false, i1 false, i1 false, !60} +!71 = !{i32 15, %"class.AppendStructuredBuffer >"* @"\01?ASMatBuf@@3V?$AppendStructuredBuffer@U?$Matrix@M$01$01@@@@A", !"ASMatBuf", i32 0, i32 16, i32 1, i32 12, i1 false, i1 false, i1 false, !58} +!72 = !{void (i32)* @main, i32 1} +!73 = !{i32 64} +!74 = !{i32 -1} diff --git a/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-typed-store.hlsl b/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-typed-store.hlsl new file mode 100644 index 0000000000..9ff6039127 --- /dev/null +++ b/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-typed-store.hlsl @@ -0,0 +1,404 @@ +// RUN: %dxc -fcgl -T vs_6_6 %s | FileCheck %s + +// Source file for DxilGen IR test for typed buffer store lowering +// Focuses on converted types in addition to common float type. + +RWBuffer FTyBuf; +RWBuffer BTyBuf; +RWBuffer LTyBuf; +RWBuffer DTyBuf; + +RWTexture1D FTex1d; +RWTexture1D BTex1d; +RWTexture1D LTex1d; +RWTexture1D DTex1d; + +RWTexture2D FTex2d; +RWTexture2D BTex2d; +RWTexture2D LTex2d; +RWTexture2D DTex2d; + +RWTexture3D FTex3d; +RWTexture3D BTex3d; +RWTexture3D LTex3d; +RWTexture3D DTex3d; + +RWTexture2DMS FTex2dMs; +RWTexture2DMS BTex2dMs; +RWTexture2DMS LTex2dMs; +RWTexture2DMS DTex2dMs; + +// CHECK: define void @main(i32 %ix1, <2 x i32> %ix2, <3 x i32> %ix3) +void main(uint ix1 : IX1, uint2 ix2 : IX2, uint3 ix3 : IX3) { + + // CHECK-DAG: [[ix3adr:%.*]] = alloca <3 x i32>, align 4 + // CHECK-DAG: [[ix2adr:%.*]] = alloca <2 x i32>, align 4 + // CHECK-DAG: [[ix1adr:%.*]] = alloca i32, align 4 + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 0 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 777 }, %"class.RWBuffer >" undef) + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ld:%.*]] = load <3 x float>, <3 x float>* [[sub]] + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 1 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 777 }, %"class.RWBuffer >" undef) + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: store <3 x float> [[ld]], <3 x float>* [[sub]] + FTyBuf[ix1 + 1] = FTyBuf[ix1 + 0]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 2 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 517 }, %"class.RWBuffer >" undef) + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ld:%.*]] = load <2 x i32>, <2 x i32>* [[sub]] + // CHECK: [[bld:%.*]] = icmp ne <2 x i32> [[ld]], zeroinitializer + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 3 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 517 }, %"class.RWBuffer >" undef) + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ld:%.*]] = zext <2 x i1> [[bld]] to <2 x i32> + // CHECK: store <2 x i32> [[ld]], <2 x i32>* [[sub]] + BTyBuf[ix1 + 3] = BTyBuf[ix1 + 2]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 4 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 517 }, %"class.RWBuffer >" undef) + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ld:%.*]] = load <2 x i64>, <2 x i64>* [[sub]] + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 5 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 517 }, %"class.RWBuffer >" undef) + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: store <2 x i64> [[ld]], <2 x i64>* [[sub]] + LTyBuf[ix1 + 5] = LTyBuf[ix1 + 4]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 6 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer\22)"(i32 0, %"class.RWBuffer" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 261 }, %"class.RWBuffer" undef) + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ld:%.*]] = load double, double* [[sub]] + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 7 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer\22)"(i32 0, %"class.RWBuffer" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 261 }, %"class.RWBuffer" undef) + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: store double [[ld]], double* [[sub]] + DTyBuf[ix1 + 7] = DTyBuf[ix1 + 6]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 8 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 777 }, %"class.RWTexture1D >" undef) + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ld:%.*]] = load <3 x float>, <3 x float>* [[sub]] + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 9 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 777 }, %"class.RWTexture1D >" undef) + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: store <3 x float> [[ld]], <3 x float>* [[sub]] + FTex1d[ix1 + 9] = FTex1d[ix1 + 8]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 10 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 517 }, %"class.RWTexture1D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ld:%.*]] = load <2 x i32>, <2 x i32>* [[sub]] + // CHECK: [[bld:%.*]] = icmp ne <2 x i32> [[ld]], zeroinitializer + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 11 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 517 }, %"class.RWTexture1D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ld:%.*]] = zext <2 x i1> [[bld]] to <2 x i32> + // CHECK: store <2 x i32> [[ld]], <2 x i32>* [[sub]] + BTex1d[ix1 + 11] = BTex1d[ix1 + 10]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 12 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 517 }, %"class.RWTexture1D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ld:%.*]] = load <2 x i64>, <2 x i64>* [[sub]] + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 13 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 517 }, %"class.RWTexture1D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: store <2 x i64> [[ld]], <2 x i64>* [[sub]] + LTex1d[ix1 + 13] = LTex1d[ix1 + 12]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 14 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D\22)"(i32 0, %"class.RWTexture1D" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 261 }, %"class.RWTexture1D" undef) + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: [[ld:%.*]] = load double, double* [[sub]] + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[ix:%.*]] = add i32 [[ix1]], 15 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D\22)"(i32 0, %"class.RWTexture1D" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 261 }, %"class.RWTexture1D" undef) + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle [[anhdl]], i32 [[ix]]) + // CHECK: store double [[ld]], double* [[sub]] + DTex1d[ix1 + 15] = DTex1d[ix1 + 14]; + + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 777 }, %"class.RWTexture2D >" undef) + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load <3 x float>, <3 x float>* [[sub]] + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 777 }, %"class.RWTexture2D >" undef) + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: store <3 x float> [[ld]], <3 x float>* [[sub]] + FTex2d[ix2 + 17] = FTex2d[ix2 + 16]; + + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 517 }, %"class.RWTexture2D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load <2 x i32>, <2 x i32>* [[sub]] + // CHECK: [[bld:%.*]] = icmp ne <2 x i32> [[ld]], zeroinitializer + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 517 }, %"class.RWTexture2D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = zext <2 x i1> [[bld]] to <2 x i32> + // CHECK: store <2 x i32> [[ld]], <2 x i32>* [[sub]] + BTex2d[ix2 + 19] = BTex2d[ix2 + 18]; + + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 517 }, %"class.RWTexture2D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load <2 x i64>, <2 x i64>* [[sub]] + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 517 }, %"class.RWTexture2D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: store <2 x i64> [[ld]], <2 x i64>* [[sub]] + LTex2d[ix2 + 21] = LTex2d[ix2 + 20]; + + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D\22)"(i32 0, %"class.RWTexture2D" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 261 }, %"class.RWTexture2D" undef) + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load double, double* [[sub]] + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D\22)"(i32 0, %"class.RWTexture2D" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 261 }, %"class.RWTexture2D" undef) + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: store double [[ld]], double* [[sub]] + DTex2d[ix2 + 23] = DTex2d[ix2 + 22]; + + // CHECK: [[ix3:%.*]] = load <3 x i32>, <3 x i32>* [[ix3adr]], align 4 + // CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 777 }, %"class.RWTexture3D >" undef) + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <3 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load <3 x float>, <3 x float>* [[sub]] + // CHECK: [[ix3:%.*]] = load <3 x i32>, <3 x i32>* [[ix3adr]], align 4 + // CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 777 }, %"class.RWTexture3D >" undef) + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <3 x i32> [[ix]]) + // CHECK: store <3 x float> [[ld]], <3 x float>* [[sub]] + FTex3d[ix3 + 25] = FTex3d[ix3 + 24]; + + // CHECK: [[ix3:%.*]] = load <3 x i32>, <3 x i32>* [[ix3adr]], align 4 + // CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 517 }, %"class.RWTexture3D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <3 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load <2 x i32>, <2 x i32>* [[sub]] + // CHECK: [[bld:%.*]] = icmp ne <2 x i32> [[ld]], zeroinitializer + // CHECK: [[ix3:%.*]] = load <3 x i32>, <3 x i32>* [[ix3adr]], align 4 + // CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 517 }, %"class.RWTexture3D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <3 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = zext <2 x i1> [[bld]] to <2 x i32> + // CHECK: store <2 x i32> [[ld]], <2 x i32>* [[sub]] + BTex3d[ix3 + 27] = BTex3d[ix3 + 26]; + + // CHECK: [[ix3:%.*]] = load <3 x i32>, <3 x i32>* [[ix3adr]], align 4 + // CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 517 }, %"class.RWTexture3D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <3 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load <2 x i64>, <2 x i64>* [[sub]] + // CHECK: [[ix3:%.*]] = load <3 x i32>, <3 x i32>* [[ix3adr]], align 4 + // CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 517 }, %"class.RWTexture3D >" undef) + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <3 x i32> [[ix]]) + // CHECK: store <2 x i64> [[ld]], <2 x i64>* [[sub]] + LTex3d[ix3 + 29] = LTex3d[ix3 + 28]; + + // CHECK: [[ix3:%.*]] = load <3 x i32>, <3 x i32>* [[ix3adr]], align 4 + // CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D\22)"(i32 0, %"class.RWTexture3D" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 261 }, %"class.RWTexture3D" undef) + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <3 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load double, double* [[sub]] + // CHECK: [[ix3:%.*]] = load <3 x i32>, <3 x i32>* [[ix3adr]], align 4 + // CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D\22)"(i32 0, %"class.RWTexture3D" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 261 }, %"class.RWTexture3D" undef) + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <3 x i32> [[ix]]) + // CHECK: store double [[ld]], double* [[sub]] + DTex3d[ix3 + 31] = DTex3d[ix3 + 30]; + + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 777 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load <3 x float>, <3 x float>* [[sub]] + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 777 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: store <3 x float> [[ld]], <3 x float>* [[sub]] + FTex2dMs[ix2 + 33] = FTex2dMs[ix2 + 32]; + + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load <2 x i32>, <2 x i32>* [[sub]] + // CHECK: [[bld:%.*]] = icmp ne <2 x i32> [[ld]], zeroinitializer + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = zext <2 x i1> [[bld]] to <2 x i32> + // CHECK: store <2 x i32> [[ld]], <2 x i32>* [[sub]] + BTex2dMs[ix2 + 35] = BTex2dMs[ix2 + 34]; + + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load <2 x i64>, <2 x i64>* [[sub]] + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: store <2 x i64> [[ld]], <2 x i64>* [[sub]] + LTex2dMs[ix2 + 37] = LTex2dMs[ix2 + 36]; + + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS\22)"(i32 0, %"class.RWTexture2DMS" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 261 }, %"class.RWTexture2DMS" undef) + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: [[ld:%.*]] = load double, double* [[sub]] + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS\22)"(i32 0, %"class.RWTexture2DMS" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 261 }, %"class.RWTexture2DMS" undef) + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]]) + // CHECK: store double [[ld]], double* [[sub]] + DTex2dMs[ix2 + 39] = DTex2dMs[ix2 + 38]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[sax:%.*]] = add i32 [[ix1]], 0 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 777 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[][].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]], i32 [[sax]]) + // CHECK: [[ld:%.*]] = load <3 x float>, <3 x float>* [[sub]] + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[sax:%.*]] = add i32 [[ix1]], 1 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 777 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[sub:%.*]] = call <3 x float>* @"dx.hl.subscript.[][].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]], i32 [[sax]]) + // CHECK: store <3 x float> [[ld]], <3 x float>* [[sub]] + FTex2dMs.sample[ix1 + 1][ix2 + 41] = FTex2dMs.sample[ix1 + 0][ix2 + 40]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[sax:%.*]] = add i32 [[ix1]], 2 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[][].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]], i32 [[sax]]) + // CHECK: [[ld:%.*]] = load <2 x i32>, <2 x i32>* [[sub]] + // CHECK: [[bld:%.*]] = icmp ne <2 x i32> [[ld]], zeroinitializer + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[sax:%.*]] = add i32 [[ix1]], 3 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[sub:%.*]] = call <2 x i32>* @"dx.hl.subscript.[][].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]], i32 [[sax]]) + // CHECK: [[ld:%.*]] = zext <2 x i1> [[bld]] to <2 x i32> + // CHECK: store <2 x i32> [[ld]], <2 x i32>* [[sub]] + BTex2dMs.sample[ix1 + 3][ix2 + 43] = BTex2dMs.sample[ix1 + 2][ix2 + 42]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[sax:%.*]] = add i32 [[ix1]], 4 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[][].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]], i32 [[sax]]) + // CHECK: [[ld:%.*]] = load <2 x i64>, <2 x i64>* [[sub]] + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[sax:%.*]] = add i32 [[ix1]], 5 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" undef) + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[sub:%.*]] = call <2 x i64>* @"dx.hl.subscript.[][].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]], i32 [[sax]]) + // CHECK: store <2 x i64> [[ld]], <2 x i64>* [[sub]] + LTex2dMs.sample[ix1 + 5][ix2 + 45] = LTex2dMs.sample[ix1 + 4][ix2 + 44]; + + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[sax:%.*]] = add i32 [[ix1]], 6 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS\22)"(i32 0, %"class.RWTexture2DMS" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 261 }, %"class.RWTexture2DMS" undef) + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[][].rn.double* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]], i32 [[sax]]) + // CHECK: [[ld:%.*]] = load double, double* [[sub]] + // CHECK: [[ix1:%.*]] = load i32, i32* [[ix1adr]], align 4 + // CHECK: [[sax:%.*]] = add i32 [[ix1]], 7 + // CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS\22)"(i32 0, %"class.RWTexture2DMS" + // CHECK: [[anhdl:%.*]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS\22)"(i32 14, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 261 }, %"class.RWTexture2DMS" undef) + // CHECK: [[ix2:%.*]] = load <2 x i32>, <2 x i32>* [[ix2adr]], align 4 + // CHECK: [[ix:%.*]] = add <2 x i32> [[ix2:%.*]], + // CHECK: [[sub:%.*]] = call double* @"dx.hl.subscript.[][].rn.double* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle [[anhdl]], <2 x i32> [[ix]], i32 [[sax]]) + // CHECK: store double [[ld]], double* [[sub]] + DTex2dMs.sample[ix1 + 7][ix2 + 47] = DTex2dMs.sample[ix1 + 6][ix2 + 46]; + + // CHECK: ret void + +} diff --git a/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-typed-store.ll b/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-typed-store.ll new file mode 100644 index 0000000000..ac5c6182e1 --- /dev/null +++ b/tools/clang/test/CodeGenDXIL/hlsl/intrinsics/buffer-typed-store.ll @@ -0,0 +1,1079 @@ +; RUN: %dxopt %s -hlsl-passes-resume -dxilgen -S | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64" +target triple = "dxil-ms-dx" + +%"class.RWBuffer >" = type { <3 x float> } +%"class.RWBuffer >" = type { <2 x i32> } +%"class.RWBuffer >" = type { <2 x i64> } +%"class.RWBuffer" = type { double } +%"class.RWTexture1D >" = type { <3 x float> } +%"class.RWTexture1D >" = type { <2 x i32> } +%"class.RWTexture1D >" = type { <2 x i64> } +%"class.RWTexture1D" = type { double } +%"class.RWTexture2D >" = type { <3 x float> } +%"class.RWTexture2D >" = type { <2 x i32> } +%"class.RWTexture2D >" = type { <2 x i64> } +%"class.RWTexture2D" = type { double } +%"class.RWTexture3D >" = type { <3 x float> } +%"class.RWTexture3D >" = type { <2 x i32> } +%"class.RWTexture3D >" = type { <2 x i64> } +%"class.RWTexture3D" = type { double } +%"class.RWTexture2DMS, 0>" = type { <3 x float>, %"class.RWTexture2DMS, 0>::sample_type" } +%"class.RWTexture2DMS, 0>::sample_type" = type { i32 } +%"class.RWTexture2DMS, 0>" = type { <2 x i32>, %"class.RWTexture2DMS, 0>::sample_type" } +%"class.RWTexture2DMS, 0>::sample_type" = type { i32 } +%"class.RWTexture2DMS, 0>" = type { <2 x i64>, %"class.RWTexture2DMS, 0>::sample_type" } +%"class.RWTexture2DMS, 0>::sample_type" = type { i32 } +%"class.RWTexture2DMS" = type { double, %"class.RWTexture2DMS::sample_type" } +%"class.RWTexture2DMS::sample_type" = type { i32 } +%dx.types.Handle = type { i8* } +%dx.types.ResourceProperties = type { i32, i32 } + +@"\01?FTyBuf@@3V?$RWBuffer@V?$vector@M$02@@@@A" = external global %"class.RWBuffer >", align 4 +@"\01?BTyBuf@@3V?$RWBuffer@V?$vector@_N$01@@@@A" = external global %"class.RWBuffer >", align 4 +@"\01?LTyBuf@@3V?$RWBuffer@V?$vector@_K$01@@@@A" = external global %"class.RWBuffer >", align 8 +@"\01?DTyBuf@@3V?$RWBuffer@N@@A" = external global %"class.RWBuffer", align 8 +@"\01?FTex1d@@3V?$RWTexture1D@V?$vector@M$02@@@@A" = external global %"class.RWTexture1D >", align 4 +@"\01?BTex1d@@3V?$RWTexture1D@V?$vector@_N$01@@@@A" = external global %"class.RWTexture1D >", align 4 +@"\01?LTex1d@@3V?$RWTexture1D@V?$vector@_K$01@@@@A" = external global %"class.RWTexture1D >", align 8 +@"\01?DTex1d@@3V?$RWTexture1D@N@@A" = external global %"class.RWTexture1D", align 8 +@"\01?FTex2d@@3V?$RWTexture2D@V?$vector@M$02@@@@A" = external global %"class.RWTexture2D >", align 4 +@"\01?BTex2d@@3V?$RWTexture2D@V?$vector@_N$01@@@@A" = external global %"class.RWTexture2D >", align 4 +@"\01?LTex2d@@3V?$RWTexture2D@V?$vector@_K$01@@@@A" = external global %"class.RWTexture2D >", align 8 +@"\01?DTex2d@@3V?$RWTexture2D@N@@A" = external global %"class.RWTexture2D", align 8 +@"\01?FTex3d@@3V?$RWTexture3D@V?$vector@M$02@@@@A" = external global %"class.RWTexture3D >", align 4 +@"\01?BTex3d@@3V?$RWTexture3D@V?$vector@_N$01@@@@A" = external global %"class.RWTexture3D >", align 4 +@"\01?LTex3d@@3V?$RWTexture3D@V?$vector@_K$01@@@@A" = external global %"class.RWTexture3D >", align 8 +@"\01?DTex3d@@3V?$RWTexture3D@N@@A" = external global %"class.RWTexture3D", align 8 +@"\01?FTex2dMs@@3V?$RWTexture2DMS@V?$vector@M$02@@$0A@@@A" = external global %"class.RWTexture2DMS, 0>", align 4 +@"\01?BTex2dMs@@3V?$RWTexture2DMS@V?$vector@_N$01@@$0A@@@A" = external global %"class.RWTexture2DMS, 0>", align 4 +@"\01?LTex2dMs@@3V?$RWTexture2DMS@V?$vector@_K$01@@$0A@@@A" = external global %"class.RWTexture2DMS, 0>", align 8 +@"\01?DTex2dMs@@3V?$RWTexture2DMS@N$0A@@@A" = external global %"class.RWTexture2DMS", align 8 + +; Function Attrs: nounwind +; CHECK-LABEL: define void @main(i32 %ix1, <2 x i32> %ix2, <3 x i32> %ix3) +define void @main(i32 %ix1, <2 x i32> %ix2, <3 x i32> %ix3) #0 { +bb: + ; CHECK: [[ix3_0:%.*]] = call i32 @dx.op.loadInput.i32(i32 4, i32 2, i32 0, i8 0, i32 undef) + ; CHECK: [[ix3:%.*]] = insertelement <3 x i32> undef, i32 [[ix3_0]], i64 0 + ; CHECK: [[ix3_1:%.*]] = call i32 @dx.op.loadInput.i32(i32 4, i32 2, i32 0, i8 1, i32 undef) + ; CHECK: [[vec3:%.*]] = insertelement <3 x i32> [[ix3]], i32 [[ix3_1]], i64 1 + ; CHECK: [[ix3_2:%.*]] = call i32 @dx.op.loadInput.i32(i32 4, i32 2, i32 0, i8 2, i32 undef) + ; CHECK: [[ix3:%.*]] = insertelement <3 x i32> [[vec3]], i32 [[ix3_2]], i64 2 + ; CHECK: [[ix2_0:%.*]] = call i32 @dx.op.loadInput.i32(i32 4, i32 1, i32 0, i8 0, i32 undef) + ; CHECK: [[vec2:%.*]] = insertelement <2 x i32> undef, i32 [[ix2_0]], i64 0 + ; CHECK: [[ix2_1:%.*]] = call i32 @dx.op.loadInput.i32(i32 4, i32 1, i32 0, i8 1, i32 undef) + ; CHECK: [[ix2:%.*]] = insertelement <2 x i32> [[vec2]], i32 [[ix2_1]], i64 1 + ; CHECK: [[ix1:%.*]] = call i32 @dx.op.loadInput.i32(i32 4, i32 0, i32 0, i8 0, i32 undef) + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWBuffer >"(i32 160, %"class.RWBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 777 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[anhdl]], i32 [[ix1]], i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[ping:%.*]] = insertelement <3 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <3 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[vec:%.*]] = insertelement <3 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 1 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWBuffer >"(i32 160, %"class.RWBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 777 }) + ; CHECK: [[val3:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <3 x float> [[vec]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <3 x float> [[vec]], i64 2 + ; CHECK: call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, float [[val0]], float [[val1]], float [[val2]], float [[val3]], i8 15) + %tmp = load %"class.RWBuffer >", %"class.RWBuffer >"* @"\01?FTyBuf@@3V?$RWBuffer@V?$vector@M$02@@@@A" + %tmp1 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" %tmp) + %tmp2 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle %tmp1, %dx.types.ResourceProperties { i32 4106, i32 777 }, %"class.RWBuffer >" zeroinitializer) + %tmp3 = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp2, i32 %ix1) + %tmp4 = load <3 x float>, <3 x float>* %tmp3 + %tmp5 = add i32 %ix1, 1 + %tmp6 = load %"class.RWBuffer >", %"class.RWBuffer >"* @"\01?FTyBuf@@3V?$RWBuffer@V?$vector@M$02@@@@A" + %tmp7 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" %tmp6) + %tmp8 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle %tmp7, %dx.types.ResourceProperties { i32 4106, i32 777 }, %"class.RWBuffer >" zeroinitializer) + %tmp9 = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp8, i32 %tmp5) + store <3 x float> %tmp4, <3 x float>* %tmp9 + + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 2 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWBuffer >"(i32 160, %"class.RWBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 517 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32 68, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x i32> undef, i32 [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <2 x i32> [[ping]], i32 [[val1]], i64 1 + ; CHECK: [[bvec:%.*]] = icmp ne <2 x i32> [[pong]], zeroinitializer + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 3 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWBuffer >"(i32 160, %"class.RWBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 517 }) + ; CHECK: [[vec:%.*]] = zext <2 x i1> [[bvec]] to <2 x i32> + ; CHECK: [[val3:%.*]] = extractelement <2 x i32> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i32> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i32> [[vec]], i64 1 + ; CHECK: call void @dx.op.bufferStore.i32(i32 69, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, i32 [[val0]], i32 [[val1]], i32 [[val3]], i32 [[val3]], i8 15) + %tmp10 = add i32 %ix1, 2 + %tmp11 = load %"class.RWBuffer >", %"class.RWBuffer >"* @"\01?BTyBuf@@3V?$RWBuffer@V?$vector@_N$01@@@@A" + %tmp12 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" %tmp11) + %tmp13 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle %tmp12, %dx.types.ResourceProperties { i32 4106, i32 517 }, %"class.RWBuffer >" zeroinitializer) + %tmp14 = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp13, i32 %tmp10) + %tmp15 = load <2 x i32>, <2 x i32>* %tmp14 + %tmp16 = icmp ne <2 x i32> %tmp15, zeroinitializer + %tmp17 = add i32 %ix1, 3 + %tmp18 = load %"class.RWBuffer >", %"class.RWBuffer >"* @"\01?BTyBuf@@3V?$RWBuffer@V?$vector@_N$01@@@@A" + %tmp19 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" %tmp18) + %tmp20 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle %tmp19, %dx.types.ResourceProperties { i32 4106, i32 517 }, %"class.RWBuffer >" zeroinitializer) + %tmp21 = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp20, i32 %tmp17) + %tmp22 = zext <2 x i1> %tmp16 to <2 x i32> + store <2 x i32> %tmp22, <2 x i32>* %tmp21 + + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 4 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWBuffer >"(i32 160, %"class.RWBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 517 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32 68, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 3 + ; CHECK: [[loval:%.*]] = zext i32 [[val0]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val1]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val0:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[loval:%.*]] = zext i32 [[val2]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val3]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val1:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[ping:%.*]] = insertelement <2 x i64> undef, i64 [[val0]], i64 0 + ; CHECK: [[vec:%.*]] = insertelement <2 x i64> [[ping]], i64 [[val1]], i64 1 + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 5 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWBuffer >"(i32 160, %"class.RWBuffer >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 517 }) + ; CHECK: [[val3:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i64> [[vec]], i64 1 + ; CHECK: [[loval0:%.*]] = trunc i64 [[val0]] to i32 + ; CHECK: [[msk0:%.*]] = lshr i64 [[val0]], 32 + ; CHECK: [[hival0:%.*]] = trunc i64 [[msk0]] to i32 + ; CHECK: [[loval1:%.*]] = trunc i64 [[val1]] to i32 + ; CHECK: [[msk1:%.*]] = lshr i64 [[val1]], 32 + ; CHECK: [[hival1:%.*]] = trunc i64 [[msk1]] to i32 + ; CHECK: call void @dx.op.bufferStore.i32(i32 69, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, i32 [[loval0]], i32 [[hival0]], i32 [[loval1]], i32 [[hival1]], i8 15) + %tmp23 = add i32 %ix1, 4 + %tmp24 = load %"class.RWBuffer >", %"class.RWBuffer >"* @"\01?LTyBuf@@3V?$RWBuffer@V?$vector@_K$01@@@@A" + %tmp25 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" %tmp24) + %tmp26 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle %tmp25, %dx.types.ResourceProperties { i32 4106, i32 517 }, %"class.RWBuffer >" zeroinitializer) + %tmp27 = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp26, i32 %tmp23) + %tmp28 = load <2 x i64>, <2 x i64>* %tmp27 + %tmp29 = add i32 %ix1, 5 + %tmp30 = load %"class.RWBuffer >", %"class.RWBuffer >"* @"\01?LTyBuf@@3V?$RWBuffer@V?$vector@_K$01@@@@A" + %tmp31 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32 0, %"class.RWBuffer >" %tmp30) + %tmp32 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32 14, %dx.types.Handle %tmp31, %dx.types.ResourceProperties { i32 4106, i32 517 }, %"class.RWBuffer >" zeroinitializer) + %tmp33 = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp32, i32 %tmp29) + store <2 x i64> %tmp28, <2 x i64>* %tmp33 + + + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 6 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWBuffer"(i32 160, %"class.RWBuffer" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 261 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32 68, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[dval:%.*]] = call double @dx.op.makeDouble.f64(i32 101, i32 [[val0]], i32 [[val1]]) + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 7 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWBuffer"(i32 160, %"class.RWBuffer" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4106, i32 261 }) + ; CHECK: [[dvec:%.*]] = call %dx.types.splitdouble @dx.op.splitDouble.f64(i32 102, double [[dval]]) + ; CHECK: [[lodbl:%.*]] = extractvalue %dx.types.splitdouble [[dvec]], 0 + ; CHECK: [[hidbl:%.*]] = extractvalue %dx.types.splitdouble [[dvec]], 1 + ; CHECK: call void @dx.op.bufferStore.i32(i32 69, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, i32 [[lodbl]], i32 [[hidbl]], i32 [[lodbl]], i32 [[hidbl]], i8 15) + %tmp34 = add i32 %ix1, 6 + %tmp35 = load %"class.RWBuffer", %"class.RWBuffer"* @"\01?DTyBuf@@3V?$RWBuffer@N@@A" + %tmp36 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer\22)"(i32 0, %"class.RWBuffer" %tmp35) + %tmp37 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer\22)"(i32 14, %dx.types.Handle %tmp36, %dx.types.ResourceProperties { i32 4106, i32 261 }, %"class.RWBuffer" zeroinitializer) + %tmp38 = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp37, i32 %tmp34) + %tmp39 = load double, double* %tmp38 + %tmp40 = add i32 %ix1, 7 + %tmp41 = load %"class.RWBuffer", %"class.RWBuffer"* @"\01?DTyBuf@@3V?$RWBuffer@N@@A" + %tmp42 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer\22)"(i32 0, %"class.RWBuffer" %tmp41) + %tmp43 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer\22)"(i32 14, %dx.types.Handle %tmp42, %dx.types.ResourceProperties { i32 4106, i32 261 }, %"class.RWBuffer" zeroinitializer) + %tmp44 = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp43, i32 %tmp40) + store double %tmp39, double* %tmp44 + + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 8 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture1D >"(i32 160, %"class.RWTexture1D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 777 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.textureLoad.f32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix]], i32 undef, i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[ping:%.*]] = insertelement <3 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <3 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[vec:%.*]] = insertelement <3 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 9 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture1D >"(i32 160, %"class.RWTexture1D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 777 }) + ; CHECK: [[val3:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <3 x float> [[vec]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <3 x float> [[vec]], i64 2 + ; CHECK: call void @dx.op.textureStore.f32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, i32 undef, float [[val0]], float [[val1]], float [[val2]], float [[val3]], i8 15) + %tmp45 = add i32 %ix1, 8 + %tmp46 = load %"class.RWTexture1D >", %"class.RWTexture1D >"* @"\01?FTex1d@@3V?$RWTexture1D@V?$vector@M$02@@@@A" + %tmp47 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" %tmp46) + %tmp48 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle %tmp47, %dx.types.ResourceProperties { i32 4097, i32 777 }, %"class.RWTexture1D >" zeroinitializer) + %tmp49 = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp48, i32 %tmp45) + %tmp50 = load <3 x float>, <3 x float>* %tmp49 + %tmp51 = add i32 %ix1, 9 + %tmp52 = load %"class.RWTexture1D >", %"class.RWTexture1D >"* @"\01?FTex1d@@3V?$RWTexture1D@V?$vector@M$02@@@@A" + %tmp53 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" %tmp52) + %tmp54 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle %tmp53, %dx.types.ResourceProperties { i32 4097, i32 777 }, %"class.RWTexture1D >" zeroinitializer) + %tmp55 = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp54, i32 %tmp51) + store <3 x float> %tmp50, <3 x float>* %tmp55 + + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 10 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture1D >"(i32 160, %"class.RWTexture1D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 517 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix]], i32 undef, i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x i32> undef, i32 [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <2 x i32> [[ping]], i32 [[val1]], i64 1 + ; CHECK: [[bvec:%.*]] = icmp ne <2 x i32> [[pong]], zeroinitializer + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 11 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture1D >"(i32 160, %"class.RWTexture1D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 517 }) + ; CHECK: [[vec:%.*]] = zext <2 x i1> [[bvec]] to <2 x i32> + ; CHECK: [[val3:%.*]] = extractelement <2 x i32> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i32> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i32> [[vec]], i64 1 + ; CHECK: call void @dx.op.textureStore.i32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, i32 undef, i32 [[val0]], i32 [[val1]], i32 [[val3]], i32 [[val3]], i8 15) + %tmp56 = add i32 %ix1, 10 + %tmp57 = load %"class.RWTexture1D >", %"class.RWTexture1D >"* @"\01?BTex1d@@3V?$RWTexture1D@V?$vector@_N$01@@@@A" + %tmp58 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" %tmp57) + %tmp59 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle %tmp58, %dx.types.ResourceProperties { i32 4097, i32 517 }, %"class.RWTexture1D >" zeroinitializer) + %tmp60 = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp59, i32 %tmp56) + %tmp61 = load <2 x i32>, <2 x i32>* %tmp60 + %tmp62 = icmp ne <2 x i32> %tmp61, zeroinitializer + %tmp63 = add i32 %ix1, 11 + %tmp64 = load %"class.RWTexture1D >", %"class.RWTexture1D >"* @"\01?BTex1d@@3V?$RWTexture1D@V?$vector@_N$01@@@@A" + %tmp65 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" %tmp64) + %tmp66 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle %tmp65, %dx.types.ResourceProperties { i32 4097, i32 517 }, %"class.RWTexture1D >" zeroinitializer) + %tmp67 = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp66, i32 %tmp63) + %tmp68 = zext <2 x i1> %tmp62 to <2 x i32> + store <2 x i32> %tmp68, <2 x i32>* %tmp67 + + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 12 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture1D >"(i32 160, %"class.RWTexture1D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 517 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix]], i32 undef, i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 3 + ; CHECK: [[loval:%.*]] = zext i32 [[val0]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val1]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val0:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[loval:%.*]] = zext i32 [[val2]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val3]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val1:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[ping:%.*]] = insertelement <2 x i64> undef, i64 [[val0]], i64 0 + ; CHECK: [[vec:%.*]] = insertelement <2 x i64> [[ping]], i64 [[val1]], i64 1 + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 13 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture1D >"(i32 160, %"class.RWTexture1D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 517 }) + ; CHECK: [[val3:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i64> [[vec]], i64 1 + ; CHECK: [[loval0:%.*]] = trunc i64 [[val0]] to i32 + ; CHECK: [[msk0:%.*]] = lshr i64 [[val0]], 32 + ; CHECK: [[hival0:%.*]] = trunc i64 [[msk0]] to i32 + ; CHECK: [[loval1:%.*]] = trunc i64 [[val1]] to i32 + ; CHECK: [[msk1:%.*]] = lshr i64 [[val1]], 32 + ; CHECK: [[hival1:%.*]] = trunc i64 [[msk1]] to i32 + ; CHECK: call void @dx.op.textureStore.i32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, i32 undef, i32 [[loval0]], i32 [[hival0]], i32 [[loval1]], i32 [[hival1]], i8 15) + %tmp69 = add i32 %ix1, 12 + %tmp70 = load %"class.RWTexture1D >", %"class.RWTexture1D >"* @"\01?LTex1d@@3V?$RWTexture1D@V?$vector@_K$01@@@@A" + %tmp71 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" %tmp70) + %tmp72 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle %tmp71, %dx.types.ResourceProperties { i32 4097, i32 517 }, %"class.RWTexture1D >" zeroinitializer) + %tmp73 = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp72, i32 %tmp69) + %tmp74 = load <2 x i64>, <2 x i64>* %tmp73 + %tmp75 = add i32 %ix1, 13 + %tmp76 = load %"class.RWTexture1D >", %"class.RWTexture1D >"* @"\01?LTex1d@@3V?$RWTexture1D@V?$vector@_K$01@@@@A" + %tmp77 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32 0, %"class.RWTexture1D >" %tmp76) + %tmp78 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32 14, %dx.types.Handle %tmp77, %dx.types.ResourceProperties { i32 4097, i32 517 }, %"class.RWTexture1D >" zeroinitializer) + %tmp79 = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp78, i32 %tmp75) + store <2 x i64> %tmp74, <2 x i64>* %tmp79 + + + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 14 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture1D"(i32 160, %"class.RWTexture1D" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 261 }) + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix]], i32 undef, i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[dval:%.*]] = call double @dx.op.makeDouble.f64(i32 101, i32 [[val0]], i32 [[val1]]) + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 15 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture1D"(i32 160, %"class.RWTexture1D" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4097, i32 261 }) + ; CHECK: [[dvec:%.*]] = call %dx.types.splitdouble @dx.op.splitDouble.f64(i32 102, double [[dval]]) + ; CHECK: [[lodbl:%.*]] = extractvalue %dx.types.splitdouble [[dvec]], 0 + ; CHECK: [[hidbl:%.*]] = extractvalue %dx.types.splitdouble [[dvec]], 1 + ; CHECK: call void @dx.op.textureStore.i32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix]], i32 undef, i32 undef, i32 [[lodbl]], i32 [[hidbl]], i32 [[lodbl]], i32 [[hidbl]], i8 15) + %tmp80 = add i32 %ix1, 14 + %tmp81 = load %"class.RWTexture1D", %"class.RWTexture1D"* @"\01?DTex1d@@3V?$RWTexture1D@N@@A" + %tmp82 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D\22)"(i32 0, %"class.RWTexture1D" %tmp81) + %tmp83 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D\22)"(i32 14, %dx.types.Handle %tmp82, %dx.types.ResourceProperties { i32 4097, i32 261 }, %"class.RWTexture1D" zeroinitializer) + %tmp84 = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp83, i32 %tmp80) + %tmp85 = load double, double* %tmp84 + %tmp86 = add i32 %ix1, 15 + %tmp87 = load %"class.RWTexture1D", %"class.RWTexture1D"* @"\01?DTex1d@@3V?$RWTexture1D@N@@A" + %tmp88 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D\22)"(i32 0, %"class.RWTexture1D" %tmp87) + %tmp89 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D\22)"(i32 14, %dx.types.Handle %tmp88, %dx.types.ResourceProperties { i32 4097, i32 261 }, %"class.RWTexture1D" zeroinitializer) + %tmp90 = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, i32)"(i32 0, %dx.types.Handle %tmp89, i32 %tmp86) + store double %tmp85, double* %tmp90 + + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2D >"(i32 160, %"class.RWTexture2D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 777 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.textureLoad.f32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[ping:%.*]] = insertelement <3 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <3 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[vec:%.*]] = insertelement <3 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2D >"(i32 160, %"class.RWTexture2D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 777 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[val3:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <3 x float> [[vec]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <3 x float> [[vec]], i64 2 + ; CHECK: call void @dx.op.textureStore.f32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, float [[val0]], float [[val1]], float [[val2]], float [[val3]], i8 15) + %tmp91 = add <2 x i32> %ix2, + %tmp92 = load %"class.RWTexture2D >", %"class.RWTexture2D >"* @"\01?FTex2d@@3V?$RWTexture2D@V?$vector@M$02@@@@A" + %tmp93 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" %tmp92) + %tmp94 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle %tmp93, %dx.types.ResourceProperties { i32 4098, i32 777 }, %"class.RWTexture2D >" zeroinitializer) + %tmp95 = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp94, <2 x i32> %tmp91) + %tmp96 = load <3 x float>, <3 x float>* %tmp95 + %tmp97 = add <2 x i32> %ix2, + %tmp98 = load %"class.RWTexture2D >", %"class.RWTexture2D >"* @"\01?FTex2d@@3V?$RWTexture2D@V?$vector@M$02@@@@A" + %tmp99 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" %tmp98) + %tmp100 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle %tmp99, %dx.types.ResourceProperties { i32 4098, i32 777 }, %"class.RWTexture2D >" zeroinitializer) + %tmp101 = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp100, <2 x i32> %tmp97) + store <3 x float> %tmp96, <3 x float>* %tmp101 + + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2D >"(i32 160, %"class.RWTexture2D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 517 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x i32> undef, i32 [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <2 x i32> [[ping]], i32 [[val1]], i64 1 + ; CHECK: [[bvec:%.*]] = icmp ne <2 x i32> [[pong]], zeroinitializer + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2D >"(i32 160, %"class.RWTexture2D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 517 }) + ; CHECK: [[vec:%.*]] = zext <2 x i1> [[bvec]] to <2 x i32> + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[val3:%.*]] = extractelement <2 x i32> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i32> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i32> [[vec]], i64 1 + ; CHECK: call void @dx.op.textureStore.i32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 [[val0]], i32 [[val1]], i32 [[val3]], i32 [[val3]], i8 15) + %tmp102 = add <2 x i32> %ix2, + %tmp103 = load %"class.RWTexture2D >", %"class.RWTexture2D >"* @"\01?BTex2d@@3V?$RWTexture2D@V?$vector@_N$01@@@@A" + %tmp104 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" %tmp103) + %tmp105 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle %tmp104, %dx.types.ResourceProperties { i32 4098, i32 517 }, %"class.RWTexture2D >" zeroinitializer) + %tmp106 = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp105, <2 x i32> %tmp102) + %tmp107 = load <2 x i32>, <2 x i32>* %tmp106 + %tmp108 = icmp ne <2 x i32> %tmp107, zeroinitializer + %tmp109 = add <2 x i32> %ix2, + %tmp110 = load %"class.RWTexture2D >", %"class.RWTexture2D >"* @"\01?BTex2d@@3V?$RWTexture2D@V?$vector@_N$01@@@@A" + %tmp111 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" %tmp110) + %tmp112 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle %tmp111, %dx.types.ResourceProperties { i32 4098, i32 517 }, %"class.RWTexture2D >" zeroinitializer) + %tmp113 = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp112, <2 x i32> %tmp109) + %tmp114 = zext <2 x i1> %tmp108 to <2 x i32> + store <2 x i32> %tmp114, <2 x i32>* %tmp113 + + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2D >"(i32 160, %"class.RWTexture2D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 517 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 3 + ; CHECK: [[loval:%.*]] = zext i32 [[val0]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val1]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val0:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[loval:%.*]] = zext i32 [[val2]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val3]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val1:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[ping:%.*]] = insertelement <2 x i64> undef, i64 [[val0]], i64 0 + ; CHECK: [[vec:%.*]] = insertelement <2 x i64> [[ping]], i64 [[val1]], i64 1 + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2D >"(i32 160, %"class.RWTexture2D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 517 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[val3:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i64> [[vec]], i64 1 + ; CHECK: [[loval0:%.*]] = trunc i64 [[val0]] to i32 + ; CHECK: [[msk0:%.*]] = lshr i64 [[val0]], 32 + ; CHECK: [[hival0:%.*]] = trunc i64 [[msk0]] to i32 + ; CHECK: [[loval1:%.*]] = trunc i64 [[val1]] to i32 + ; CHECK: [[msk1:%.*]] = lshr i64 [[val1]], 32 + ; CHECK: [[hival1:%.*]] = trunc i64 [[msk1]] to i32 + ; CHECK: call void @dx.op.textureStore.i32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 [[loval0]], i32 [[hival0]], i32 [[loval1]], i32 [[hival1]], i8 15) + %tmp115 = add <2 x i32> %ix2, + %tmp116 = load %"class.RWTexture2D >", %"class.RWTexture2D >"* @"\01?LTex2d@@3V?$RWTexture2D@V?$vector@_K$01@@@@A" + %tmp117 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" %tmp116) + %tmp118 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle %tmp117, %dx.types.ResourceProperties { i32 4098, i32 517 }, %"class.RWTexture2D >" zeroinitializer) + %tmp119 = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp118, <2 x i32> %tmp115) + %tmp120 = load <2 x i64>, <2 x i64>* %tmp119 + %tmp121 = add <2 x i32> %ix2, + %tmp122 = load %"class.RWTexture2D >", %"class.RWTexture2D >"* @"\01?LTex2d@@3V?$RWTexture2D@V?$vector@_K$01@@@@A" + %tmp123 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32 0, %"class.RWTexture2D >" %tmp122) + %tmp124 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32 14, %dx.types.Handle %tmp123, %dx.types.ResourceProperties { i32 4098, i32 517 }, %"class.RWTexture2D >" zeroinitializer) + %tmp125 = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp124, <2 x i32> %tmp121) + store <2 x i64> %tmp120, <2 x i64>* %tmp125 + + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2D"(i32 160, %"class.RWTexture2D" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 261 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[dval:%.*]] = call double @dx.op.makeDouble.f64(i32 101, i32 [[val0]], i32 [[val1]]) + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2D"(i32 160, %"class.RWTexture2D" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4098, i32 261 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[dvec:%.*]] = call %dx.types.splitdouble @dx.op.splitDouble.f64(i32 102, double [[dval]]) + ; CHECK: [[lodbl:%.*]] = extractvalue %dx.types.splitdouble [[dvec]], 0 + ; CHECK: [[hidbl:%.*]] = extractvalue %dx.types.splitdouble [[dvec]], 1 + ; CHECK: call void @dx.op.textureStore.i32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 [[lodbl]], i32 [[hidbl]], i32 [[lodbl]], i32 [[hidbl]], i8 15) + %tmp126 = add <2 x i32> %ix2, + %tmp127 = load %"class.RWTexture2D", %"class.RWTexture2D"* @"\01?DTex2d@@3V?$RWTexture2D@N@@A" + %tmp128 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D\22)"(i32 0, %"class.RWTexture2D" %tmp127) + %tmp129 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D\22)"(i32 14, %dx.types.Handle %tmp128, %dx.types.ResourceProperties { i32 4098, i32 261 }, %"class.RWTexture2D" zeroinitializer) + %tmp130 = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp129, <2 x i32> %tmp126) + %tmp131 = load double, double* %tmp130 + %tmp132 = add <2 x i32> %ix2, + %tmp133 = load %"class.RWTexture2D", %"class.RWTexture2D"* @"\01?DTex2d@@3V?$RWTexture2D@N@@A" + %tmp134 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D\22)"(i32 0, %"class.RWTexture2D" %tmp133) + %tmp135 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D\22)"(i32 14, %dx.types.Handle %tmp134, %dx.types.ResourceProperties { i32 4098, i32 261 }, %"class.RWTexture2D" zeroinitializer) + %tmp136 = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp135, <2 x i32> %tmp132) + store double %tmp131, double* %tmp136 + + ; CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture3D >"(i32 160, %"class.RWTexture3D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 777 }) + ; CHECK: [[ix3_0:%.*]] = extractelement <3 x i32> [[ix]], i64 0 + ; CHECK: [[ix3_1:%.*]] = extractelement <3 x i32> [[ix]], i64 1 + ; CHECK: [[ix3_2:%.*]] = extractelement <3 x i32> [[ix]], i64 2 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.textureLoad.f32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix3_0]], i32 [[ix3_1]], i32 [[ix3_2]], i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[ping:%.*]] = insertelement <3 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <3 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[vec:%.*]] = insertelement <3 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture3D >"(i32 160, %"class.RWTexture3D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 777 }) + ; CHECK: [[ix3_0:%.*]] = extractelement <3 x i32> [[ix]], i64 0 + ; CHECK: [[ix3_1:%.*]] = extractelement <3 x i32> [[ix]], i64 1 + ; CHECK: [[ix3_2:%.*]] = extractelement <3 x i32> [[ix]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <3 x float> [[vec]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <3 x float> [[vec]], i64 2 + ; CHECK: call void @dx.op.textureStore.f32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix3_0]], i32 [[ix3_1]], i32 [[ix3_2]], float [[val0]], float [[val1]], float [[val2]], float [[val3]], i8 15) + %tmp137 = add <3 x i32> %ix3, + %tmp138 = load %"class.RWTexture3D >", %"class.RWTexture3D >"* @"\01?FTex3d@@3V?$RWTexture3D@V?$vector@M$02@@@@A" + %tmp139 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" %tmp138) + %tmp140 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle %tmp139, %dx.types.ResourceProperties { i32 4100, i32 777 }, %"class.RWTexture3D >" zeroinitializer) + %tmp141 = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle %tmp140, <3 x i32> %tmp137) + %tmp142 = load <3 x float>, <3 x float>* %tmp141 + %tmp143 = add <3 x i32> %ix3, + %tmp144 = load %"class.RWTexture3D >", %"class.RWTexture3D >"* @"\01?FTex3d@@3V?$RWTexture3D@V?$vector@M$02@@@@A" + %tmp145 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" %tmp144) + %tmp146 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle %tmp145, %dx.types.ResourceProperties { i32 4100, i32 777 }, %"class.RWTexture3D >" zeroinitializer) + %tmp147 = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle %tmp146, <3 x i32> %tmp143) + store <3 x float> %tmp142, <3 x float>* %tmp147 + + ; CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture3D >"(i32 160, %"class.RWTexture3D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 517 }) + ; CHECK: [[ix3_0:%.*]] = extractelement <3 x i32> [[ix]], i64 0 + ; CHECK: [[ix3_1:%.*]] = extractelement <3 x i32> [[ix]], i64 1 + ; CHECK: [[ix3_2:%.*]] = extractelement <3 x i32> [[ix]], i64 2 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix3_0]], i32 [[ix3_1]], i32 [[ix3_2]], i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x i32> undef, i32 [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <2 x i32> [[ping]], i32 [[val1]], i64 1 + ; CHECK: [[bvec:%.*]] = icmp ne <2 x i32> [[pong]], zeroinitializer + ; CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture3D >"(i32 160, %"class.RWTexture3D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 517 }) + ; CHECK: [[vec:%.*]] = zext <2 x i1> [[bvec]] to <2 x i32> + ; CHECK: [[ix3_0:%.*]] = extractelement <3 x i32> [[ix]], i64 0 + ; CHECK: [[ix3_1:%.*]] = extractelement <3 x i32> [[ix]], i64 1 + ; CHECK: [[ix3_2:%.*]] = extractelement <3 x i32> [[ix]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <2 x i32> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i32> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i32> [[vec]], i64 1 + ; CHECK: call void @dx.op.textureStore.i32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix3_0]], i32 [[ix3_1]], i32 [[ix3_2]], i32 [[val0]], i32 [[val1]], i32 [[val3]], i32 [[val3]], i8 15) + %tmp148 = add <3 x i32> %ix3, + %tmp149 = load %"class.RWTexture3D >", %"class.RWTexture3D >"* @"\01?BTex3d@@3V?$RWTexture3D@V?$vector@_N$01@@@@A" + %tmp150 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" %tmp149) + %tmp151 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle %tmp150, %dx.types.ResourceProperties { i32 4100, i32 517 }, %"class.RWTexture3D >" zeroinitializer) + %tmp152 = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle %tmp151, <3 x i32> %tmp148) + %tmp153 = load <2 x i32>, <2 x i32>* %tmp152 + %tmp154 = icmp ne <2 x i32> %tmp153, zeroinitializer + %tmp155 = add <3 x i32> %ix3, + %tmp156 = load %"class.RWTexture3D >", %"class.RWTexture3D >"* @"\01?BTex3d@@3V?$RWTexture3D@V?$vector@_N$01@@@@A" + %tmp157 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" %tmp156) + %tmp158 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle %tmp157, %dx.types.ResourceProperties { i32 4100, i32 517 }, %"class.RWTexture3D >" zeroinitializer) + %tmp159 = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle %tmp158, <3 x i32> %tmp155) + %tmp160 = zext <2 x i1> %tmp154 to <2 x i32> + store <2 x i32> %tmp160, <2 x i32>* %tmp159 + + ; CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture3D >"(i32 160, %"class.RWTexture3D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 517 }) + ; CHECK: [[ix3_0:%.*]] = extractelement <3 x i32> [[ix]], i64 0 + ; CHECK: [[ix3_1:%.*]] = extractelement <3 x i32> [[ix]], i64 1 + ; CHECK: [[ix3_2:%.*]] = extractelement <3 x i32> [[ix]], i64 2 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix3_0]], i32 [[ix3_1]], i32 [[ix3_2]], i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 3 + ; CHECK: [[loval:%.*]] = zext i32 [[val0]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val1]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val0:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[loval:%.*]] = zext i32 [[val2]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val3]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val1:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[ping:%.*]] = insertelement <2 x i64> undef, i64 [[val0]], i64 0 + ; CHECK: [[vec:%.*]] = insertelement <2 x i64> [[ping]], i64 [[val1]], i64 1 + ; CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture3D >"(i32 160, %"class.RWTexture3D >" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 517 }) + ; CHECK: [[ix3_0:%.*]] = extractelement <3 x i32> [[ix]], i64 0 + ; CHECK: [[ix3_1:%.*]] = extractelement <3 x i32> [[ix]], i64 1 + ; CHECK: [[ix3_2:%.*]] = extractelement <3 x i32> [[ix]], i64 2 + ; CHECK: [[val3:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i64> [[vec]], i64 1 + ; CHECK: [[loval0:%.*]] = trunc i64 [[val0]] to i32 + ; CHECK: [[msk0:%.*]] = lshr i64 [[val0]], 32 + ; CHECK: [[hival0:%.*]] = trunc i64 [[msk0]] to i32 + ; CHECK: [[loval1:%.*]] = trunc i64 [[val1]] to i32 + ; CHECK: [[msk1:%.*]] = lshr i64 [[val1]], 32 + ; CHECK: [[hival1:%.*]] = trunc i64 [[msk1]] to i32 + ; CHECK: call void @dx.op.textureStore.i32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix3_0]], i32 [[ix3_1]], i32 [[ix3_2]], i32 [[loval0]], i32 [[hival0]], i32 [[loval1]], i32 [[hival1]], i8 15) + %tmp161 = add <3 x i32> %ix3, + %tmp162 = load %"class.RWTexture3D >", %"class.RWTexture3D >"* @"\01?LTex3d@@3V?$RWTexture3D@V?$vector@_K$01@@@@A" + %tmp163 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" %tmp162) + %tmp164 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle %tmp163, %dx.types.ResourceProperties { i32 4100, i32 517 }, %"class.RWTexture3D >" zeroinitializer) + %tmp165 = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle %tmp164, <3 x i32> %tmp161) + %tmp166 = load <2 x i64>, <2 x i64>* %tmp165 + %tmp167 = add <3 x i32> %ix3, + %tmp168 = load %"class.RWTexture3D >", %"class.RWTexture3D >"* @"\01?LTex3d@@3V?$RWTexture3D@V?$vector@_K$01@@@@A" + %tmp169 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32 0, %"class.RWTexture3D >" %tmp168) + %tmp170 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32 14, %dx.types.Handle %tmp169, %dx.types.ResourceProperties { i32 4100, i32 517 }, %"class.RWTexture3D >" zeroinitializer) + %tmp171 = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle %tmp170, <3 x i32> %tmp167) + store <2 x i64> %tmp166, <2 x i64>* %tmp171 + + ; CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture3D"(i32 160, %"class.RWTexture3D" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 261 }) + ; CHECK: [[ix3_0:%.*]] = extractelement <3 x i32> [[ix]], i64 0 + ; CHECK: [[ix3_1:%.*]] = extractelement <3 x i32> [[ix]], i64 1 + ; CHECK: [[ix3_2:%.*]] = extractelement <3 x i32> [[ix]], i64 2 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 undef, i32 [[ix3_0]], i32 [[ix3_1]], i32 [[ix3_2]], i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[dval:%.*]] = call double @dx.op.makeDouble.f64(i32 101, i32 [[val0]], i32 [[val1]]) + ; CHECK: [[ix:%.*]] = add <3 x i32> [[ix3]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture3D"(i32 160, %"class.RWTexture3D" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4100, i32 261 }) + ; CHECK: [[ix3_0:%.*]] = extractelement <3 x i32> [[ix]], i64 0 + ; CHECK: [[ix3_1:%.*]] = extractelement <3 x i32> [[ix]], i64 1 + ; CHECK: [[ix3_2:%.*]] = extractelement <3 x i32> [[ix]], i64 2 + ; CHECK: [[dvec:%.*]] = call %dx.types.splitdouble @dx.op.splitDouble.f64(i32 102, double [[dval]]) + ; CHECK: [[lodbl:%.*]] = extractvalue %dx.types.splitdouble [[dvec]], 0 + ; CHECK: [[hidbl:%.*]] = extractvalue %dx.types.splitdouble [[dvec]], 1 + ; CHECK: call void @dx.op.textureStore.i32(i32 67, %dx.types.Handle [[anhdl]], i32 [[ix3_0]], i32 [[ix3_1]], i32 [[ix3_2]], i32 [[lodbl]], i32 [[hidbl]], i32 [[lodbl]], i32 [[hidbl]], i8 15) + %tmp172 = add <3 x i32> %ix3, + %tmp173 = load %"class.RWTexture3D", %"class.RWTexture3D"* @"\01?DTex3d@@3V?$RWTexture3D@N@@A" + %tmp174 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D\22)"(i32 0, %"class.RWTexture3D" %tmp173) + %tmp175 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D\22)"(i32 14, %dx.types.Handle %tmp174, %dx.types.ResourceProperties { i32 4100, i32 261 }, %"class.RWTexture3D" zeroinitializer) + %tmp176 = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle %tmp175, <3 x i32> %tmp172) + %tmp177 = load double, double* %tmp176 + %tmp178 = add <3 x i32> %ix3, + %tmp179 = load %"class.RWTexture3D", %"class.RWTexture3D"* @"\01?DTex3d@@3V?$RWTexture3D@N@@A" + %tmp180 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D\22)"(i32 0, %"class.RWTexture3D" %tmp179) + %tmp181 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D\22)"(i32 14, %dx.types.Handle %tmp180, %dx.types.ResourceProperties { i32 4100, i32 261 }, %"class.RWTexture3D" zeroinitializer) + %tmp182 = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <3 x i32>)"(i32 0, %dx.types.Handle %tmp181, <3 x i32> %tmp178) + store double %tmp177, double* %tmp182 + + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 777 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.textureLoad.f32(i32 66, %dx.types.Handle [[anhdl]], i32 0, i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[ping:%.*]] = insertelement <3 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <3 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[vec:%.*]] = insertelement <3 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 777 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[val3:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <3 x float> [[vec]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <3 x float> [[vec]], i64 2 + ; CHECK: call void @dx.op.textureStoreSample.f32(i32 225, %dx.types.Handle [[anhdl]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, float [[val0]], float [[val1]], float [[val2]], float [[val3]], i8 15, i32 0) + %tmp183 = add <2 x i32> %ix2, + %tmp184 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?FTex2dMs@@3V?$RWTexture2DMS@V?$vector@M$02@@$0A@@@A" + %tmp185 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp184) + %tmp186 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp185, %dx.types.ResourceProperties { i32 4099, i32 777 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp187 = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp186, <2 x i32> %tmp183) + %tmp188 = load <3 x float>, <3 x float>* %tmp187 + %tmp189 = add <2 x i32> %ix2, + %tmp190 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?FTex2dMs@@3V?$RWTexture2DMS@V?$vector@M$02@@$0A@@@A" + %tmp191 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp190) + %tmp192 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp191, %dx.types.ResourceProperties { i32 4099, i32 777 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp193 = call <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp192, <2 x i32> %tmp189) + store <3 x float> %tmp188, <3 x float>* %tmp193 + + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 0, i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x i32> undef, i32 [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <2 x i32> [[ping]], i32 [[val1]], i64 1 + ; CHECK: [[bvec:%.*]] = icmp ne <2 x i32> [[pong]], zeroinitializer + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }) + ; CHECK: [[vec:%.*]] = zext <2 x i1> [[bvec]] to <2 x i32> + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[val3:%.*]] = extractelement <2 x i32> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i32> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i32> [[vec]], i64 1 + ; CHECK: call void @dx.op.textureStoreSample.i32(i32 225, %dx.types.Handle [[anhdl]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 [[val0]], i32 [[val1]], i32 [[val3]], i32 [[val3]], i8 15, i32 0) + %tmp194 = add <2 x i32> %ix2, + %tmp195 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?BTex2dMs@@3V?$RWTexture2DMS@V?$vector@_N$01@@$0A@@@A" + %tmp196 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp195) + %tmp197 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp196, %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp198 = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp197, <2 x i32> %tmp194) + %tmp199 = load <2 x i32>, <2 x i32>* %tmp198 + %tmp200 = icmp ne <2 x i32> %tmp199, zeroinitializer + %tmp201 = add <2 x i32> %ix2, + %tmp202 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?BTex2dMs@@3V?$RWTexture2DMS@V?$vector@_N$01@@$0A@@@A" + %tmp203 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp202) + %tmp204 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp203, %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp205 = call <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp204, <2 x i32> %tmp201) + %tmp206 = zext <2 x i1> %tmp200 to <2 x i32> + store <2 x i32> %tmp206, <2 x i32>* %tmp205 + + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 0, i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 3 + ; CHECK: [[loval:%.*]] = zext i32 [[val0]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val1]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val0:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[loval:%.*]] = zext i32 [[val2]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val3]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val1:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[ping:%.*]] = insertelement <2 x i64> undef, i64 [[val0]], i64 0 + ; CHECK: [[vec:%.*]] = insertelement <2 x i64> [[ping]], i64 [[val1]], i64 1 + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[val3:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i64> [[vec]], i64 1 + ; CHECK: [[loval0:%.*]] = trunc i64 [[val0]] to i32 + ; CHECK: [[msk0:%.*]] = lshr i64 [[val0]], 32 + ; CHECK: [[hival0:%.*]] = trunc i64 [[msk0]] to i32 + ; CHECK: [[loval1:%.*]] = trunc i64 [[val1]] to i32 + ; CHECK: [[msk1:%.*]] = lshr i64 [[val1]], 32 + ; CHECK: [[hival1:%.*]] = trunc i64 [[msk1]] to i32 + ; CHECK: call void @dx.op.textureStoreSample.i32(i32 225, %dx.types.Handle [[anhdl]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 [[loval0]], i32 [[hival0]], i32 [[loval1]], i32 [[hival1]], i8 15, i32 0) + + %tmp207 = add <2 x i32> %ix2, + %tmp208 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?LTex2dMs@@3V?$RWTexture2DMS@V?$vector@_K$01@@$0A@@@A" + %tmp209 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp208) + %tmp210 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp209, %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp211 = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp210, <2 x i32> %tmp207) + %tmp212 = load <2 x i64>, <2 x i64>* %tmp211 + %tmp213 = add <2 x i32> %ix2, + %tmp214 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?LTex2dMs@@3V?$RWTexture2DMS@V?$vector@_K$01@@$0A@@@A" + %tmp215 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp214) + %tmp216 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp215, %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp217 = call <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp216, <2 x i32> %tmp213) + store <2 x i64> %tmp212, <2 x i64>* %tmp217 + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS"(i32 160, %"class.RWTexture2DMS" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 261 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 0, i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[dval:%.*]] = call double @dx.op.makeDouble.f64(i32 101, i32 [[val0]], i32 [[val1]]) + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS"(i32 160, %"class.RWTexture2DMS" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 261 }) + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[dvec:%.*]] = call %dx.types.splitdouble @dx.op.splitDouble.f64(i32 102, double [[dval]]) + ; CHECK: [[lodbl:%.*]] = extractvalue %dx.types.splitdouble [[dvec]], 0 + ; CHECK: [[hidbl:%.*]] = extractvalue %dx.types.splitdouble [[dvec]], 1 + ; CHECK: call void @dx.op.textureStoreSample.i32(i32 225, %dx.types.Handle [[anhdl]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 [[lodbl]], i32 [[hidbl]], i32 [[lodbl]], i32 [[hidbl]], i8 15, i32 0) + + %tmp218 = add <2 x i32> %ix2, + %tmp219 = load %"class.RWTexture2DMS", %"class.RWTexture2DMS"* @"\01?DTex2dMs@@3V?$RWTexture2DMS@N$0A@@@A" + %tmp220 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS\22)"(i32 0, %"class.RWTexture2DMS" %tmp219) + %tmp221 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS\22)"(i32 14, %dx.types.Handle %tmp220, %dx.types.ResourceProperties { i32 4099, i32 261 }, %"class.RWTexture2DMS" zeroinitializer) + %tmp222 = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp221, <2 x i32> %tmp218) + %tmp223 = load double, double* %tmp222 + %tmp224 = add <2 x i32> %ix2, + %tmp225 = load %"class.RWTexture2DMS", %"class.RWTexture2DMS"* @"\01?DTex2dMs@@3V?$RWTexture2DMS@N$0A@@@A" + %tmp226 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS\22)"(i32 0, %"class.RWTexture2DMS" %tmp225) + %tmp227 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS\22)"(i32 14, %dx.types.Handle %tmp226, %dx.types.ResourceProperties { i32 4099, i32 261 }, %"class.RWTexture2DMS" zeroinitializer) + %tmp228 = call double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <2 x i32>)"(i32 0, %dx.types.Handle %tmp227, <2 x i32> %tmp224) + store double %tmp223, double* %tmp228 + + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 777 }) + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.f32 @dx.op.textureLoad.f32(i32 66, %dx.types.Handle [[anhdl]], i32 [[ix1]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.f32 [[ld]], 2 + ; CHECK: [[ping:%.*]] = insertelement <3 x float> undef, float [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <3 x float> [[ping]], float [[val1]], i64 1 + ; CHECK: [[vec:%.*]] = insertelement <3 x float> [[pong]], float [[val2]], i64 2 + ; CHECK: [[ix:%.*]] = add i32 [[ix1]], 1 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 777 }) + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[val3:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <3 x float> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <3 x float> [[vec]], i64 1 + ; CHECK: [[val2:%.*]] = extractelement <3 x float> [[vec]], i64 2 + ; CHECK: call void @dx.op.textureStoreSample.f32(i32 225, %dx.types.Handle %388, i32 %389, i32 %390, i32 undef, float %392, float %393, float %394, float %391, i8 15, i32 %tmp235) + %tmp229 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?FTex2dMs@@3V?$RWTexture2DMS@V?$vector@M$02@@$0A@@@A" + %tmp230 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp229) + %tmp231 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp230, %dx.types.ResourceProperties { i32 4099, i32 777 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp232 = add <2 x i32> %ix2, + %tmp233 = call <3 x float>* @"dx.hl.subscript.[][].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle %tmp231, <2 x i32> %tmp232, i32 %ix1) + %tmp234 = load <3 x float>, <3 x float>* %tmp233 + %tmp235 = add i32 %ix1, 1 + %tmp236 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?FTex2dMs@@3V?$RWTexture2DMS@V?$vector@M$02@@$0A@@@A" + %tmp237 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp236) + %tmp238 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp237, %dx.types.ResourceProperties { i32 4099, i32 777 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp239 = add <2 x i32> %ix2, + %tmp240 = call <3 x float>* @"dx.hl.subscript.[][].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle %tmp238, <2 x i32> %tmp239, i32 %tmp235) + store <3 x float> %tmp234, <3 x float>* %tmp240 + + ; CHECK: [[sax:%.*]] = add i32 [[ix1]], 2 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }) + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 [[sax]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[ping:%.*]] = insertelement <2 x i32> undef, i32 [[val0]], i64 0 + ; CHECK: [[pong:%.*]] = insertelement <2 x i32> [[ping]], i32 [[val1]], i64 1 + ; CHECK: %tmp248 = icmp ne <2 x i32> %402, zeroinitializer + ; CHECK: [[sax:%.*]] = add i32 [[ix1]], 3 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }) + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: %407 = extractelement <2 x i32> %tmp255, i64 0 + ; CHECK: %408 = extractelement <2 x i32> %tmp255, i64 0 + ; CHECK: %409 = extractelement <2 x i32> %tmp255, i64 1 + ; CHECK: call void @dx.op.textureStoreSample.i32(i32 225, %dx.types.Handle %404, i32 %405, i32 %406, i32 undef, i32 %408, i32 %409, i32 %407, i32 %407, i8 15, i32 %tmp249) + ; CHECK: %tmp255 = zext <2 x i1> %tmp248 to <2 x i32> + %tmp241 = add i32 %ix1, 2 + %tmp242 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?BTex2dMs@@3V?$RWTexture2DMS@V?$vector@_N$01@@$0A@@@A" + %tmp243 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp242) + %tmp244 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp243, %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp245 = add <2 x i32> %ix2, + %tmp246 = call <2 x i32>* @"dx.hl.subscript.[][].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle %tmp244, <2 x i32> %tmp245, i32 %tmp241) + %tmp247 = load <2 x i32>, <2 x i32>* %tmp246 + %tmp248 = icmp ne <2 x i32> %tmp247, zeroinitializer + %tmp249 = add i32 %ix1, 3 + %tmp250 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?BTex2dMs@@3V?$RWTexture2DMS@V?$vector@_N$01@@$0A@@@A" + %tmp251 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp250) + %tmp252 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp251, %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp253 = add <2 x i32> %ix2, + %tmp254 = call <2 x i32>* @"dx.hl.subscript.[][].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle %tmp252, <2 x i32> %tmp253, i32 %tmp249) + %tmp255 = zext <2 x i1> %tmp248 to <2 x i32> + store <2 x i32> %tmp255, <2 x i32>* %tmp254 + + ; CHECK: [[sax:%.*]] = add i32 [[ix1]], 4 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }) + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 [[sax]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: [[val2:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 2 + ; CHECK: [[val3:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 3 + ; CHECK: [[loval:%.*]] = zext i32 [[val0]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val1]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val0:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[loval:%.*]] = zext i32 [[val2]] to i64 + ; CHECK: [[hival:%.*]] = zext i32 [[val3]] to i64 + ; CHECK: [[val:%.*]] = shl i64 [[hival]], 32 + ; CHECK: [[val1:%.*]] = or i64 [[loval]], [[val]] + ; CHECK: [[ping:%.*]] = insertelement <2 x i64> undef, i64 [[val0]], i64 0 + ; CHECK: [[vec:%.*]] = insertelement <2 x i64> [[ping]], i64 [[val1]], i64 1 + ; CHECK: [[sax:%.*]] = add i32 [[ix1]], 5 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS, 0>"(i32 160, %"class.RWTexture2DMS, 0>" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 517 }) + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[val3:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val0:%.*]] = extractelement <2 x i64> [[vec]], i64 0 + ; CHECK: [[val1:%.*]] = extractelement <2 x i64> [[vec]], i64 1 + ; CHECK: [[loval0:%.*]] = trunc i64 [[val0]] to i32 + ; CHECK: [[msk0:%.*]] = lshr i64 [[val0]], 32 + ; CHECK: [[hival0:%.*]] = trunc i64 [[msk0]] to i32 + ; CHECK: [[loval1:%.*]] = trunc i64 [[val1]] to i32 + ; CHECK: [[msk1:%.*]] = lshr i64 [[val1]], 32 + ; CHECK: [[hival1:%.*]] = trunc i64 [[msk1]] to i32 + ; CHECK: call void @dx.op.textureStoreSample.i32(i32 225, %dx.types.Handle [[anhdl]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 [[loval0]], i32 [[hival0]], i32 [[loval1]], i32 [[hival1]], i8 15, i32 [[sax]]) + %tmp256 = add i32 %ix1, 4 + %tmp257 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?LTex2dMs@@3V?$RWTexture2DMS@V?$vector@_K$01@@$0A@@@A" + %tmp258 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp257) + %tmp259 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp258, %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp260 = add <2 x i32> %ix2, + %tmp261 = call <2 x i64>* @"dx.hl.subscript.[][].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle %tmp259, <2 x i32> %tmp260, i32 %tmp256) + %tmp262 = load <2 x i64>, <2 x i64>* %tmp261 + %tmp263 = add i32 %ix1, 5 + %tmp264 = load %"class.RWTexture2DMS, 0>", %"class.RWTexture2DMS, 0>"* @"\01?LTex2dMs@@3V?$RWTexture2DMS@V?$vector@_K$01@@$0A@@@A" + %tmp265 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32 0, %"class.RWTexture2DMS, 0>" %tmp264) + %tmp266 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32 14, %dx.types.Handle %tmp265, %dx.types.ResourceProperties { i32 4099, i32 517 }, %"class.RWTexture2DMS, 0>" zeroinitializer) + %tmp267 = add <2 x i32> %ix2, + %tmp268 = call <2 x i64>* @"dx.hl.subscript.[][].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle %tmp266, <2 x i32> %tmp267, i32 %tmp263) + store <2 x i64> %tmp262, <2 x i64>* %tmp268 + + ; CHECK: [[sax:%.*]] = add i32 [[ix1]], 6 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS"(i32 160, %"class.RWTexture2DMS" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 261 }) + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: [[ld:%.*]] = call %dx.types.ResRet.i32 @dx.op.textureLoad.i32(i32 66, %dx.types.Handle [[anhdl]], i32 [[sax]], i32 [[ix2_0]], i32 [[ix2_1]], i32 undef, i32 undef, i32 undef, i32 undef) + ; CHECK: [[val0:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 0 + ; CHECK: [[val1:%.*]] = extractvalue %dx.types.ResRet.i32 [[ld]], 1 + ; CHECK: %447 = call double @dx.op.makeDouble.f64(i32 101, i32 %445, i32 %446) + ; CHECK: [[sax:%.*]] = add i32 [[ix1]], 7 + ; CHECK: [[hdl:%.*]] = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWTexture2DMS"(i32 160, %"class.RWTexture2DMS" + ; CHECK: [[anhdl:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[hdl]], %dx.types.ResourceProperties { i32 4099, i32 261 }) + ; CHECK: [[ix:%.*]] = add <2 x i32> [[ix2]], + ; CHECK: [[ix2_0:%.*]] = extractelement <2 x i32> [[ix]], i64 0 + ; CHECK: [[ix2_1:%.*]] = extractelement <2 x i32> [[ix]], i64 1 + ; CHECK: %452 = call %dx.types.splitdouble @dx.op.splitDouble.f64(i32 102, double %447) + ; CHECK: %453 = extractvalue %dx.types.splitdouble %452, 0 + ; CHECK: %454 = extractvalue %dx.types.splitdouble %452, 1 + ; CHECK: call void @dx.op.textureStoreSample.i32(i32 225, %dx.types.Handle %449, i32 %450, i32 %451, i32 undef, i32 %453, i32 %454, i32 %453, i32 %454, i8 15, i32 %tmp276) + %tmp269 = add i32 %ix1, 6 + %tmp270 = load %"class.RWTexture2DMS", %"class.RWTexture2DMS"* @"\01?DTex2dMs@@3V?$RWTexture2DMS@N$0A@@@A" + %tmp271 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS\22)"(i32 0, %"class.RWTexture2DMS" %tmp270) + %tmp272 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS\22)"(i32 14, %dx.types.Handle %tmp271, %dx.types.ResourceProperties { i32 4099, i32 261 }, %"class.RWTexture2DMS" zeroinitializer) + %tmp273 = add <2 x i32> %ix2, + %tmp274 = call double* @"dx.hl.subscript.[][].rn.double* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle %tmp272, <2 x i32> %tmp273, i32 %tmp269) + %tmp275 = load double, double* %tmp274 + %tmp276 = add i32 %ix1, 7 + %tmp277 = load %"class.RWTexture2DMS", %"class.RWTexture2DMS"* @"\01?DTex2dMs@@3V?$RWTexture2DMS@N$0A@@@A" + %tmp278 = call %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS\22)"(i32 0, %"class.RWTexture2DMS" %tmp277) + %tmp279 = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS\22)"(i32 14, %dx.types.Handle %tmp278, %dx.types.ResourceProperties { i32 4099, i32 261 }, %"class.RWTexture2DMS" zeroinitializer) + %tmp280 = add <2 x i32> %ix2, + %tmp281 = call double* @"dx.hl.subscript.[][].rn.double* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32 5, %dx.types.Handle %tmp279, <2 x i32> %tmp280, i32 %tmp276) + store double %tmp275, double* %tmp281 + + + ; CHECK: ret void + ret void +} + + +declare <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32, %"class.RWBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWBuffer >") #1 +declare <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32, %"class.RWBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWBuffer >") #1 +declare <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer >\22)"(i32, %"class.RWBuffer >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWBuffer >") #1 +declare double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, i32)"(i32, %dx.types.Handle, i32) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWBuffer\22)"(i32, %"class.RWBuffer") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWBuffer\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWBuffer") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32, %"class.RWTexture1D >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture1D >") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32, %"class.RWTexture1D >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture1D >") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D >\22)"(i32, %"class.RWTexture1D >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture1D >") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture1D\22)"(i32, %"class.RWTexture1D") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture1D\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture1D") #1 +declare <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>)"(i32, %dx.types.Handle, <2 x i32>) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32, %"class.RWTexture2D >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture2D >") #1 +declare <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>)"(i32, %dx.types.Handle, <2 x i32>) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32, %"class.RWTexture2D >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture2D >") #1 +declare <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>)"(i32, %dx.types.Handle, <2 x i32>) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D >\22)"(i32, %"class.RWTexture2D >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture2D >") #1 +declare double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <2 x i32>)"(i32, %dx.types.Handle, <2 x i32>) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2D\22)"(i32, %"class.RWTexture2D") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2D\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture2D") #1 +declare <3 x float>* @"dx.hl.subscript.[].rn.<3 x float>* (i32, %dx.types.Handle, <3 x i32>)"(i32, %dx.types.Handle, <3 x i32>) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32, %"class.RWTexture3D >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture3D >") #1 +declare <2 x i32>* @"dx.hl.subscript.[].rn.<2 x i32>* (i32, %dx.types.Handle, <3 x i32>)"(i32, %dx.types.Handle, <3 x i32>) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32, %"class.RWTexture3D >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture3D >") #1 +declare <2 x i64>* @"dx.hl.subscript.[].rn.<2 x i64>* (i32, %dx.types.Handle, <3 x i32>)"(i32, %dx.types.Handle, <3 x i32>) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D >\22)"(i32, %"class.RWTexture3D >") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D >\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture3D >") #1 +declare double* @"dx.hl.subscript.[].rn.double* (i32, %dx.types.Handle, <3 x i32>)"(i32, %dx.types.Handle, <3 x i32>) #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture3D\22)"(i32, %"class.RWTexture3D") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture3D\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture3D") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32, %"class.RWTexture2DMS, 0>") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture2DMS, 0>") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32, %"class.RWTexture2DMS, 0>") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture2DMS, 0>") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS, 0>\22)"(i32, %"class.RWTexture2DMS, 0>") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS, 0>\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture2DMS, 0>") #1 +declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %\22class.RWTexture2DMS\22)"(i32, %"class.RWTexture2DMS") #1 +declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %\22class.RWTexture2DMS\22)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %"class.RWTexture2DMS") #1 +declare <3 x float>* @"dx.hl.subscript.[][].rn.<3 x float>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32, %dx.types.Handle, <2 x i32>, i32) #1 +declare <2 x i32>* @"dx.hl.subscript.[][].rn.<2 x i32>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32, %dx.types.Handle, <2 x i32>, i32) #1 +declare <2 x i64>* @"dx.hl.subscript.[][].rn.<2 x i64>* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32, %dx.types.Handle, <2 x i32>, i32) #1 +declare double* @"dx.hl.subscript.[][].rn.double* (i32, %dx.types.Handle, <2 x i32>, i32)"(i32, %dx.types.Handle, <2 x i32>, i32) #1 + +attributes #0 = { nounwind } +attributes #1 = { nounwind readnone } + +!dx.version = !{!3} +!dx.valver = !{!4} +!dx.shaderModel = !{!5} +!dx.typeAnnotations = !{!6} +!dx.entryPoints = !{!19} +!dx.fnprops = !{!44} +!dx.options = !{!45, !46} + +!3 = !{i32 1, i32 6} +!4 = !{i32 1, i32 9} +!5 = !{!"vs", i32 6, i32 6} +!6 = !{i32 1, void (i32, <2 x i32>, <3 x i32>)* @main, !7} +!7 = !{!8, !10, !13, !16} +!8 = !{i32 1, !9, !9} +!9 = !{} +!10 = !{i32 0, !11, !12} +!11 = !{i32 4, !"IX1", i32 7, i32 5} +!12 = !{i32 1} +!13 = !{i32 0, !14, !15} +!14 = !{i32 4, !"IX2", i32 7, i32 5} +!15 = !{i32 2} +!16 = !{i32 0, !17, !18} +!17 = !{i32 4, !"IX3", i32 7, i32 5} +!18 = !{i32 3} +!19 = !{void (i32, <2 x i32>, <3 x i32>)* @main, !"main", null, !20, null} +!20 = !{null, !21, null, null} +!21 = !{!22, !24, !26, !27, !28, !29, !30, !31, !32, !33, !34, !35, !36, !37, !38, !39, !40, !41, !42, !43} +!22 = !{i32 0, %"class.RWBuffer >"* @"\01?FTyBuf@@3V?$RWBuffer@V?$vector@M$02@@@@A", !"FTyBuf", i32 -1, i32 -1, i32 1, i32 10, i1 false, i1 false, i1 false, !23} +!23 = !{i32 0, i32 9} +!24 = !{i32 1, %"class.RWBuffer >"* @"\01?BTyBuf@@3V?$RWBuffer@V?$vector@_N$01@@@@A", !"BTyBuf", i32 -1, i32 -1, i32 1, i32 10, i1 false, i1 false, i1 false, !25} +!25 = !{i32 0, i32 5} +!26 = !{i32 2, %"class.RWBuffer >"* @"\01?LTyBuf@@3V?$RWBuffer@V?$vector@_K$01@@@@A", !"LTyBuf", i32 -1, i32 -1, i32 1, i32 10, i1 false, i1 false, i1 false, !25} +!27 = !{i32 3, %"class.RWBuffer"* @"\01?DTyBuf@@3V?$RWBuffer@N@@A", !"DTyBuf", i32 -1, i32 -1, i32 1, i32 10, i1 false, i1 false, i1 false, !25} +!28 = !{i32 4, %"class.RWTexture1D >"* @"\01?FTex1d@@3V?$RWTexture1D@V?$vector@M$02@@@@A", !"FTex1d", i32 -1, i32 -1, i32 1, i32 1, i1 false, i1 false, i1 false, !23} +!29 = !{i32 5, %"class.RWTexture1D >"* @"\01?BTex1d@@3V?$RWTexture1D@V?$vector@_N$01@@@@A", !"BTex1d", i32 -1, i32 -1, i32 1, i32 1, i1 false, i1 false, i1 false, !25} +!30 = !{i32 6, %"class.RWTexture1D >"* @"\01?LTex1d@@3V?$RWTexture1D@V?$vector@_K$01@@@@A", !"LTex1d", i32 -1, i32 -1, i32 1, i32 1, i1 false, i1 false, i1 false, !25} +!31 = !{i32 7, %"class.RWTexture1D"* @"\01?DTex1d@@3V?$RWTexture1D@N@@A", !"DTex1d", i32 -1, i32 -1, i32 1, i32 1, i1 false, i1 false, i1 false, !25} +!32 = !{i32 8, %"class.RWTexture2D >"* @"\01?FTex2d@@3V?$RWTexture2D@V?$vector@M$02@@@@A", !"FTex2d", i32 -1, i32 -1, i32 1, i32 2, i1 false, i1 false, i1 false, !23} +!33 = !{i32 9, %"class.RWTexture2D >"* @"\01?BTex2d@@3V?$RWTexture2D@V?$vector@_N$01@@@@A", !"BTex2d", i32 -1, i32 -1, i32 1, i32 2, i1 false, i1 false, i1 false, !25} +!34 = !{i32 10, %"class.RWTexture2D >"* @"\01?LTex2d@@3V?$RWTexture2D@V?$vector@_K$01@@@@A", !"LTex2d", i32 -1, i32 -1, i32 1, i32 2, i1 false, i1 false, i1 false, !25} +!35 = !{i32 11, %"class.RWTexture2D"* @"\01?DTex2d@@3V?$RWTexture2D@N@@A", !"DTex2d", i32 -1, i32 -1, i32 1, i32 2, i1 false, i1 false, i1 false, !25} +!36 = !{i32 12, %"class.RWTexture3D >"* @"\01?FTex3d@@3V?$RWTexture3D@V?$vector@M$02@@@@A", !"FTex3d", i32 -1, i32 -1, i32 1, i32 4, i1 false, i1 false, i1 false, !23} +!37 = !{i32 13, %"class.RWTexture3D >"* @"\01?BTex3d@@3V?$RWTexture3D@V?$vector@_N$01@@@@A", !"BTex3d", i32 -1, i32 -1, i32 1, i32 4, i1 false, i1 false, i1 false, !25} +!38 = !{i32 14, %"class.RWTexture3D >"* @"\01?LTex3d@@3V?$RWTexture3D@V?$vector@_K$01@@@@A", !"LTex3d", i32 -1, i32 -1, i32 1, i32 4, i1 false, i1 false, i1 false, !25} +!39 = !{i32 15, %"class.RWTexture3D"* @"\01?DTex3d@@3V?$RWTexture3D@N@@A", !"DTex3d", i32 -1, i32 -1, i32 1, i32 4, i1 false, i1 false, i1 false, !25} +!40 = !{i32 16, %"class.RWTexture2DMS, 0>"* @"\01?FTex2dMs@@3V?$RWTexture2DMS@V?$vector@M$02@@$0A@@@A", !"FTex2dMs", i32 -1, i32 -1, i32 1, i32 3, i1 false, i1 false, i1 false, !23} +!41 = !{i32 17, %"class.RWTexture2DMS, 0>"* @"\01?BTex2dMs@@3V?$RWTexture2DMS@V?$vector@_N$01@@$0A@@@A", !"BTex2dMs", i32 -1, i32 -1, i32 1, i32 3, i1 false, i1 false, i1 false, !25} +!42 = !{i32 18, %"class.RWTexture2DMS, 0>"* @"\01?LTex2dMs@@3V?$RWTexture2DMS@V?$vector@_K$01@@$0A@@@A", !"LTex2dMs", i32 -1, i32 -1, i32 1, i32 3, i1 false, i1 false, i1 false, !25} +!43 = !{i32 19, %"class.RWTexture2DMS"* @"\01?DTex2dMs@@3V?$RWTexture2DMS@N$0A@@@A", !"DTex2dMs", i32 -1, i32 -1, i32 1, i32 3, i1 false, i1 false, i1 false, !25} +!44 = !{void (i32, <2 x i32>, <3 x i32>)* @main, i32 1} +!45 = !{i32 64} +!46 = !{i32 -1}