1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-23 21:13:02 +02:00

[JumpThreading] Prevent non-deterministic use lists

Summary:
Unfolding selects was previously done with the help of a vector
of pointers that was then sorted to be able to remove duplicates.
As this sorting depends on the memory addresses, it was
non-deterministic. A SetVector is used now so that duplicates are
removed without the need of sorting first.

Reviewers: mgrang, efriedma

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D26450

llvm-svn: 286807
This commit is contained in:
Pablo Barrio 2016-11-14 10:24:26 +00:00
parent 017185d1ce
commit 70dbdfe526

View File

@ -2042,19 +2042,18 @@ bool JumpThreadingPass::TryToUnfoldSelectInCurrBB(BasicBlock *BB) {
// Look for scalar booleans used in selects as conditions. If there are
// several selects that use the same boolean, they are candidates for jump
// threading and therefore we should unfold them.
for (Value *U : I.users())
if (auto *SI = dyn_cast<SelectInst>(U))
for (Use& U : I.uses()) {
auto *SI = dyn_cast<SelectInst>(U.getUser());
if (SI && U.getOperandNo() == 0)
Selects.push_back(SI);
}
if (Selects.size() <= 1)
continue;
// Remove duplicates
std::sort(Selects.begin(), Selects.end());
auto NewEnd = std::unique(Selects.begin(), Selects.end());
Changed = true;
for (auto SI = Selects.begin(); SI != NewEnd; ++SI)
expandSelect(*SI);
for (auto SI : Selects)
expandSelect(SI);
}
}