[llvm-commits] [llvm] r92732 - in /llvm/trunk: include/llvm/Transforms/Utils/BasicBlockUtils.h include/llvm/Transforms/Utils/Local.h lib/Transforms/Utils/BasicBlockUtils.cpp lib/Transforms/Utils/Local.cpp

Nick Lewycky nlewycky at google.com
Tue Jan 5 08:36:25 PST 2010


2010/1/5 Dan Gohman <gohman at apple.com>

> Author: djg
> Date: Tue Jan  5 09:45:31 2010
> New Revision: 92732
>
> URL: http://llvm.org/viewvc/llvm-project?rev=92732&view=rev
> Log:
> Make RecursivelyDeleteTriviallyDeadInstructions,
> RecursivelyDeleteDeadPHINode, and DeleteDeadPHIs return a flag
> indicating whether they made any changes.
>
> Modified:
>    llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h
>    llvm/trunk/include/llvm/Transforms/Utils/Local.h
>    llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp
>    llvm/trunk/lib/Transforms/Utils/Local.cpp
>
> Modified: llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h?rev=92732&r1=92731&r2=92732&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h Tue Jan  5
> 09:45:31 2010
> @@ -40,8 +40,9 @@
>  /// DeleteDeadPHIs - Examine each PHI in the given block and delete it if
> it
>  /// 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 DeleteDeadPHIs(BasicBlock *BB);
> +/// it is ultimately unused or if it reaches an unused cycle. Return true
> +/// if any PHIs were deleted.
> +bool DeleteDeadPHIs(BasicBlock *BB);
>
>  /// MergeBlockIntoPredecessor - Attempts to merge a block into its
> predecessor,
>  /// if possible.  The return value indicates success or failure.
>
> Modified: llvm/trunk/include/llvm/Transforms/Utils/Local.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/Local.h?rev=92732&r1=92731&r2=92732&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Tue Jan  5 09:45:31
> 2010
> @@ -63,15 +63,16 @@
>
>  /// 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 RecursivelyDeleteTriviallyDeadInstructions(Value *V);
> +/// trivially dead, delete them too, recursively.  Return true if any
> +/// instructions were deleted.
> +bool RecursivelyDeleteTriviallyDeadInstructions(Value *V);
>
>  /// 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 RecursivelyDeleteDeadPHINode(PHINode *PN);
> +/// too, recursively.  Return true if the PHI node is actually deleted.
> +bool RecursivelyDeleteDeadPHINode(PHINode *PN);
>
>
>  //===----------------------------------------------------------------------===//
>  //  Control Flow Graph Restructuring.
>
> Modified: llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp?rev=92732&r1=92731&r2=92732&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp Tue Jan  5 09:45:31
> 2010
> @@ -78,7 +78,7 @@
>  /// 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 @@
>        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,
>
> Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=92732&r1=92731&r2=92732&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Tue Jan  5 09:45:31 2010
> @@ -268,11 +268,12 @@
>
>  /// 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 @@
>
>     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 @@
>       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);
>

Since we just did JP->RAUW, we should have Changed = true; here, right?

Nick


>         break;
>       }
> +  return Changed;
>  }
>
>
>  //===----------------------------------------------------------------------===//
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20100105/4c0f3e49/attachment.html>


More information about the llvm-commits mailing list