mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-22 20:20:03 +00:00
Filter nested structs
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47906 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dc00d42bb1
commit
a9fe8bb3b6
@ -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…
Reference in New Issue
Block a user