Skip to content

Commit 691bd18

Browse files
[HLSL][DIRECTX] Fixing update counter signature (#115913)
This PR changes the return type on `bufferUpdateCounter` to `uint` Fixes #115614 --------- Co-authored-by: Joao Saffran <[email protected]>
1 parent 196d5fd commit 691bd18

File tree

4 files changed

+13
-10
lines changed

4 files changed

+13
-10
lines changed

llvm/include/llvm/IR/IntrinsicsDirectX.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ def int_dx_typedBufferStore
3838
[IntrWriteMem]>;
3939

4040
def int_dx_updateCounter
41-
: DefaultAttrsIntrinsic<[], [llvm_any_ty, llvm_i8_ty]>;
41+
: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_any_ty, llvm_i8_ty],
42+
[IntrInaccessibleMemOrArgMemOnly]>;
4243

4344
// Cast between target extension handle types and dxil-style opaque handles
4445
def int_dx_cast_handle : Intrinsic<[llvm_any_ty], [llvm_any_ty]>;

llvm/lib/Target/DirectX/DXIL.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,7 @@ def BufferStore : DXILOp<69, bufferStore> {
757757
def UpdateCounter : DXILOp<70, bufferUpdateCounter> {
758758
let Doc = "increments/decrements a buffer counter";
759759
let arguments = [HandleTy, Int8Ty];
760-
let result = VoidTy;
760+
let result = Int32Ty;
761761
let stages = [Stages<DXIL1_0, [all_stages]>];
762762
}
763763

llvm/lib/Target/DirectX/DXILOpLowering.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ class OpLowerer {
488488

489489
[[nodiscard]] bool lowerUpdateCounter(Function &F) {
490490
IRBuilder<> &IRB = OpBuilder.getIRB();
491+
Type *Int32Ty = IRB.getInt32Ty();
491492

492493
return replaceFunction(F, [&](CallInst *CI) -> Error {
493494
IRB.SetInsertPoint(CI);
@@ -497,12 +498,13 @@ class OpLowerer {
497498

498499
std::array<Value *, 2> Args{Handle, Op1};
499500

500-
Expected<CallInst *> OpCall =
501-
OpBuilder.tryCreateOp(OpCode::UpdateCounter, Args, CI->getName());
501+
Expected<CallInst *> OpCall = OpBuilder.tryCreateOp(
502+
OpCode::UpdateCounter, Args, CI->getName(), Int32Ty);
502503

503504
if (Error E = OpCall.takeError())
504505
return E;
505506

507+
CI->replaceAllUsesWith(*OpCall);
506508
CI->eraseFromParent();
507509
return Error::success();
508510
});

llvm/test/CodeGen/DirectX/updateCounter.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ define void @update_counter_decrement_vector() {
1111
i32 0, i32 0, i32 1, i32 0, i1 false)
1212

1313
; CHECK-NEXT: [[BUFFANOT:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
14-
; CHECK-NEXT: call void @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 -1)
15-
call void @llvm.dx.updateCounter(target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i8 -1)
14+
; CHECK-NEXT: [[REG:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 -1)
15+
%1 = call i32 @llvm.dx.updateCounter(target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i8 -1)
1616
ret void
1717
}
1818

@@ -23,8 +23,8 @@ define void @update_counter_increment_vector() {
2323
@llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_0_0_0(
2424
i32 0, i32 0, i32 1, i32 0, i1 false)
2525
; CHECK-NEXT: [[BUFFANOT:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
26-
; CHECK-NEXT: call void @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 1)
27-
call void @llvm.dx.updateCounter(target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i8 1)
26+
; CHECK-NEXT: [[REG:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 1)
27+
%1 = call i32 @llvm.dx.updateCounter(target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i8 1)
2828
ret void
2929
}
3030

@@ -35,7 +35,7 @@ define void @update_counter_decrement_scalar() {
3535
@llvm.dx.handle.fromBinding.tdx.RawBuffer_i8_0_0t(
3636
i32 1, i32 8, i32 1, i32 0, i1 false)
3737
; CHECK-NEXT: [[BUFFANOT:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
38-
; CHECK-NEXT: call void @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 -1)
39-
call void @llvm.dx.updateCounter(target("dx.RawBuffer", i8, 0, 0) %buffer, i8 -1)
38+
; CHECK-NEXT: [[REG:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 -1)
39+
%1 = call i32 @llvm.dx.updateCounter(target("dx.RawBuffer", i8, 0, 0) %buffer, i8 -1)
4040
ret void
4141
}

0 commit comments

Comments
 (0)