2010/1/5 Dan Gohman <span dir="ltr"><<a href="mailto:gohman@apple.com">gohman@apple.com</a>></span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Author: djg<br>
Date: Tue Jan  5 09:45:31 2010<br>
New Revision: 92732<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=92732&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=92732&view=rev</a><br>
Log:<br>
Make RecursivelyDeleteTriviallyDeadInstructions,<br>
RecursivelyDeleteDeadPHINode, and DeleteDeadPHIs return a flag<br>
indicating whether they made any changes.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h<br>
    llvm/trunk/include/llvm/Transforms/Utils/Local.h<br>
    llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp<br>
    llvm/trunk/lib/Transforms/Utils/Local.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h?rev=92732&r1=92731&r2=92732&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h?rev=92732&r1=92731&r2=92732&view=diff</a><br>


<br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h (original)<br>
+++ llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h Tue Jan  5 09:45:31 2010<br>
@@ -40,8 +40,9 @@<br>
 /// DeleteDeadPHIs - Examine each PHI in the given block and delete it if it<br>
 /// is dead. Also recursively delete any operands that become dead as<br>
 /// a result. This includes tracing the def-use list from the PHI to see if<br>
-/// it is ultimately unused or if it reaches an unused cycle.<br>
-void DeleteDeadPHIs(BasicBlock *BB);<br>
+/// it is ultimately unused or if it reaches an unused cycle. Return true<br>
+/// if any PHIs were deleted.<br>
+bool DeleteDeadPHIs(BasicBlock *BB);<br>
<br>
 /// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor,<br>
 /// if possible.  The return value indicates success or failure.<br>
<br>
Modified: llvm/trunk/include/llvm/Transforms/Utils/Local.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/Local.h?rev=92732&r1=92731&r2=92732&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/Local.h?rev=92732&r1=92731&r2=92732&view=diff</a><br>


<br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)<br>
+++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Tue Jan  5 09:45:31 2010<br>
@@ -63,15 +63,16 @@<br>
<br>
 /// RecursivelyDeleteTriviallyDeadInstructions - If the specified value is a<br>
 /// trivially dead instruction, delete it.  If that makes any of its operands<br>
-/// trivially dead, delete them too, recursively.<br>
-void RecursivelyDeleteTriviallyDeadInstructions(Value *V);<br>
+/// trivially dead, delete them too, recursively.  Return true if any<br>
+/// instructions were deleted.<br>
+bool RecursivelyDeleteTriviallyDeadInstructions(Value *V);<br>
<br>
 /// RecursivelyDeleteDeadPHINode - If the specified value is an effectively<br>
 /// dead PHI node, due to being a def-use chain of single-use nodes that<br>
 /// either forms a cycle or is terminated by a trivially dead instruction,<br>
 /// delete it.  If that makes any of its operands trivially dead, delete them<br>
-/// too, recursively.<br>
-void RecursivelyDeleteDeadPHINode(PHINode *PN);<br>
+/// too, recursively.  Return true if the PHI node is actually deleted.<br>
+bool RecursivelyDeleteDeadPHINode(PHINode *PN);<br>
<br>
 //===----------------------------------------------------------------------===//<br>
 //  Control Flow Graph Restructuring.<br>
<br>
Modified: llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp?rev=92732&r1=92731&r2=92732&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp?rev=92732&r1=92731&r2=92732&view=diff</a><br>


<br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp Tue Jan  5 09:45:31 2010<br>
@@ -78,7 +78,7 @@<br>
 /// is dead. Also recursively delete any operands that become dead as<br>
 /// a result. This includes tracing the def-use list from the PHI to see if<br>
 /// it is ultimately unused or if it reaches an unused cycle.<br>
-void llvm::DeleteDeadPHIs(BasicBlock *BB) {<br>
+bool llvm::DeleteDeadPHIs(BasicBlock *BB) {<br>
   // Recursively deleting a PHI may cause multiple PHIs to be deleted<br>
   // or RAUW'd undef, so use an array of WeakVH for the PHIs to delete.<br>
   SmallVector<WeakVH, 8> PHIs;<br>
@@ -86,9 +86,12 @@<br>
        PHINode *PN = dyn_cast<PHINode>(I); ++I)<br>
     PHIs.push_back(PN);<br>
<br>
+  bool Changed = false;<br>
   for (unsigned i = 0, e = PHIs.size(); i != e; ++i)<br>
     if (PHINode *PN = dyn_cast_or_null<PHINode>(PHIs[i].operator Value*()))<br>
-      RecursivelyDeleteDeadPHINode(PN);<br>
+      Changed |= RecursivelyDeleteDeadPHINode(PN);<br>
+<br>
+  return Changed;<br>
 }<br>
<br>
 /// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor,<br>
<br>
Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=92732&r1=92731&r2=92732&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=92732&r1=92731&r2=92732&view=diff</a><br>


<br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Utils/Local.cpp Tue Jan  5 09:45:31 2010<br>
@@ -268,11 +268,12 @@<br>
<br>
 /// RecursivelyDeleteTriviallyDeadInstructions - If the specified value is a<br>
 /// trivially dead instruction, delete it.  If that makes any of its operands<br>
-/// trivially dead, delete them too, recursively.<br>
-void llvm::RecursivelyDeleteTriviallyDeadInstructions(Value *V) {<br>
+/// trivially dead, delete them too, recursively.  Return true if any<br>
+/// instructions were deleted.<br>
+bool llvm::RecursivelyDeleteTriviallyDeadInstructions(Value *V) {<br>
   Instruction *I = dyn_cast<Instruction>(V);<br>
   if (!I || !I->use_empty() || !isInstructionTriviallyDead(I))<br>
-    return;<br>
+    return false;<br>
<br>
   SmallVector<Instruction*, 16> DeadInsts;<br>
   DeadInsts.push_back(I);<br>
@@ -298,21 +299,24 @@<br>
<br>
     I->eraseFromParent();<br>
   }<br>
+<br>
+  return true;<br>
 }<br>
<br>
 /// RecursivelyDeleteDeadPHINode - If the specified value is an effectively<br>
 /// dead PHI node, due to being a def-use chain of single-use nodes that<br>
 /// either forms a cycle or is terminated by a trivially dead instruction,<br>
 /// delete it.  If that makes any of its operands trivially dead, delete them<br>
-/// too, recursively.<br>
-void<br>
+/// too, recursively.  Return true if the PHI node is actually deleted.<br>
+bool<br>
 llvm::RecursivelyDeleteDeadPHINode(PHINode *PN) {<br>
   // We can remove a PHI if it is on a cycle in the def-use graph<br>
   // where each node in the cycle has degree one, i.e. only one use,<br>
   // and is an instruction with no side effects.<br>
   if (!PN->hasOneUse())<br>
-    return;<br>
+    return false;<br>
<br>
+  bool Changed = false;<br>
   SmallPtrSet<PHINode *, 4> PHIs;<br>
   PHIs.insert(PN);<br>
   for (Instruction *J = cast<Instruction>(*PN->use_begin());<br>
@@ -324,9 +328,10 @@<br>
       if (!PHIs.insert(cast<PHINode>(JP))) {<br>
         // Break the cycle and delete the PHI and its operands.<br>
         JP->replaceAllUsesWith(UndefValue::get(JP->getType()));<br>
-        RecursivelyDeleteTriviallyDeadInstructions(JP);<br>
+        Changed |= RecursivelyDeleteTriviallyDeadInstructions(JP);<br></blockquote><div><br>Since we just did JP->RAUW, we should have Changed = true; here, right?<br><br>Nick<br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">


         break;<br>
       }<br>
+  return Changed;<br>
 }<br>
<br>
 //===----------------------------------------------------------------------===//<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br>