diff options
author | Wei Mi <wmi@google.com> | 2016-04-07 05:27:17 +0000 |
---|---|---|
committer | Wei Mi <wmi@google.com> | 2016-04-07 05:27:17 +0000 |
commit | 979e9756ecbcba1a1b4743048cb1193fb799bd53 (patch) | |
tree | b10bd7b62b30d2748eed5264a4aff2c020697dca /llvm/lib/CodeGen/InlineSpiller.cpp | |
parent | 41474a52e7ddd0a2f2844d06e7811a69479f3c90 (diff) | |
download | bcm5719-llvm-979e9756ecbcba1a1b4743048cb1193fb799bd53.tar.gz bcm5719-llvm-979e9756ecbcba1a1b4743048cb1193fb799bd53.zip |
Fix the sanitizer bootstrap error in r265547.
The iterators of SmallPtrSet SpillsInSubTreeMap[Child].first may be
invalidated when SpillsInSubTreeMap grows. Rearrange the code to
ensure the grow of SpillsInSubTreeMap only happens before getting
the iterators of the SmallPtrSet.
llvm-svn: 265639
Diffstat (limited to 'llvm/lib/CodeGen/InlineSpiller.cpp')
-rw-r--r-- | llvm/lib/CodeGen/InlineSpiller.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/InlineSpiller.cpp b/llvm/lib/CodeGen/InlineSpiller.cpp index b88da602599..81ebbcb3e1e 100644 --- a/llvm/lib/CodeGen/InlineSpiller.cpp +++ b/llvm/lib/CodeGen/InlineSpiller.cpp @@ -1272,10 +1272,17 @@ void HoistSpillHelper::runHoistSpills( unsigned NumChildren = Children.size(); for (unsigned i = 0; i != NumChildren; ++i) { MachineDomTreeNode *Child = Children[i]; + if (SpillsInSubTreeMap.find(Child) == SpillsInSubTreeMap.end()) + continue; + // SpillsInSubTreeMap[*RIt].second += SpillsInSubTreeMap[Child].second + // should be placed before getting the begin and end iterators of + // SpillsInSubTreeMap[Child].first, or else the iterators may be + // invalidated when SpillsInSubTreeMap[*RIt] is seen the first time + // and the map grows and then the original buckets in the map are moved. + SpillsInSubTreeMap[*RIt].second += SpillsInSubTreeMap[Child].second; auto BI = SpillsInSubTreeMap[Child].first.begin(); auto EI = SpillsInSubTreeMap[Child].first.end(); SpillsInSubTreeMap[*RIt].first.insert(BI, EI); - SpillsInSubTreeMap[*RIt].second += SpillsInSubTreeMap[Child].second; SpillsInSubTreeMap.erase(Child); } |