[llvm] [DirectX] Add support for typedBufferLoad and Store for RWBuffer<double2> and RWBuffer<double> (PR #139996)
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Wed May 14 22:04:46 PDT 2025
================
@@ -532,6 +541,80 @@ static Value *expandRadiansIntrinsic(CallInst *Orig) {
return Builder.CreateFMul(X, PiOver180);
}
+static void expandTypedBufferLoadIntrinsic(CallInst *Orig) {
+ IRBuilder<> Builder(Orig);
+
+ unsigned ExtractNum =
+ Orig->getType()->getStructElementType(0)->isVectorTy() ? 4 : 2;
+ Type *Ty = VectorType::get(Builder.getInt32Ty(), ExtractNum, false);
+
+ Type *LoadType = StructType::get(Ty, Builder.getInt1Ty());
+ auto *X =
+ Builder.CreateIntrinsic(LoadType, Intrinsic::dx_resource_load_typedbuffer,
+ {Orig->getOperand(0), Orig->getOperand(1)});
+
+ // create new extract value
+ Value *Extract = Builder.CreateExtractValue(X, {0});
+
+ SmallVector<Value *> ExtractElements;
+ for (unsigned I = 0; I < ExtractNum; ++I)
+ ExtractElements.push_back(
+ Builder.CreateExtractElement(Extract, (uint64_t)I));
+
+ // combine into double(s)
+ Value *Result =
+ PoisonValue::get(VectorType::get(Builder.getDoubleTy(), 2, false));
----------------
bogner wrote:
Can/should we just use `Orig->getType()` for the type here? That should mean the poison value makes sense for any vector or scalar type, rather than only working for the case where it doesn't get replaced later I think
https://github.com/llvm/llvm-project/pull/139996
More information about the llvm-commits
mailing list