[llvm-branch-commits] [llvm] [DirectX] Lower `@llvm.dx.typedBufferLoad` to DXIL ops (PR #104252)

Justin Bogner via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Sep 9 12:16:46 PDT 2024


https://github.com/bogner updated https://github.com/llvm/llvm-project/pull/104252

>From 2f317012985068f7130cdf4976d8821924d404c3 Mon Sep 17 00:00:00 2001
From: Justin Bogner <mail at justinbogner.com>
Date: Mon, 9 Sep 2024 12:16:36 -0700
Subject: [PATCH] Improve comments, move code for clarity

Created using spr 1.3.5-bogner
---
 llvm/docs/DirectX/DXILResources.rst        |  2 +-
 llvm/lib/Target/DirectX/DXILOpLowering.cpp | 15 ++++++++-------
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/llvm/docs/DirectX/DXILResources.rst b/llvm/docs/DirectX/DXILResources.rst
index 07fba4ac644eca..8e43bfaaaf32ea 100644
--- a/llvm/docs/DirectX/DXILResources.rst
+++ b/llvm/docs/DirectX/DXILResources.rst
@@ -277,7 +277,7 @@ return 1 to 4 elements from the given resource, to a maximum of 16 bytes of
 data. DXIL's modeling of this is influenced by DirectX and DXBC's history and
 it generally treats these operations as returning 4 32-bit values. For 16-bit
 elements the values are 16-bit values, and for 64-bit values the operations
-return 4 32-bit integers and combine them with further operations.
+return 4 32-bit integers and emit further code to construct the double.
 
 In DXIL, these operations return `ResRet`_ and `CBufRet`_ values, are structs
 containing 4 elements of the same type, and in the case of `ResRet` a 5th
diff --git a/llvm/lib/Target/DirectX/DXILOpLowering.cpp b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
index 9db18a8476b07f..409a1987709d5c 100644
--- a/llvm/lib/Target/DirectX/DXILOpLowering.cpp
+++ b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
@@ -259,23 +259,21 @@ class OpLowerer {
       lowerToBindAndAnnotateHandle(F);
   }
 
-  /// Replace uses of \c V with the values in the `dx.ResRet` of \c Op. Since we
-  /// expect to be post-scalarization, make an effort to avoid vectors.
+  /// Replace uses of \c Intrin with the values in the `dx.ResRet` of \c Op.
+  /// Since we expect to be post-scalarization, make an effort to avoid vectors.
   Error replaceResRetUses(CallInst *Intrin, CallInst *Op) {
     IRBuilder<> &IRB = OpBuilder.getIRB();
 
-    Type *OldRetTy = Intrin->getType();
+    Type *OldTy = Intrin->getType();
 
     // For scalars, we just extract the first element.
-    if (!isa<FixedVectorType>(OldRetTy)) {
+    if (!isa<FixedVectorType>(OldTy)) {
       Value *EVI = IRB.CreateExtractValue(Op, 0);
       Intrin->replaceAllUsesWith(EVI);
       Intrin->eraseFromParent();
       return Error::success();
     }
 
-    auto *VecTy = cast<FixedVectorType>(OldRetTy);
-    unsigned N = VecTy->getNumElements();
     std::array<Value *, 4> Extracts = {};
     SmallVector<ExtractElementInst *> DynamicAccesses;
 
@@ -296,6 +294,9 @@ class OpLowerer {
       }
     }
 
+    auto *VecTy = cast<FixedVectorType>(OldTy);
+    unsigned N = VecTy->getNumElements();
+
     // If there's a dynamic access we need to round trip through stack memory so
     // that we don't leave vectors around.
     if (!DynamicAccesses.empty()) {
@@ -331,7 +332,7 @@ class OpLowerer {
         if (!Extracts[I])
           Extracts[I] = IRB.CreateExtractValue(Op, I);
 
-      Value *Vec = UndefValue::get(OldRetTy);
+      Value *Vec = UndefValue::get(OldTy);
       for (int I = 0, E = N; I != E; ++I)
         Vec = IRB.CreateInsertElement(Vec, Extracts[I], I);
       Intrin->replaceAllUsesWith(Vec);



More information about the llvm-branch-commits mailing list