[llvm] [HLSL][DirectX] handle updatecounter in dxil resource access pass (PR #223591)

Sarah Spall via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 16 18:04:04 PDT 2026


https://github.com/spall updated https://github.com/llvm/llvm-project/pull/223591

>From 1632eead94f13e2afc1dfd150c06234a6b0d2499 Mon Sep 17 00:00:00 2001
From: Sarah Spall <sarahspall at microsoft.com>
Date: Mon, 14 Sep 2026 15:58:43 -0700
Subject: [PATCH 1/4] handle updatecounter in dxil resource access pass

---
 .../lib/Target/DirectX/DXILResourceAccess.cpp | 25 +++++++++++++-----
 .../DirectX/ResourceAccess/handle-to-index.ll | 26 +++++++++++++++++++
 2 files changed, 45 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILResourceAccess.cpp b/llvm/lib/Target/DirectX/DXILResourceAccess.cpp
index 5b5b86400726a..80eb22bd1d1de 100644
--- a/llvm/lib/Target/DirectX/DXILResourceAccess.cpp
+++ b/llvm/lib/Target/DirectX/DXILResourceAccess.cpp
@@ -761,6 +761,9 @@ static Instruction *getStoreLoadPointerOperand(Instruction *AI) {
     return dyn_cast<Instruction>(SI->getPointerOperand());
   if (auto *RMWI = dyn_cast<AtomicRMWInst>(AI))
     return dyn_cast<Instruction>(RMWI->getPointerOperand());
+  if (auto *II = dyn_cast<IntrinsicInst>(AI))
+    if (II->getIntrinsicID() == Intrinsic::dx_resource_updatecounter)
+      return dyn_cast<Instruction>(II->getArgOperand(0));
 
   return nullptr;
 }
@@ -938,8 +941,9 @@ replaceHandleWithIndices(Instruction *Ptr, IntrinsicInst *OldHandle,
                          SmallSetVector<Instruction *, 16> &DeadInsts,
                          SmallDenseMap<PHINode *, PHINode *> &VisitedPhis) {
   auto AccessIdx = getAccessIndices(Ptr, DeadInsts, VisitedPhis);
-  assert(AccessIdx.hasGetPtrIdx() && AccessIdx.hasHandleIdx() &&
-         "Couldn't retrieve indices. This is guaranteed by getAccessIndices");
+  assert(AccessIdx.hasHandleIdx() &&
+         "Couldn't retrieve handle index. This is guaranteed by "
+         "getAccessIndices");
 
   IRBuilder<> Builder(Ptr);
   if (isa<PHINode>(Ptr))
@@ -948,11 +952,20 @@ replaceHandleWithIndices(Instruction *Ptr, IntrinsicInst *OldHandle,
   Handle->setArgOperand(/*Index=*/3, AccessIdx.HandleIdx);
   Builder.Insert(Handle);
 
-  auto *GetPtr =
-      Builder.CreateIntrinsic(Ptr->getType(), Intrinsic::dx_resource_getpointer,
-                              {Handle, AccessIdx.GetPtrIdx});
+  if (Ptr->getType()->isPointerTy()) {
+    assert(AccessIdx.hasGetPtrIdx() &&
+           "Couldn't retrieve getpointer index. This is guaranteed by "
+           "getAccessIndices");
+    auto *GetPtr = Builder.CreateIntrinsic(Ptr->getType(),
+                                           Intrinsic::dx_resource_getpointer,
+                                           {Handle, AccessIdx.GetPtrIdx});
+    Ptr->replaceAllUsesWith(GetPtr);
+  } else {
+    assert(Ptr->getType()->isTargetExtTy() && !AccessIdx.hasGetPtrIdx() &&
+           "Unexpected resource access operand type");
+    Ptr->replaceAllUsesWith(Handle);
+  }
 
-  Ptr->replaceAllUsesWith(GetPtr);
   DeadInsts.insert(Ptr);
 }
 
diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/handle-to-index.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/handle-to-index.ll
index b82eba36541a5..3ea0873f14f9e 100644
--- a/llvm/test/CodeGen/DirectX/ResourceAccess/handle-to-index.ll
+++ b/llvm/test/CodeGen/DirectX/ResourceAccess/handle-to-index.ll
@@ -151,3 +151,29 @@ main:
   store i32 %add, ptr %ptr0, align 4
   ret void
 }
+
+; CHECK-LABEL: updatecounter_handle_phi(
+; CHECK-SAME:   i1 %[[COND:.*]])
+define void @updatecounter_handle_phi(i1 %cond) {
+; CHECK-NOT: phi target(
+; CHECK:     exit:
+; CHECK-NEXT:  %[[IDX:.*]] = phi i32 [ 0, %entry ], [ 1, %loop ]
+; CHECK-NEXT:  %[[HANDLE:.*]] = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i32_1_0t(i32 2, i32 0, i32 -1, i32 %[[IDX]], ptr nonnull @OutArr.str)
+; CHECK-NEXT:  %[[COUNT:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %[[HANDLE]], i8 1)
+; CHECK-NEXT:  call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %[[HANDLE]], i32 0, i32 0, i32 %[[COUNT]])
+; CHECK-NEXT:  ret void
+entry:
+  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i32_1_0t(i32 2, i32 0, i32 -1, i32 0, ptr nonnull @OutArr.str)
+  br i1 %cond, label %exit, label %loop
+
+loop:
+  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i32_1_0t(i32 2, i32 0, i32 -1, i32 1, ptr nonnull @OutArr.str)
+  br label %exit
+
+exit:
+  %handle = phi target("dx.RawBuffer", i32, 1, 0) [ %handle0, %entry ], [ %handle1, %loop ]
+  %count = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %handle, i8 1)
+  %ptr = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t.i32(target("dx.RawBuffer", i32, 1, 0) %handle, i32 0)
+  store i32 %count, ptr %ptr, align 4
+  ret void
+}

>From ec6906f362a1cc04ccb2ac7fb2cc82f3c070abe3 Mon Sep 17 00:00:00 2001
From: Sarah Spall <sarahspall at microsoft.com>
Date: Mon, 14 Sep 2026 20:19:43 -0700
Subject: [PATCH 2/4] change function name since value is no longer always a
 ptr

---
 llvm/lib/Target/DirectX/DXILResourceAccess.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILResourceAccess.cpp b/llvm/lib/Target/DirectX/DXILResourceAccess.cpp
index 80eb22bd1d1de..cb44ef8ebd169 100644
--- a/llvm/lib/Target/DirectX/DXILResourceAccess.cpp
+++ b/llvm/lib/Target/DirectX/DXILResourceAccess.cpp
@@ -754,7 +754,7 @@ static void createLoadIntrinsic(IntrinsicInst *II, LoadInst *LI,
   llvm_unreachable("Unhandled case in switch");
 }
 
-static Instruction *getStoreLoadPointerOperand(Instruction *AI) {
+static Instruction *getStoreLoadOperand(Instruction *AI) {
   if (auto *LI = dyn_cast<LoadInst>(AI))
     return dyn_cast<Instruction>(LI->getPointerOperand());
   if (auto *SI = dyn_cast<StoreInst>(AI))
@@ -985,8 +985,8 @@ static bool legalizeResourceHandles(Function &F, DXILResourceTypeMap &DRTM) {
 
   for (BasicBlock &BB : make_early_inc_range(F)) {
     for (Instruction &I : BB) {
-      if (auto *PtrOp = getStoreLoadPointerOperand(&I)) {
-        SmallVector<IntrinsicInst *> Handles = collectUsedHandles(PtrOp);
+      if (auto *HandleOp = getStoreLoadOperand(&I)) {
+        SmallVector<IntrinsicInst *> Handles = collectUsedHandles(HandleOp);
         unsigned NumHandles = Handles.size();
         if (NumHandles <= 1)
           continue; // Legal, no-replacement required
@@ -1002,7 +1002,7 @@ static bool legalizeResourceHandles(Function &F, DXILResourceTypeMap &DRTM) {
           continue;
         }
 
-        replaceHandleWithIndices(PtrOp, Handles[0], DeadInsts, VisitedPhis);
+        replaceHandleWithIndices(HandleOp, Handles[0], DeadInsts, VisitedPhis);
       }
     }
   }

>From 33b413f9d8dbb371aafbd9b6a9cd377d7534bc32 Mon Sep 17 00:00:00 2001
From: Sarah Spall <sarahspall at microsoft.com>
Date: Tue, 15 Sep 2026 17:40:42 -0700
Subject: [PATCH 3/4] update function name and add more tests

---
 .../lib/Target/DirectX/DXILResourceAccess.cpp |  4 +-
 .../DirectX/ResourceAccess/handle-to-index.ll | 37 +++++++++++++++++++
 .../ResourceAccess/looped-phi-nodes.ll        | 23 ++++++++++++
 .../DirectX/ResourceAccess/non-unique.ll      | 13 +++++++
 4 files changed, 75 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILResourceAccess.cpp b/llvm/lib/Target/DirectX/DXILResourceAccess.cpp
index cb44ef8ebd169..40f5a36284ae3 100644
--- a/llvm/lib/Target/DirectX/DXILResourceAccess.cpp
+++ b/llvm/lib/Target/DirectX/DXILResourceAccess.cpp
@@ -754,7 +754,7 @@ static void createLoadIntrinsic(IntrinsicInst *II, LoadInst *LI,
   llvm_unreachable("Unhandled case in switch");
 }
 
-static Instruction *getStoreLoadOperand(Instruction *AI) {
+static Instruction *getHandleOperand(Instruction *AI) {
   if (auto *LI = dyn_cast<LoadInst>(AI))
     return dyn_cast<Instruction>(LI->getPointerOperand());
   if (auto *SI = dyn_cast<StoreInst>(AI))
@@ -985,7 +985,7 @@ static bool legalizeResourceHandles(Function &F, DXILResourceTypeMap &DRTM) {
 
   for (BasicBlock &BB : make_early_inc_range(F)) {
     for (Instruction &I : BB) {
-      if (auto *HandleOp = getStoreLoadOperand(&I)) {
+      if (auto *HandleOp = getHandleOperand(&I)) {
         SmallVector<IntrinsicInst *> Handles = collectUsedHandles(HandleOp);
         unsigned NumHandles = Handles.size();
         if (NumHandles <= 1)
diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/handle-to-index.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/handle-to-index.ll
index 3ea0873f14f9e..621a415e71ce7 100644
--- a/llvm/test/CodeGen/DirectX/ResourceAccess/handle-to-index.ll
+++ b/llvm/test/CodeGen/DirectX/ResourceAccess/handle-to-index.ll
@@ -49,6 +49,43 @@ entry:
   ret void
 }
 
+; CHECK-LABEL: updatecounter_handle_select(
+; CHECK-SAME:   i1 %[[COND:.*]])
+define i32 @updatecounter_handle_select(i1 %cond) {
+; CHECK-NOT: handlefromimplicitbinding
+; CHECK:     entry:
+; CHECK-NEXT:  %[[IDX:.*]] = select i1 %[[COND]], i32 0, i32 1
+; CHECK-NEXT:  %[[HANDLE:.*]] = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i32_1_0t(i32 2, i32 0, i32 -1, i32 %[[IDX]], ptr nonnull @OutArr.str)
+; CHECK-NEXT:  %[[COUNT:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %[[HANDLE]], i8 1)
+; CHECK-NEXT:  ret i32 %[[COUNT]]
+entry:
+  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i32_1_0t(i32 2, i32 0, i32 -1, i32 0, ptr nonnull @OutArr.str)
+  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i32_1_0t(i32 2, i32 0, i32 -1, i32 1, ptr nonnull @OutArr.str)
+  %handle = select i1 %cond, target("dx.RawBuffer", i32, 1, 0) %handle0, target("dx.RawBuffer", i32, 1, 0) %handle1
+  %count = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %handle, i8 1)
+  ret i32 %count
+}
+
+; CHECK-LABEL: multiple_use_handle_updatecounter(
+; CHECK-SAME:   i1 %[[COND:.*]])
+define void @multiple_use_handle_updatecounter(i1 %cond) {
+; CHECK-NOT: handlefromimplicitbinding
+; CHECK:     entry:
+; CHECK-NEXT: %[[HANDLE0:.*]] = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i32_1_0t(i32 2, i32 0, i32 -1, i32 0, ptr nonnull @OutArr.str)
+; CHECK-NEXT:  %[[IDX:.*]] = select i1 %[[COND]], i32 0, i32 1
+; CHECK-NEXT:  %[[HANDLE:.*]] = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i32_1_0t(i32 2, i32 0, i32 -1, i32 %[[IDX]], ptr nonnull @OutArr.str)
+; CHECK-NEXT:  %[[COUNT0:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %[[HANDLE]], i8 1)
+; CHECK-NEXT:  %[[COUNT1:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %[[HANDLE0]], i8 -1)
+; CHECK-NEXT:  ret void
+entry:
+  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i32_1_0t(i32 2, i32 0, i32 -1, i32 0, ptr nonnull @OutArr.str)
+  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i32_1_0t(i32 2, i32 0, i32 -1, i32 1, ptr nonnull @OutArr.str)
+  %handle = select i1 %cond, target("dx.RawBuffer", i32, 1, 0) %handle0, target("dx.RawBuffer", i32, 1, 0) %handle1
+  %count0 = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %handle, i8 1)
+  %count1 = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %handle0, i8 -1)
+  ret void
+}
+
 ; CHECK-LABEL: ptr_phi_store(
 ; CHECK-SAME:   i32 %[[X:.*]], i1 %[[COND:.*]], i32 %[[A:.*]], i32 %[[B:.*]])
 define void @ptr_phi_store(i32 %x, i1 %cond, i32 %a, i32 %b) {
diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/looped-phi-nodes.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/looped-phi-nodes.ll
index ebcfe0f4faf70..145faed068d86 100644
--- a/llvm/test/CodeGen/DirectX/ResourceAccess/looped-phi-nodes.ll
+++ b/llvm/test/CodeGen/DirectX/ResourceAccess/looped-phi-nodes.ll
@@ -13,6 +13,10 @@
 ;     RWBuffer<float> tmp = src; src = dst; dst = tmp;
 ;   }
 
+; CHECK: error: Resource access is not guaranteed to map to a unique global resource
+; CHECK: note: At resource access:  %count = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %src, i8 1)
+; CHECK-DAG: note: Uses resource handle:  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 0, i32 1, i32 0, ptr nonnull @.str)
+; CHECK-DAG: note: Uses resource handle:  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)
 ; CHECK: error: Resource access is not guaranteed to map to a unique global resource
 
 @.str = private unnamed_addr constant [5 x i8] c"bufA\00", align 1
@@ -43,3 +47,22 @@ for.body:
 end:
   ret void
 }
+
+define i32 @updatecounter_loop(i32 %n) {
+entry:
+  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 0, i32 1, i32 0, ptr nonnull @.str)
+  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)
+  br label %loop
+
+loop:
+  %dst = phi target("dx.RawBuffer", i32, 1, 0) [ %handle1, %entry ], [ %src, %loop ]
+  %src = phi target("dx.RawBuffer", i32, 1, 0) [ %handle0, %entry ], [ %dst, %loop ]
+  %i = phi i32 [ 0, %entry ], [ %inc, %loop ]
+  %count = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %src, i8 1)
+  %inc = add nuw i32 %i, 1
+  %exit = icmp eq i32 %inc, %n
+  br i1 %exit, label %end, label %loop
+
+end:
+  ret i32 %count
+}
diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/non-unique.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/non-unique.ll
index 9f62197e805cd..db9166144a5cd 100644
--- a/llvm/test/CodeGen/DirectX/ResourceAccess/non-unique.ll
+++ b/llvm/test/CodeGen/DirectX/ResourceAccess/non-unique.ll
@@ -7,6 +7,10 @@
 ; CHECK: note: Uses resource handle:  %1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)
 ; CHECK: note: Uses resource handle:  %2 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 2, i32 1, i32 0, ptr nonnull @.str.4)
 ; CHECK: error: Resource access is not guaranteed to map to a unique global resource
+; CHECK: note: At resource access:  %count = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %handle, i8 1)
+; CHECK-DAG: note: Uses resource handle:  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)
+; CHECK-DAG: note: Uses resource handle:  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 2, i32 1, i32 0, ptr nonnull @.str.4)
+; CHECK: error: Resource access is not guaranteed to map to a unique global resource
 
 %__cblayout_c = type <{ i32 }>
 
@@ -35,3 +39,12 @@ entry:
   store i32 %7, ptr %8, align 4
   ret void
 }
+
+define i32 @updatecounter_select(i1 %cond) {
+entry:
+  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)
+  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 2, i32 1, i32 0, ptr nonnull @.str.4)
+  %handle = select i1 %cond, target("dx.RawBuffer", i32, 1, 0) %handle0, target("dx.RawBuffer", i32, 1, 0) %handle1
+  %count = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %handle, i8 1)
+  ret i32 %count
+}

>From 4a6ab5305fd72d6ea78982f56bf6fece8218793a Mon Sep 17 00:00:00 2001
From: Sarah Spall <sarahspall at microsoft.com>
Date: Wed, 16 Sep 2026 10:11:28 -0700
Subject: [PATCH 4/4] move check lines closer to functions which generate the
 errors

---
 .../CodeGen/DirectX/ResourceAccess/looped-phi-nodes.ll   | 9 +++++----
 llvm/test/CodeGen/DirectX/ResourceAccess/non-unique.ll   | 9 +++++----
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/looped-phi-nodes.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/looped-phi-nodes.ll
index 145faed068d86..7e9b326e3c991 100644
--- a/llvm/test/CodeGen/DirectX/ResourceAccess/looped-phi-nodes.ll
+++ b/llvm/test/CodeGen/DirectX/ResourceAccess/looped-phi-nodes.ll
@@ -13,10 +13,6 @@
 ;     RWBuffer<float> tmp = src; src = dst; dst = tmp;
 ;   }
 
-; CHECK: error: Resource access is not guaranteed to map to a unique global resource
-; CHECK: note: At resource access:  %count = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %src, i8 1)
-; CHECK-DAG: note: Uses resource handle:  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 0, i32 1, i32 0, ptr nonnull @.str)
-; CHECK-DAG: note: Uses resource handle:  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)
 ; CHECK: error: Resource access is not guaranteed to map to a unique global resource
 
 @.str = private unnamed_addr constant [5 x i8] c"bufA\00", align 1
@@ -48,6 +44,11 @@ end:
   ret void
 }
 
+; CHECK: error: Resource access is not guaranteed to map to a unique global resource
+; CHECK: note: At resource access:  %count = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %src, i8 1)
+; CHECK-DAG: note: Uses resource handle:  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 0, i32 1, i32 0, ptr nonnull @.str)
+; CHECK-DAG: note: Uses resource handle:  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)
+
 define i32 @updatecounter_loop(i32 %n) {
 entry:
   %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 0, i32 1, i32 0, ptr nonnull @.str)
diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/non-unique.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/non-unique.ll
index db9166144a5cd..00bce9e158413 100644
--- a/llvm/test/CodeGen/DirectX/ResourceAccess/non-unique.ll
+++ b/llvm/test/CodeGen/DirectX/ResourceAccess/non-unique.ll
@@ -7,10 +7,6 @@
 ; CHECK: note: Uses resource handle:  %1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)
 ; CHECK: note: Uses resource handle:  %2 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 2, i32 1, i32 0, ptr nonnull @.str.4)
 ; CHECK: error: Resource access is not guaranteed to map to a unique global resource
-; CHECK: note: At resource access:  %count = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %handle, i8 1)
-; CHECK-DAG: note: Uses resource handle:  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)
-; CHECK-DAG: note: Uses resource handle:  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 2, i32 1, i32 0, ptr nonnull @.str.4)
-; CHECK: error: Resource access is not guaranteed to map to a unique global resource
 
 %__cblayout_c = type <{ i32 }>
 
@@ -40,6 +36,11 @@ entry:
   ret void
 }
 
+; CHECK: note: At resource access:  %count = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %handle, i8 1)
+; CHECK-DAG: note: Uses resource handle:  %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)
+; CHECK-DAG: note: Uses resource handle:  %handle1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 2, i32 1, i32 0, ptr nonnull @.str.4)
+; CHECK: error: Resource access is not guaranteed to map to a unique global resource
+
 define i32 @updatecounter_select(i1 %cond) {
 entry:
   %handle0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 1, i32 1, i32 0, ptr nonnull @.str.2)



More information about the llvm-commits mailing list