[clang] [HLSL] Implement HLSL Flat casting (excluding splat cases) (PR #118842)
Ashley Coleman via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 15 11:44:16 PST 2025
================
@@ -6358,3 +6359,89 @@ RValue CodeGenFunction::EmitPseudoObjectRValue(const PseudoObjectExpr *E,
LValue CodeGenFunction::EmitPseudoObjectLValue(const PseudoObjectExpr *E) {
return emitPseudoObjectExpr(*this, E, true, AggValueSlot::ignored()).LV;
}
+
+void CodeGenFunction::FlattenAccessAndType(
+ Address Addr, QualType AddrType,
+ SmallVectorImpl<std::pair<Address, llvm::Value *>> &AccessList,
+ SmallVectorImpl<QualType> &FlatTypes) {
+ // WorkList is list of type we are processing + the Index List to access
+ // the field of that type in Addr for use in a GEP
+ llvm::SmallVector<std::pair<QualType, llvm::SmallVector<llvm::Value *, 4>>,
+ 16>
+ WorkList;
+ llvm::IntegerType *IdxTy = llvm::IntegerType::get(getLLVMContext(), 32);
+ WorkList.push_back(
+ {AddrType,
+ {llvm::ConstantInt::get(
+ IdxTy,
+ 0)}}); // Addr should be a pointer so we need to 'dereference' it
+
+ while (!WorkList.empty()) {
+ std::pair<QualType, llvm::SmallVector<llvm::Value *, 4>> P =
+ WorkList.pop_back_val();
+ QualType T = P.first;
+ llvm::SmallVector<llvm::Value *, 4> IdxList = P.second;
+ T = T.getCanonicalType().getUnqualifiedType();
+ assert(!isa<MatrixType>(T) && "Matrix types not yet supported in HLSL");
+ if (const auto *CAT = dyn_cast<ConstantArrayType>(T)) {
+ uint64_t Size = CAT->getZExtSize();
+ for (int64_t i = Size - 1; i > -1; i--) {
----------------
V-FEXrt wrote:
nit: `i` should be `I` https://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly
aside: At least for my setup, using a lower case, even in loops, raises a warning
https://github.com/llvm/llvm-project/pull/118842
More information about the cfe-commits
mailing list