================
@@ -1186,58 +1186,191 @@ void CGHLSLRuntime::emitSPIRVUserSemanticStore(
VariableName.str());
}
-llvm::Value *
-CGHLSLRuntime::emitDXILUserSemanticLoad(llvm::IRBuilder<> &B, llvm::Type *Type,
- HLSLAppliedSemanticAttr *Semantic,
- std::optional<unsigned> Index) {
- Twine BaseName = Twine(Semantic->getAttrName()->getName());
- Twine VariableName = BaseName.concat(Twine(Index.value_or(0)));
+namespace {
+// Describes how a semantic leaf lowers to signature rows
+struct SemanticShape {
+ unsigned Rows;
+ unsigned Cols;
+ QualType RowType;
+};
+} // namespace
+
+// Returns the QualType of a semantic leaf declarator. For a function the
+// declared return type is used, otherwise the declared type.
+static QualType getSemanticLeafType(const clang::DeclaratorDecl *Decl) {
+ if (const auto *FD = dyn_cast<clang::FunctionDecl>(Decl))
+ return FD->getDeclaredReturnType();
+ return Decl->getType();
+}
+
+// Walks through the surrounding constant array types of \p Ty, accumulating
the
+// number of rows, until reaching a scalar, vector, or matrix leaf. The leaf is
+// returned as the row type together with the number of rows.
+static SemanticShape getSemanticShape(ASTContext &Ctx, QualType Ty) {
+ unsigned Rows = 1;
+ while (const ConstantArrayType *CAT = Ctx.getAsConstantArrayType(Ty)) {
+ Rows *= CAT->getSize().getZExtValue();
+ Ty = CAT->getElementType();
+ }
+
+ unsigned Cols = 1;
+ if (const auto *VT = Ty->getAs<clang::VectorType>()) {
+ Cols = VT->getNumElements();
+ } else if (const auto *MT = Ty->getAs<clang::ConstantMatrixType>()) {
+ // FIXME: a matrix leaf lowers to one row per matrix row but if
column_major
+ // is specified we transpose the num rows and num cols, this depends on
+ // #211977 to resolve
+ Cols = MT->getNumColumns();
+ }
- // DXIL packing rules etc shall be handled here.
- // FIXME: generate proper sigpoint, index, col, row values.
- // FIXME: also DXIL loads vectors element by element.
- SmallVector<Value *> Args{B.getInt32(4), B.getInt32(0), B.getInt32(0),
- B.getInt8(0),
- llvm::PoisonValue::get(B.getInt32Ty())};
+ return {Rows, Cols, Ty};
+}
+
+llvm::Value *CGHLSLRuntime::emitDXILUserSemanticLoad(
+ llvm::IRBuilder<> &B, llvm::Type *Type, const clang::DeclaratorDecl *Decl,
+ HLSLAppliedSemanticAttr *Semantic, std::optional<unsigned> Index) {
+ StringRef Name = Semantic->getAttrName()->getName();
+ SemanticShape Shape =
+ getSemanticShape(CGM.getContext(), getSemanticLeafType(Decl));
- llvm::Intrinsic::ID IntrinsicID = llvm::Intrinsic::dx_load_input;
+ llvm::Type *RowTy = CGM.getTypes().ConvertTypeForMem(Shape.RowType);
+
+ llvm::Function *IntrFn = llvm::Intrinsic::getOrInsertDeclaration(
+ B.GetInsertBlock()->getModule(), llvm::Intrinsic::dx_load_input,
{RowTy});
SmallVector<OperandBundleDef, 1> OB;
if (auto *Token = getConvergenceToken(*B.GetInsertBlock())) {
llvm::Value *bundleArgs[] = {Token};
OB.emplace_back("convergencectrl", bundleArgs);
}
- llvm::Function *IntrFn = llvm::Intrinsic::getOrInsertDeclaration(
- B.GetInsertBlock()->getModule(), IntrinsicID, {Type});
- llvm::Value *Value = B.CreateCall(IntrFn, Args, OB, VariableName);
- return Value;
+ unsigned SigId = DXILInputSemanticIndex++;
+ unsigned Row = 0;
+
+ // Scalar and vector leaves need no aggregate reconstruction.
+ if (!isa<llvm::ArrayType>(Type)) {
----------------
Icohedron wrote:
Should there be an assertion that `Type` is a scalar/vector or otherwise just a
non-aggregate type?
https://github.com/llvm/llvm-project/pull/212656
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits