diff options
author | Devang Patel <dpatel@apple.com> | 2008-03-04 21:32:09 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2008-03-04 21:32:09 +0000 |
commit | d81d65f70dff2899a0d4856b32394b1942ce262d (patch) | |
tree | 9d55c4acaefeb14800adaabb18892877404a4cc9 /lib/Transforms | |
parent | bd4e13d1d30664d3ad3821dc4c0acf881f7a2fc4 (diff) | |
download | external_llvm-d81d65f70dff2899a0d4856b32394b1942ce262d.zip external_llvm-d81d65f70dff2899a0d4856b32394b1942ce262d.tar.gz external_llvm-d81d65f70dff2899a0d4856b32394b1942ce262d.tar.bz2 |
Filter nested structs
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47906 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/IPO/StructRetPromotion.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/Transforms/IPO/StructRetPromotion.cpp b/lib/Transforms/IPO/StructRetPromotion.cpp index 7ea8549..54a34e8 100644 --- a/lib/Transforms/IPO/StructRetPromotion.cpp +++ b/lib/Transforms/IPO/StructRetPromotion.cpp @@ -48,6 +48,7 @@ namespace { bool isSafeToUpdateAllCallers(Function *F); Function *cloneFunctionBody(Function *F, const StructType *STy); void updateCallSites(Function *F, Function *NF); + bool nestedStructType(const StructType *STy); }; char SRETPromotion::ID = 0; @@ -88,6 +89,9 @@ bool SRETPromotion::PromoteReturn(CallGraphNode *CGN) { dyn_cast<StructType>(FArgType->getElementType()); assert (STy && "Invalid sret parameter element type"); + if (nestedStructType(STy)) + return false; + // Check if it is ok to perform this promotion. if (isSafeToUpdateAllCallers(F) == false) { NumRejectedSRETUses++; @@ -319,3 +323,15 @@ void SRETPromotion::updateCallSites(Function *F, Function *NF) { Call->eraseFromParent(); } } + +/// nestedStructType - Return true if STy includes any +/// other aggregate types +bool SRETPromotion::nestedStructType(const StructType *STy) { + unsigned Num = STy->getNumElements(); + for (unsigned i = 0; i < Num; i++) { + const Type *Ty = STy->getElementType(i); + if (!Ty->isFirstClassType() && Ty != Type::VoidTy) + return true; + } + return false; +} |