Filter nested structs
authorDevang Patel <dpatel@apple.com>
Tue, 4 Mar 2008 21:32:09 +0000 (21:32 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 4 Mar 2008 21:32:09 +0000 (21:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47906 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/StructRetPromotion.cpp

index 7ea85493ee8298db4503ef035ca5e4a6aa72c6c6..54a34e8803f16d9b98ab522922f2b9f600f545b4 100644 (file)
@@ -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;
+}