Don't let DeadArgElimination change the return type ({} into void and {T}
authorMatthijs Kooijman <matthijs@stdin.nl>
Fri, 20 Jun 2008 15:16:45 +0000 (15:16 +0000)
committerMatthijs Kooijman <matthijs@stdin.nl>
Fri, 20 Jun 2008 15:16:45 +0000 (15:16 +0000)
into T) when no return values are actually dead.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52537 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/DeadArgumentElimination.cpp

index 6f00c89bf5653d46ac96319c153f72dc2ae75e0d..3253c54a681ed0eb2ae9a7f495798981feeec082 100644 (file)
@@ -598,15 +598,21 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
         ++NumRetValsEliminated;
         Changed = true;
       } 
-    if (RetTypes.size() == 0)
-      // No return types? Make it void
-      NRetTy = Type::VoidTy;
+    if (RetTypes.size() > 1 || (STy && STy->getNumElements() == RetTypes.size()))
+      // More than one return type? Return a struct with them. Also, if we used
+      // to return a struct and didn't change the number of return values,
+      // return a struct again. This prevents chaning {something} into something
+      // and {} into void.
+      // Make the new struct packed if we used to return a packed struct
+      // already. 
+      NRetTy = StructType::get(RetTypes, STy->isPacked());
     else if (RetTypes.size() == 1)
-      // One return type? Just a simple value then
+      // One return type? Just a simple value then, but only if we didn't use to
+      // return a struct with that simple value before.
       NRetTy = RetTypes.front();
-    else
-      // More return types? Return a struct with them
-      NRetTy = StructType::get(RetTypes);
+    else if (RetTypes.size() == 0)
+      // No return types? Make it void, but only if we didn't use to return {}
+      NRetTy = Type::VoidTy;
   } else {
     NRetTy = Type::VoidTy;
   }