UseListOrder: Fix undefined behaviour
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 30 Jul 2014 01:20:26 +0000 (01:20 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 30 Jul 2014 01:20:26 +0000 (01:20 +0000)
commitba4576daeb43f40ad8f5821c87f65fcea6a0732b
tree97fa794ebddde6a0e7b345dd49776a1fd29d6489
parent7eb0a1014ddea55e3bbaa2bf8243480deaa2cd53
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
llvm/lib/Bitcode/Writer/ValueEnumerator.cpp