From: Matthijs Kooijman Date: Fri, 20 Jun 2008 15:25:43 +0000 (+0000) Subject: Don't let DeadArgumentElimination attempt to update callers when the return X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=df0891d2ffb6d00c5bd5b929dae02c74535ea246;p=oota-llvm.git Don't let DeadArgumentElimination attempt to update callers when the return type wasn't changed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52538 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/IPO/DeadArgumentElimination.cpp b/lib/Transforms/IPO/DeadArgumentElimination.cpp index 3253c54a681..d7febc50c8a 100644 --- a/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ b/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -743,11 +743,18 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) { Args.clear(); if (!Call->use_empty()) { - if (New->getType() == Type::VoidTy) - // Our return value was unused, replace by null for now, uses will get - // removed later on + if (New->getType() == Call->getType()) { + // Return type not changed? Just replace users then + Call->replaceAllUsesWith(New); + New->takeName(Call); + } else if (New->getType() == Type::VoidTy) { + // Our return value has uses, but they will get removed later on. + // Replace by null for now. Call->replaceAllUsesWith(Constant::getNullValue(Call->getType())); - else if (isa(RetTy)) { + } else { + assert(isa(RetTy) && "Return type changed, but not into a" + "void. The old return type must have" + "been a struct!"); // The original return value was a struct, update all uses (which are // all extractvalue instructions). for (Value::use_iterator I = Call->use_begin(), E = Call->use_end(); @@ -781,11 +788,7 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) { } } New->takeName(Call); - } else { - // The original function had a single return value - Call->replaceAllUsesWith(New); - New->takeName(Call); - } + } } // Finally, remove the old call from the program, reducing the use-count of