[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