Skip to content

Commit 6d0741d

Browse files
committed
use cafm
1 parent 06ad11a commit 6d0741d

File tree

6 files changed

+42
-32
lines changed

6 files changed

+42
-32
lines changed

clang/lib/CodeGen/CGHLSLBuiltins.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -392,13 +392,23 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
392392
// Extract the status bit (second element of the struct)
393393
Value *StatusBit = Builder.CreateExtractValue(ResRet, {1}, "ld.status");
394394

395-
// Extend the status bit to a 32-bit integer
395+
// Extend the 1-bit status to 32-bit, because the check access fully mapped
396+
// intrinsic expects i32 input
397+
Value *StatusInt =
398+
Builder.CreateZExt(StatusBit, Builder.getInt32Ty(), "ld.status.i32");
399+
400+
// Call CheckAccessFullyMapped(i32)
401+
llvm::Function *CheckAccessFn =
402+
CGM.getIntrinsic(llvm::Intrinsic::dx_check_access_fully_mapped);
403+
404+
Value *StatusBool =
405+
Builder.CreateCall(CheckAccessFn, {StatusInt}, "ld.status.checked");
406+
407+
// Extend the boolean to 32-bit uint for storing in user’s var
396408
Value *ExtendedStatus =
397-
Builder.CreateZExt(StatusBit, Builder.getInt32Ty(), "ld.status.ext");
409+
Builder.CreateZExt(StatusBool, Builder.getInt32Ty(), "ld.status.ext");
398410

399-
// Store the extended status into the user's reference variable
400411
Builder.CreateStore(ExtendedStatus, StatusAddr);
401-
402412
return LoadedValue;
403413
}
404414
case Builtin::BI__builtin_hlsl_resource_uninitializedhandle: {

clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-lib.hlsl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,9 @@ export float TestLoadWithStatus() {
127127
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 0
128128
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 1
129129
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
130-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %2, align 4
130+
// CHECK-NEXT: %[[STATUS_CHECKED:.*]] = call i1 @llvm.dx.check.access.fully.mapped(i32 %[[STATUS_EXT:.*]])
131+
// CHECK-NEXT: %[[STATUS_REEXT:.*]] = zext i1 %[[STATUS_CHECKED]] to i32
132+
// CHECK-NEXT: store i32 %[[STATUS_REEXT]], ptr %2, align 4
131133
// CHECK-NEXT: %[[RETVAL:.*]] = load float, ptr %[[VALUE]]
132134
// CHECK-NEXT: ret float %[[RETVAL]]
133135

@@ -138,9 +140,11 @@ export float TestLoadWithStatus() {
138140
// CHECK-NEXT: %[[STATUS_HANDLE:.*]] = load ptr, ptr %Status.addr, align 4, !nonnull !3, !align !4
139141
// DXIL-NEXT: %[[STRUCT:.*]] = call { ptr, i1 } @llvm.dx.resource.load.rawbuffer.p0.tdx.RawBuffer_f32_0_0t(target("dx.RawBuffer", float, 0, 0) %0, i32 %1, i32 0)
140142
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 0
141-
// CHECK-NEXT: %[[STATUS:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 1
142-
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS]] to i32
143-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %2, align 4
143+
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 1
144+
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
145+
// CHECK-NEXT: %[[STATUS_CHECKED:.*]] = call i1 @llvm.dx.check.access.fully.mapped(i32 %[[STATUS_EXT:.*]])
146+
// CHECK-NEXT: %[[STATUS_REEXT:.*]] = zext i1 %[[STATUS_CHECKED]] to i32
147+
// CHECK-NEXT: store i32 %[[STATUS_REEXT]], ptr %2, align 4
144148
// CHECK-NEXT: %[[RETVAL:.*]] = load float, ptr %[[VALUE]]
145149
// CHECK-NEXT: ret float %[[RETVAL]]
146150

clang/test/CodeGenHLSL/resources/StructuredBuffers-methods-ps.hlsl

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ export float TestLoadWithStatus() {
8686
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 0
8787
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 1
8888
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
89-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %2, align 4
89+
// CHECK-NEXT: %[[STATUS_CHECKED:.*]] = call i1 @llvm.dx.check.access.fully.mapped(i32 %[[STATUS_EXT:.*]])
90+
// CHECK-NEXT: %[[STATUS_REEXT:.*]] = zext i1 %[[STATUS_CHECKED]] to i32
91+
// CHECK-NEXT: store i32 %[[STATUS_REEXT]], ptr %2, align 4
9092
// CHECK-NEXT: %[[RETVAL:.*]] = load float, ptr %[[VALUE]]
9193
// CHECK-NEXT: ret float %[[RETVAL]]
9294

@@ -97,11 +99,13 @@ export float TestLoadWithStatus() {
9799
// CHECK-NEXT: %[[STATUS_HANDLE:.*]] = load ptr, ptr %Status.addr, align 4, !nonnull !3, !align !4
98100
// DXIL-NEXT: %[[STRUCT:.*]] = call { ptr, i1 } @llvm.dx.resource.load.rawbuffer.p0.tdx.RawBuffer_v2i32_1_1t(target("dx.RawBuffer", <2 x i32>, 1, 1) %0, i32 %1, i32 0)
99101
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 0
100-
// CHECK-NEXT: %[[STATUS:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 1
101-
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS]] to i32
102-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %2, align 4
103-
// CHECK-NEXT: %[[RETVAL:.*]] = load <2 x i32>, ptr %[[VALUE]]
104-
// CHECK-NEXT: ret <2 x i32> %[[RETVAL]]
102+
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 1
103+
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
104+
// CHECK-NEXT: %[[STATUS_CHECKED:.*]] = call i1 @llvm.dx.check.access.fully.mapped(i32 %[[STATUS_EXT:.*]])
105+
// CHECK-NEXT: %[[STATUS_REEXT:.*]] = zext i1 %[[STATUS_CHECKED]] to i32
106+
// CHECK-NEXT: store i32 %[[STATUS_REEXT]], ptr %2, align 4
107+
// CHECK-NEXT: %[[RETVAL:.*]] = load float, ptr %[[VALUE]]
108+
// CHECK-NEXT: ret float %[[RETVAL]]
105109

106110

107111
export uint TestGetDimensions() {

clang/test/CodeGenHLSL/resources/TypedBuffers-methods.hlsl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ export float TestLoadWithStatus() {
6161
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 0
6262
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 1
6363
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
64-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %2, align 4
64+
// CHECK-NEXT: %[[STATUS_CHECKED:.*]] = call i1 @llvm.dx.check.access.fully.mapped(i32 %[[STATUS_EXT:.*]])
65+
// CHECK-NEXT: %[[STATUS_REEXT:.*]] = zext i1 %[[STATUS_CHECKED]] to i32
66+
// CHECK-NEXT: store i32 %[[STATUS_REEXT]], ptr %2, align 4
6567
// CHECK-NEXT: %[[RETVAL:.*]] = load float, ptr %[[VALUE]]
6668
// CHECK-NEXT: ret float %[[RETVAL]]
6769

@@ -72,9 +74,11 @@ export float TestLoadWithStatus() {
7274
// CHECK-NEXT: %[[STATUS_HANDLE:.*]] = load ptr, ptr %Status.addr, align 4, !nonnull !3, !align !4
7375
// DXIL-NEXT: %[[STRUCT:.*]] = call { ptr, i1 } @llvm.dx.resource.load.typedbuffer.p0.tdx.TypedBuffer_v4i32_1_0_0t(target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) %0, i32 %1)
7476
// CHECK-NEXT: %[[VALUE:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 0
75-
// CHECK-NEXT: %[[STATUS:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 1
76-
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS]] to i32
77-
// CHECK-NEXT: store i32 %[[STATUS_EXT]], ptr %2, align 4
77+
// CHECK-NEXT: %[[STATUS_TEMP:.*]] = extractvalue { ptr, i1 } %[[STRUCT]], 1
78+
// CHECK-NEXT: %[[STATUS_EXT:.*]] = zext i1 %[[STATUS_TEMP]] to i32
79+
// CHECK-NEXT: %[[STATUS_CHECKED:.*]] = call i1 @llvm.dx.check.access.fully.mapped(i32 %[[STATUS_EXT:.*]])
80+
// CHECK-NEXT: %[[STATUS_REEXT:.*]] = zext i1 %[[STATUS_CHECKED]] to i32
81+
// CHECK-NEXT: store i32 %[[STATUS_REEXT]], ptr %2, align 4
7882
// CHECK-NEXT: %[[RETVAL:.*]] = load <4 x i32>, ptr %[[VALUE]]
7983
// CHECK-NEXT: ret <4 x i32> %[[RETVAL]]
8084

llvm/include/llvm/IR/IntrinsicsDirectX.td

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,8 @@ def int_dx_resource_getpointer
4040
: DefaultAttrsIntrinsic<[llvm_anyptr_ty], [llvm_any_ty, llvm_i32_ty],
4141
[IntrNoMem]>;
4242

43-
def int_dx_resource_load_with_status
44-
: DefaultAttrsIntrinsic<[llvm_anyptr_ty], [llvm_any_ty, llvm_i32_ty, llvm_i32_ty],
45-
[IntrNoMem]>;
43+
def int_dx_check_access_fully_mapped
44+
: DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_i32_ty], [IntrNoMem]>;
4645

4746
def int_dx_resource_nonuniformindex
4847
: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;

llvm/lib/Target/DirectX/DXILOpLowering.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -657,14 +657,6 @@ class OpLowerer {
657657
return false;
658658
}
659659

660-
[[nodiscard]] bool lowerLoadWithStatus(Function &F) {
661-
// These should have already been handled in DXILResourceAccess, so we can
662-
// just clean up the dead prototype.
663-
assert(F.user_empty() && "getpointer operations should have been removed");
664-
F.eraseFromParent();
665-
return false;
666-
}
667-
668660
[[nodiscard]] bool lowerBufferStore(Function &F, bool IsRaw) {
669661
const DataLayout &DL = F.getDataLayout();
670662
IRBuilder<> &IRB = OpBuilder.getIRB();
@@ -941,9 +933,6 @@ class OpLowerer {
941933
case Intrinsic::dx_resource_getpointer:
942934
HasErrors |= lowerGetPointer(F);
943935
break;
944-
case Intrinsic::dx_resource_load_with_status:
945-
HasErrors |= lowerLoadWithStatus(F);
946-
break;
947936
case Intrinsic::dx_resource_nonuniformindex:
948937
assert(!CleanupNURI &&
949938
"overloaded llvm.dx.resource.nonuniformindex intrinsics?");

0 commit comments

Comments
 (0)