summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/JumpThreading.cpp
diff options
context:
space:
mode:
authorPablo Barrio <pablo.barrio@arm.com>2016-11-14 10:24:26 +0000
committerPablo Barrio <pablo.barrio@arm.com>2016-11-14 10:24:26 +0000
commit7ce2c5ecaf780314e50796237832900c3d63da5b (patch)
tree4c0bcc040e964319911c912fc968fb11a791da03 /llvm/lib/Transforms/Scalar/JumpThreading.cpp
parenta92d49dabf376ae6db4bb16e2bdd5d6382be6103 (diff)
downloadbcm5719-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.cpp15
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);
}
}
OpenPOWER on IntegriCloud