diff --git a/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp b/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp index 3ae69b9f9..c633db5fe 100644 --- a/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp +++ b/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp @@ -4001,10 +4001,14 @@ public: m_HasDbgInfo = getDebugMetadataVersionFromModule(M) != 0; std::deque WorkList; + std::vector DeadHLFunctions; for (Function &F : M.functions()) { HLOpcodeGroup group = GetHLOpcodeGroup(&F); // Skip HL operations. - if (group != HLOpcodeGroup::NotHL || group == HLOpcodeGroup::HLExtIntrinsic) { + if (group != HLOpcodeGroup::NotHL || + group == HLOpcodeGroup::HLExtIntrinsic) { + if (F.user_empty()) + DeadHLFunctions.emplace_back(&F); continue; } @@ -4031,6 +4035,12 @@ public: WorkList.emplace_back(&F); } + // Remove dead hl functions here. + // This is for hl functions which has body and always inline. + for (Function *F : DeadHLFunctions) { + F->eraseFromParent(); + } + // Preprocess aggregate function param used as function call arg. for (Function *F : WorkList) { preprocessArgUsedInCall(F); diff --git a/tools/clang/test/CodeGenHLSL/quick-test/lib_append_buf.hlsl b/tools/clang/test/CodeGenHLSL/quick-test/lib_append_buf.hlsl new file mode 100644 index 000000000..8a348b86f --- /dev/null +++ b/tools/clang/test/CodeGenHLSL/quick-test/lib_append_buf.hlsl @@ -0,0 +1,18 @@ +// RUN: %dxc -T lib_6_2 %s | FileCheck %s + +// Make sure append/consume works for lib. +// CHECK: bufferUpdateCounter(i32 70, {{.*}}, i8 -1) +// CHECK: bufferUpdateCounter(i32 70, {{.*}}, i8 1) + +// Append Structured Buffer (u3) +AppendStructuredBuffer appendUAVResource : register(u3); + +// Consume Structured Buffer (u4) +ConsumeStructuredBuffer consumeUAVResource : register(u4); + +[shader("compute")] +void test() +{ + float4 consumeResourceOutput = consumeUAVResource.Consume(); + appendUAVResource.Append(consumeResourceOutput); +} \ No newline at end of file