diff --git a/lib/Transforms/IPO/DeadArgumentElimination.cpp b/lib/Transforms/IPO/DeadArgumentElimination.cpp index 36be6f8f4dd..6f00c89bf56 100644 --- a/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ b/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -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 NewRetIdxs(RetCount, -1); std::vector 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);