[llvm] r230718 - Fix a use-iterator-after-invalidate error

Sanjoy Das sanjoy at playingwithpointers.com
Thu Feb 26 18:19:11 PST 2015


Author: sanjoy
Date: Thu Feb 26 20:19:11 2015
New Revision: 230718

URL: http://llvm.org/viewvc/llvm-project?rev=230718&view=rev
Log:
Fix a use-iterator-after-invalidate error

AnalysisResult::getResultImpl reuses an iterator into a DenseMap after
inserting elements into it. This change adds code to recompute the
iterator before the second use.


Modified:
    llvm/trunk/include/llvm/IR/PassManager.h

Modified: llvm/trunk/include/llvm/IR/PassManager.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PassManager.h?rev=230718&r1=230717&r2=230718&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/PassManager.h (original)
+++ llvm/trunk/include/llvm/IR/PassManager.h Thu Feb 26 20:19:11 2015
@@ -471,6 +471,12 @@ private:
         dbgs() << "Running analysis: " << P.name() << "\n";
       AnalysisResultListT &ResultList = AnalysisResultLists[&IR];
       ResultList.emplace_back(PassID, P.run(IR, this));
+
+      // P.run may have inserted elements into AnalysisResults and invalidated
+      // RI.
+      RI = AnalysisResults.find(std::make_pair(PassID, &IR));
+      assert(RI != AnalysisResults.end() && "we just inserted it!");
+
       RI->second = std::prev(ResultList.end());
     }
 





More information about the llvm-commits mailing list