Explicitely track if any arguments or return values were removed in
authorMatthijs Kooijman <matthijs@stdin.nl>
Fri, 20 Jun 2008 14:28:52 +0000 (14:28 +0000)
committerMatthijs Kooijman <matthijs@stdin.nl>
Fri, 20 Jun 2008 14:28:52 +0000 (14:28 +0000)
DeadArgumentElimination and assert that the function type does not change if
nothing was changed. This should catch subtle changes in function type that are
not intended.

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

lib/Transforms/IPO/DeadArgumentElimination.cpp

index 36be6f8f4dd737b85bd8ef3c6323cbb6ec653d42..6f00c89bf5653d46ac96319c153f72dc2ae75e0d 100644 (file)
@@ -568,6 +568,8 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
   const Type *RetTy = FTy->getReturnType();
   const Type *NRetTy;
   unsigned RetCount = NumRetVals(F);
+  // Explicitely track if anything changed, for debugging
+  bool Changed = false;
   // -1 means unused, other numbers are the new index
   SmallVector<int, 5> NewRetIdxs(RetCount, -1);
   std::vector<const Type*> RetTypes;
@@ -582,7 +584,8 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
           NewRetIdxs[i] = RetTypes.size() - 1;
         } else {
           ++NumRetValsEliminated;
-        DOUT << "DAE - Removing return value " << i << " from " << F->getNameStart() << "\n";
+          DOUT << "DAE - Removing return value " << i << " from " << F->getNameStart() << "\n";
+          Changed = true;
         }
       }
     else
@@ -593,6 +596,7 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
       } else {
         DOUT << "DAE - Removing return value from " << F->getNameStart() << "\n";
         ++NumRetValsEliminated;
+        Changed = true;
       } 
     if (RetTypes.size() == 0)
       // No return types? Make it void
@@ -632,6 +636,7 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
     } else {
       ++NumArgumentsEliminated;
       DOUT << "DAE - Removing argument " << i << " (" << I->getNameStart() << ") from " << F->getNameStart() << "\n";
+      Changed = true;
     }
   }
 
@@ -657,6 +662,10 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
   if (NFTy == FTy)
     return false;
 
+  // The function type is only allowed to be different if we actually left out
+  // an argument or return value
+  assert(Changed && "Function type changed while no arguments or retrurn values were removed!");
+
   // Create the new function body and insert it into the module...
   Function *NF = Function::Create(NFTy, F->getLinkage());
   NF->copyAttributesFrom(F);