diff options
author | Pablo Barrio <pablo.barrio@arm.com> | 2016-11-14 10:24:26 +0000 |
---|---|---|
committer | Pablo Barrio <pablo.barrio@arm.com> | 2016-11-14 10:24:26 +0000 |
commit | 7ce2c5ecaf780314e50796237832900c3d63da5b (patch) | |
tree | 4c0bcc040e964319911c912fc968fb11a791da03 /llvm/lib/Transforms/Scalar/JumpThreading.cpp | |
parent | a92d49dabf376ae6db4bb16e2bdd5d6382be6103 (diff) | |
download | bcm5719-llvm-7ce2c5ecaf780314e50796237832900c3d63da5b.tar.gz bcm5719-llvm-7ce2c5ecaf780314e50796237832900c3d63da5b.zip |
[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
Diffstat (limited to 'llvm/lib/Transforms/Scalar/JumpThreading.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/JumpThreading.cpp | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp index 05ac11fc376..c37659b01f7 100644 --- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -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); } } |