Skip to content

Commit 7df1db5

Browse files
committed
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
1 parent 1526278 commit 7df1db5

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

lib/IR/UseListOrder.cpp

+12-9
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,20 @@ static void shuffleValueUseLists(Value *V, std::minstd_rand0 &Gen,
6363
DEBUG(dbgs() << "V = "; V->dump());
6464
std::uniform_int_distribution<short> Dist(10, 99);
6565
SmallDenseMap<const Use *, short, 16> Order;
66-
for (const Use &U : V->uses()) {
67-
auto I = Dist(Gen);
68-
Order[&U] = I;
69-
DEBUG(dbgs() << " - order: " << I << ", op = " << U.getOperandNo()
70-
<< ", U = ";
71-
U.getUser()->dump());
72-
}
66+
auto compareUses =
67+
[&Order](const Use &L, const Use &R) { return Order[&L] < Order[&R]; };
68+
do {
69+
for (const Use &U : V->uses()) {
70+
auto I = Dist(Gen);
71+
Order[&U] = I;
72+
DEBUG(dbgs() << " - order: " << I << ", op = " << U.getOperandNo()
73+
<< ", U = ";
74+
U.getUser()->dump());
75+
}
76+
} while (std::is_sorted(V->use_begin(), V->use_end(), compareUses));
7377

7478
DEBUG(dbgs() << " => shuffle\n");
75-
V->sortUseList(
76-
[&Order](const Use &L, const Use &R) { return Order[&L] < Order[&R]; });
79+
V->sortUseList(compareUses);
7780

7881
DEBUG({
7982
for (const Use &U : V->uses()) {

0 commit comments

Comments
 (0)