diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-08-01 22:50:04 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-08-01 22:50:04 +0000 |
| commit | 6d3adac2179bc7867f55d108111ec38877b8b7c0 (patch) | |
| tree | 82ed744fe713be7fa183ec60fa11395aef4b352b /llvm | |
| parent | 608fb390a82ed953cbd6a75be224fa1703f0412a (diff) | |
| download | bcm5719-llvm-6d3adac2179bc7867f55d108111ec38877b8b7c0.tar.gz bcm5719-llvm-6d3adac2179bc7867f55d108111ec38877b8b7c0.zip | |
UseListOrder: Guarantee that shuffles change use-list order
Change shuffleUseLists() always to change use-list order by rejecting
orders that have no changes.
This is part of PR5680.
llvm-svn: 214584
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/IR/UseListOrder.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/llvm/lib/IR/UseListOrder.cpp b/llvm/lib/IR/UseListOrder.cpp index 7d845d1185b..0b0ad922312 100644 --- a/llvm/lib/IR/UseListOrder.cpp +++ b/llvm/lib/IR/UseListOrder.cpp @@ -63,17 +63,20 @@ static void shuffleValueUseLists(Value *V, std::minstd_rand0 &Gen, DEBUG(dbgs() << "V = "; V->dump()); std::uniform_int_distribution<short> Dist(10, 99); SmallDenseMap<const Use *, short, 16> Order; - for (const Use &U : V->uses()) { - auto I = Dist(Gen); - Order[&U] = I; - DEBUG(dbgs() << " - order: " << I << ", op = " << U.getOperandNo() - << ", U = "; - U.getUser()->dump()); - } + auto compareUses = + [&Order](const Use &L, const Use &R) { return Order[&L] < Order[&R]; }; + do { + for (const Use &U : V->uses()) { + auto I = Dist(Gen); + Order[&U] = I; + DEBUG(dbgs() << " - order: " << I << ", op = " << U.getOperandNo() + << ", U = "; + U.getUser()->dump()); + } + } while (std::is_sorted(V->use_begin(), V->use_end(), compareUses)); DEBUG(dbgs() << " => shuffle\n"); - V->sortUseList( - [&Order](const Use &L, const Use &R) { return Order[&L] < Order[&R]; }); + V->sortUseList(compareUses); DEBUG({ for (const Use &U : V->uses()) { |

