[llvm] [DirectX] ForwardHandle needs to check if globals were stored on allocas (PR #151751)
Farzon Lotfi via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 4 08:51:27 PDT 2025
================
@@ -0,0 +1,39 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -S -dxil-forward-handle-accesses %s | FileCheck %s
+
+%"class.hlsl::RWStructuredBuffer" = type { target("dx.RawBuffer", i32, 1, 0) }
+ at _ZL4dest = internal unnamed_addr global %"class.hlsl::RWStructuredBuffer" poison, align 4
+ at .str = private unnamed_addr constant [5 x i8] c"dest\00", align 1
+
+
+; NOTE: intent of this test is to confirm load target("dx.RawBuffer", i32, 1, 0)
+; is replaced with call @llvm.dx.resource.getpointer
+define void @CSMain() local_unnamed_addr {
+; CHECK-LABEL: define void @CSMain() local_unnamed_addr {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[AGG_TMP_I1_SROA_0:%.*]] = alloca target("dx.RawBuffer", i32, 1, 0), align 8
+; CHECK-NEXT: [[TMP0:%.*]] = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 3, i32 1, i32 0, i1 false, ptr nonnull @.str)
+; CHECK-NEXT: store target("dx.RawBuffer", i32, 1, 0) [[TMP0]], ptr @_ZL4dest, align 4
+; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0)
+; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr @_ZL4dest, align 4
+; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr nonnull [[AGG_TMP_I1_SROA_0]])
+; CHECK-NEXT: store i32 [[TMP2]], ptr [[AGG_TMP_I1_SROA_0]], align 8
+; CHECK-NEXT: [[TMP3:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP0]], i32 [[TMP1]])
+; CHECK-NEXT: store i32 0, ptr [[TMP3]], align 4
+; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr nonnull [[AGG_TMP_I1_SROA_0]])
+; CHECK-NEXT: ret void
+;
+entry:
+ %agg.tmp.i1.sroa.0 = alloca target("dx.RawBuffer", i32, 1, 0), align 8
+ %0 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 3, i32 1, i32 0, i1 false, ptr nonnull @.str)
+ store target("dx.RawBuffer", i32, 1, 0) %0, ptr @_ZL4dest, align 4
+ %1 = tail call i32 @llvm.dx.thread.id(i32 0)
+ %2 = load i32, ptr @_ZL4dest, align 4
+ call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %agg.tmp.i1.sroa.0)
+ store i32 %2, ptr %agg.tmp.i1.sroa.0, align 8
+ %agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0. = load target("dx.RawBuffer", i32, 1, 0), ptr %agg.tmp.i1.sroa.0, align 8
+ %3 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0., i32 %1)
+ store i32 0, ptr %3, align 4
+ call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %agg.tmp.i1.sroa.0)
+ ret void
+}
----------------
farzonl wrote:
This would mean we need to
> ```llvm
> target("dx.RawBuffer", i32, 1, 0)
> ```
Not entirely sure why but this doesn't seem to work
```diff
diff --git a/llvm/test/CodeGen/DirectX/issue-140819_allow_forward_handle_on_alloca.ll b/llvm/test/CodeGen/DirectX/issue-140819_allow_forward_handle_on_alloca.ll
index 7c0813b0b4e3..288f5af55875 100644
--- a/llvm/test/CodeGen/DirectX/issue-140819_allow_forward_handle_on_alloca.ll
+++ b/llvm/test/CodeGen/DirectX/issue-140819_allow_forward_handle_on_alloca.ll
@@ -14,8 +14,8 @@ define void @CSMain() local_unnamed_addr {
; CHECK-NEXT: [[AGG_TMP_I1_SROA_0:%.*]] = alloca target("dx.RawBuffer", i32, 1, 0), align 8
; CHECK-NEXT: [[TMP0:%.*]] = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 3, i32 1, i32 0, i1 false, ptr nonnull @name)
; CHECK-NEXT: store target("dx.RawBuffer", i32, 1, 0) [[TMP0]], ptr @global, align 4
-; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr @global, align 4
-; CHECK-NEXT: store i32 [[TMP2]], ptr [[AGG_TMP_I1_SROA_0]], align 8
+; CHECK-NEXT: [[TMP2:%.*]] = load target("dx.RawBuffer", i32, 1, 0), ptr @global, align 4
+; CHECK-NEXT: store target("dx.RawBuffer", i32, 1, 0) [[TMP2]], ptr [[AGG_TMP_I1_SROA_0]], align 8
; CHECK-NEXT: [[TMP3:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) [[TMP0]], i32 0)
; CHECK-NEXT: store i32 0, ptr [[TMP3]], align 4
; CHECK-NEXT: ret void
@@ -24,8 +24,8 @@ entry:
%alloca = alloca target("dx.RawBuffer", i32, 1, 0), align 8
%handle = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_1_0t(i32 0, i32 3, i32 1, i32 0, i1 false, ptr nonnull @name)
store target("dx.RawBuffer", i32, 1, 0) %handle , ptr @global, align 4
- %val = load i32, ptr @global, align 4
- store i32 %val , ptr %alloca, align 8
+ %val = load target("dx.RawBuffer", i32, 1, 0), ptr @global, align 4
+ store target("dx.RawBuffer", i32, 1, 0) %val , ptr %alloca, align 8
%indirect = load target("dx.RawBuffer", i32, 1, 0), ptr %alloca, align 8
%buff = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %indirect, i32 0)
store i32 0, ptr %buff, align 4
```
Changing the type for the load stores seems to force an error where we expected the alloca to be a global, which of course it is not.
```bash
/Users/farzonlotfi/Projects/llvm_debug_build/bin/opt -S -dxil-forward-handle-accesses /Users/farzonlotfi/Projects/llvm-project/llvm/test/CodeGen/DirectX/issue-140819_allow_forward_handle_on_alloca.ll | /Users/farzonlotfi/Projects/llvm_debug_build/bin/FileCheck /Users/farzonlotfi/Projects/llvm-project/llvm/test/CodeGen/DirectX/issue-140819_allow_forward_handle_on_alloca.ll # RUN: at line 2
+ /Users/farzonlotfi/Projects/llvm_debug_build/bin/opt -S -dxil-forward-handle-accesses /Users/farzonlotfi/Projects/llvm-project/llvm/test/CodeGen/DirectX/issue-140819_allow_forward_handle_on_alloca.ll
+ /Users/farzonlotfi/Projects/llvm_debug_build/bin/FileCheck /Users/farzonlotfi/Projects/llvm-project/llvm/test/CodeGen/DirectX/issue-140819_allow_forward_handle_on_alloca.ll
error: Load of "alloca" is not a global resource handle
FileCheck error: '<stdin>' is empty.
FileCheck command line: /Users/farzonlotfi/Projects/llvm_debug_build/bin/FileCheck /Users/farzonlotfi/Projects/llvm-project/llvm/test/CodeGen/DirectX/issue-140819_allow_forward_handle_on_alloca.ll
```
https://github.com/llvm/llvm-project/pull/151751
More information about the llvm-commits
mailing list