[llvm-commits] [llvm] r163893 - /llvm/trunk/lib/Transforms/Scalar/SROA.cpp

Chandler Carruth chandlerc at gmail.com
Fri Sep 14 03:26:38 PDT 2012


Author: chandlerc
Date: Fri Sep 14 05:26:38 2012
New Revision: 163893

URL: http://llvm.org/viewvc/llvm-project?rev=163893&view=rev
Log:
Move an instance variable to a local variable based on review by Duncan.
Originally I had anticipated needing to thread this through more bits of
the SROA pass itself, but that ended up not happening. In the end, this
is a much simpler way to manange the variable.

Modified:
    llvm/trunk/lib/Transforms/Scalar/SROA.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=163893&r1=163892&r2=163893&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Fri Sep 14 05:26:38 2012
@@ -1150,12 +1150,6 @@
   /// uses as dead. Only used to guard insertion into DeadInsts.
   SmallPtrSet<Instruction *, 4> DeadSplitInsts;
 
-  /// \brief A set of deleted alloca instructions.
-  ///
-  /// These pointers are *no longer valid* as they have been deleted. They are
-  /// used to remove deleted allocas from the list of promotable allocas.
-  SmallPtrSet<AllocaInst *, 4> DeletedAllocas;
-
   /// \brief A collection of alloca instructions we can directly promote.
   std::vector<AllocaInst *> PromotableAllocas;
 
@@ -1178,7 +1172,7 @@
                               AllocaPartitioning::iterator PI);
   bool splitAlloca(AllocaInst &AI, AllocaPartitioning &P);
   bool runOnAlloca(AllocaInst &AI);
-  void deleteDeadInstructions();
+  void deleteDeadInstructions(SmallPtrSet<AllocaInst *, 4> &DeletedAllocas);
 };
 }
 
@@ -2556,7 +2550,16 @@
   return splitAlloca(AI, P) || Changed;
 }
 
-void SROA::deleteDeadInstructions() {
+/// \brief Delete the dead instructions accumulated in this run.
+///
+/// Recursively deletes the dead instructions we've accumulated. This is done
+/// at the very end to maximize locality of the recursive delete and to
+/// minimize the problems of invalidated instruction pointers as such pointers
+/// are used heavily in the intermediate stages of the algorithm.
+///
+/// We also record the alloca instructions deleted here so that they aren't
+/// subsequently handed to mem2reg to promote.
+void SROA::deleteDeadInstructions(SmallPtrSet<AllocaInst*, 4> &DeletedAllocas) {
   DeadSplitInsts.clear();
   while (!DeadInsts.empty()) {
     Instruction *I = DeadInsts.pop_back_val();
@@ -2607,9 +2610,13 @@
       Worklist.insert(AI);
 
   bool Changed = false;
+  // A set of deleted alloca instruction pointers which should be removed from
+  // the list of promotable allocas.
+  SmallPtrSet<AllocaInst *, 4> DeletedAllocas;
+
   while (!Worklist.empty()) {
     Changed |= runOnAlloca(*Worklist.pop_back_val());
-    deleteDeadInstructions();
+    deleteDeadInstructions(DeletedAllocas);
     if (!DeletedAllocas.empty()) {
       PromotableAllocas.erase(std::remove_if(PromotableAllocas.begin(),
                                              PromotableAllocas.end(),





More information about the llvm-commits mailing list