diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-07-30 01:20:26 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-07-30 01:20:26 +0000 |
commit | ba4576daeb43f40ad8f5821c87f65fcea6a0732b (patch) | |
tree | 97fa794ebddde6a0e7b345dd49776a1fd29d6489 /llvm/lib/Bitcode/Writer | |
parent | 7eb0a1014ddea55e3bbaa2bf8243480deaa2cd53 (diff) | |
download | bcm5719-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.cpp | 9 |
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) { |