diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils')
| -rw-r--r-- | llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 19 | 
2 files changed, 17 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp index ac29de6f288..e902688f206 100644 --- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -78,7 +78,7 @@ void llvm::FoldSingleEntryPHINodes(BasicBlock *BB) {  /// is dead. Also recursively delete any operands that become dead as  /// a result. This includes tracing the def-use list from the PHI to see if  /// it is ultimately unused or if it reaches an unused cycle. -void llvm::DeleteDeadPHIs(BasicBlock *BB) { +bool llvm::DeleteDeadPHIs(BasicBlock *BB) {    // Recursively deleting a PHI may cause multiple PHIs to be deleted    // or RAUW'd undef, so use an array of WeakVH for the PHIs to delete.    SmallVector<WeakVH, 8> PHIs; @@ -86,9 +86,12 @@ void llvm::DeleteDeadPHIs(BasicBlock *BB) {         PHINode *PN = dyn_cast<PHINode>(I); ++I)      PHIs.push_back(PN); +  bool Changed = false;    for (unsigned i = 0, e = PHIs.size(); i != e; ++i)      if (PHINode *PN = dyn_cast_or_null<PHINode>(PHIs[i].operator Value*())) -      RecursivelyDeleteDeadPHINode(PN); +      Changed |= RecursivelyDeleteDeadPHINode(PN); + +  return Changed;  }  /// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor, diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index ec773fd12f1..27d9a06bfc6 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -268,11 +268,12 @@ bool llvm::isInstructionTriviallyDead(Instruction *I) {  /// RecursivelyDeleteTriviallyDeadInstructions - If the specified value is a  /// trivially dead instruction, delete it.  If that makes any of its operands -/// trivially dead, delete them too, recursively. -void llvm::RecursivelyDeleteTriviallyDeadInstructions(Value *V) { +/// trivially dead, delete them too, recursively.  Return true if any +/// instructions were deleted. +bool llvm::RecursivelyDeleteTriviallyDeadInstructions(Value *V) {    Instruction *I = dyn_cast<Instruction>(V);    if (!I || !I->use_empty() || !isInstructionTriviallyDead(I)) -    return; +    return false;    SmallVector<Instruction*, 16> DeadInsts;    DeadInsts.push_back(I); @@ -298,21 +299,24 @@ void llvm::RecursivelyDeleteTriviallyDeadInstructions(Value *V) {      I->eraseFromParent();    } + +  return true;  }  /// RecursivelyDeleteDeadPHINode - If the specified value is an effectively  /// dead PHI node, due to being a def-use chain of single-use nodes that  /// either forms a cycle or is terminated by a trivially dead instruction,  /// delete it.  If that makes any of its operands trivially dead, delete them -/// too, recursively. -void +/// too, recursively.  Return true if the PHI node is actually deleted. +bool  llvm::RecursivelyDeleteDeadPHINode(PHINode *PN) {    // We can remove a PHI if it is on a cycle in the def-use graph    // where each node in the cycle has degree one, i.e. only one use,    // and is an instruction with no side effects.    if (!PN->hasOneUse()) -    return; +    return false; +  bool Changed = false;    SmallPtrSet<PHINode *, 4> PHIs;    PHIs.insert(PN);    for (Instruction *J = cast<Instruction>(*PN->use_begin()); @@ -324,9 +328,10 @@ llvm::RecursivelyDeleteDeadPHINode(PHINode *PN) {        if (!PHIs.insert(cast<PHINode>(JP))) {          // Break the cycle and delete the PHI and its operands.          JP->replaceAllUsesWith(UndefValue::get(JP->getType())); -        RecursivelyDeleteTriviallyDeadInstructions(JP); +        Changed |= RecursivelyDeleteTriviallyDeadInstructions(JP);          break;        } +  return Changed;  }  //===----------------------------------------------------------------------===//  | 

