summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/InlineSpiller.cpp
diff options
context:
space:
mode:
authorWei Mi <wmi@google.com>2016-04-07 05:27:17 +0000
committerWei Mi <wmi@google.com>2016-04-07 05:27:17 +0000
commit979e9756ecbcba1a1b4743048cb1193fb799bd53 (patch)
treeb10bd7b62b30d2748eed5264a4aff2c020697dca /llvm/lib/CodeGen/InlineSpiller.cpp
parent41474a52e7ddd0a2f2844d06e7811a69479f3c90 (diff)
downloadbcm5719-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.cpp9
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);
}
OpenPOWER on IntegriCloud