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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214584 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith
2014-08-01 22:50:04 +00:00
parent 1526278443
commit 7df1db57b3

View File

@@ -63,17 +63,20 @@ static void shuffleValueUseLists(Value *V, std::minstd_rand0 &Gen,
DEBUG(dbgs() << "V = "; V->dump()); DEBUG(dbgs() << "V = "; V->dump());
std::uniform_int_distribution<short> Dist(10, 99); std::uniform_int_distribution<short> Dist(10, 99);
SmallDenseMap<const Use *, short, 16> Order; SmallDenseMap<const Use *, short, 16> Order;
for (const Use &U : V->uses()) { auto compareUses =
auto I = Dist(Gen); [&Order](const Use &L, const Use &R) { return Order[&L] < Order[&R]; };
Order[&U] = I; do {
DEBUG(dbgs() << " - order: " << I << ", op = " << U.getOperandNo() for (const Use &U : V->uses()) {
<< ", U = "; auto I = Dist(Gen);
U.getUser()->dump()); 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"); DEBUG(dbgs() << " => shuffle\n");
V->sortUseList( V->sortUseList(compareUses);
[&Order](const Use &L, const Use &R) { return Order[&L] < Order[&R]; });
DEBUG({ DEBUG({
for (const Use &U : V->uses()) { for (const Use &U : V->uses()) {