mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-23 12:24:34 +00:00
Filter nested structs
llvm-svn: 47906
This commit is contained in:
parent
a14b91d6a3
commit
219be17d65
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user