[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