[llvm] [Scalarizer][DirectX] support structs return types (PR #111569)
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 15 09:06:51 PDT 2024
================
@@ -1208,6 +1274,35 @@ bool ScalarizerVisitor::finish() {
Res = concatenate(Builder, CV, VS, Op->getName());
Res->takeName(Op);
+ } else if (auto *Ty = dyn_cast<StructType>(Op->getType())) {
+ BasicBlock *BB = Op->getParent();
+ IRBuilder<> Builder(Op);
+ if (isa<PHINode>(Op))
+ Builder.SetInsertPoint(BB, BB->getFirstInsertionPt());
+
+ // Iterate over each element in the struct
+ unsigned NumOfStructElements = Ty->getNumElements();
+ SmallVector<ValueVector, 4> ElemCV(NumOfStructElements);
+ for (unsigned I = 0; I < NumOfStructElements; ++I) {
+ for (auto *CVelem : CV) {
+ Value *Elem = Builder.CreateExtractValue(
+ CVelem, I, Op->getName() + ".elem" + std::to_string(I));
----------------
bogner wrote:
I think something like `Twine(Op->getName()) + ".elem" + I` might work here and be slightly more efficient than creating a `std::string`
https://github.com/llvm/llvm-project/pull/111569
More information about the llvm-commits
mailing list