summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Bitcode/Writer
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-07-30 01:20:26 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-07-30 01:20:26 +0000
commitba4576daeb43f40ad8f5821c87f65fcea6a0732b (patch)
tree97fa794ebddde6a0e7b345dd49776a1fd29d6489 /llvm/lib/Bitcode/Writer
parent7eb0a1014ddea55e3bbaa2bf8243480deaa2cd53 (diff)
downloadbcm5719-llvm-ba4576daeb43f40ad8f5821c87f65fcea6a0732b.tar.gz
bcm5719-llvm-ba4576daeb43f40ad8f5821c87f65fcea6a0732b.zip
UseListOrder: Fix undefined behaviour
This commit fixes undefined behaviour that caused the revert in r214249. The problem was two unsequenced operations on a `DenseMap<>`, giving different behaviour in GCC and Clang. This: DenseMap<T*, unsigned> DM; for (auto &X : ...) DM[&X] = DM.size() + 1; should have been: DenseMap<T*, unsigned> DM; for (auto &X : ...) { unsigned Size = DM.size(); DM[&X] = Size + 1; } Until r214242, this difference between compilers didn't matter. In r214242, `OrderMap::LastGlobalValueID` was introduced and compared against IDs, which in GCC were off-by-one my expectations. llvm-svn: 214270
Diffstat (limited to 'llvm/lib/Bitcode/Writer')
-rw-r--r--llvm/lib/Bitcode/Writer/ValueEnumerator.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp b/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
index 5624e02a5c8..144e8fb08cd 100644
--- a/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
+++ b/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
@@ -34,6 +34,11 @@ struct OrderMap {
std::pair<unsigned, bool> lookup(const Value *V) const {
return IDs.lookup(V);
}
+ void index(const Value *V) {
+ // Explicitly sequence get-size and insert-value operations to avoid UB.
+ unsigned ID = IDs.size() + 1;
+ IDs[V].first = ID;
+ }
};
}
@@ -48,8 +53,8 @@ static void orderValue(const Value *V, OrderMap &OM) {
orderValue(Op, OM);
// Note: we cannot cache this lookup above, since inserting into the map
- // changes the map's size, and thus affects the ID.
- OM[V].first = OM.size() + 1;
+ // changes the map's size, and thus affects the other IDs.
+ OM.index(V);
}
static OrderMap orderModule(const Module *M) {
OpenPOWER on IntegriCloud