[clang] [clang] fix OutputSemantic list in HLSL (PR #185550)
Jameson Nash via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 9 19:05:23 PDT 2026
https://github.com/vtjnash updated https://github.com/llvm/llvm-project/pull/185550
>From fd30b8a151582a435427fdcb97a844623d5b1490 Mon Sep 17 00:00:00 2001
From: Jameson Nash <vtjnash at gmail.com>
Date: Mon, 9 Mar 2026 21:24:55 -0400
Subject: [PATCH] [clang] fix OutputSemantic list in HLSL
Normally sane front-ends with the common calling-conventions avoid
having multiple sret with a return value, so this is NFCI. However,
multiple can be valid. This rewrites an odd looking DenseMap of one
element that was needed for iteration into a more sensible vector.
Noted in https://github.com/llvm/llvm-project/pull/181740 review.
---
clang/lib/CodeGen/CGHLSLRuntime.cpp | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp
index 7ce722c857409..2832714bec87d 100644
--- a/clang/lib/CodeGen/CGHLSLRuntime.cpp
+++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp
@@ -951,8 +951,7 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
OB.emplace_back("convergencectrl", bundleArgs);
}
- llvm::DenseMap<const DeclaratorDecl *, std::pair<llvm::Value *, llvm::Type *>>
- OutputSemantic;
+ std::vector<std::pair<llvm::Value *, llvm::Type *>> OutputSemantic;
unsigned SRetOffset = 0;
for (const auto &Param : Fn->args()) {
@@ -960,7 +959,7 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
SRetOffset = 1;
llvm::Type *VarType = Param.getParamStructRetType();
llvm::Value *Var = B.CreateAlloca(VarType);
- OutputSemantic.try_emplace(FD, std::make_pair(Var, VarType));
+ OutputSemantic.push_back(std::make_pair(Var, VarType));
Args.push_back(Var);
continue;
}
@@ -997,17 +996,17 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
if (Fn->getReturnType() != CGM.VoidTy)
// Element type is unused, so set to dummy value (NULL).
- OutputSemantic.try_emplace(FD, std::make_pair(CI, nullptr));
+ OutputSemantic.push_back(std::make_pair(CI, nullptr));
- for (auto &[Decl, SourcePair] : OutputSemantic) {
+ for (auto &SourcePair : OutputSemantic) {
llvm::Value *Source = SourcePair.first;
llvm::Type *ElementType = SourcePair.second;
AllocaInst *AI = dyn_cast<AllocaInst>(Source);
llvm::Value *SourceValue = AI ? B.CreateLoad(ElementType, Source) : Source;
- auto AttrBegin = Decl->specific_attr_begin<HLSLAppliedSemanticAttr>();
- auto AttrEnd = Decl->specific_attr_end<HLSLAppliedSemanticAttr>();
- handleSemanticStore(B, FD, SourceValue, Decl, AttrBegin, AttrEnd);
+ auto AttrBegin = FD->specific_attr_begin<HLSLAppliedSemanticAttr>();
+ auto AttrEnd = FD->specific_attr_end<HLSLAppliedSemanticAttr>();
+ handleSemanticStore(B, FD, SourceValue, FD, AttrBegin, AttrEnd);
}
B.CreateRetVoid();
More information about the cfe-commits
mailing list