summaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-04-28 23:07:49 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-04-28 23:07:49 +0000
commitaf09fb613f354e5fa88d5d41480c6f302f2418e8 (patch)
tree08b4ca0a4dafb64366dc0cfeb9c9745c97a02a9a /lib/Transforms/Scalar
parent07c3167c2bbb30206536c564d8e03311caeb067f (diff)
downloadllvm-af09fb613f354e5fa88d5d41480c6f302f2418e8.tar.gz
llvm-af09fb613f354e5fa88d5d41480c6f302f2418e8.tar.bz2
llvm-af09fb613f354e5fa88d5d41480c6f302f2418e8.tar.xz
Revert r207271 for now. This commit introduced a test case that ran
clang directly from the LLVM test suite! That doesn't work. I've followed up on the review thread to try and get a viable solution sorted out, but trying to get the tree clean here. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207462 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar')
-rw-r--r--lib/Transforms/Scalar/LoopStrengthReduce.cpp21
1 files changed, 9 insertions, 12 deletions
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 13e4fceec6..16a001ad93 100644
--- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -256,7 +256,7 @@ struct Formula {
void InitialMatch(const SCEV *S, Loop *L, ScalarEvolution &SE);
- size_t getNumRegs() const;
+ unsigned getNumRegs() const;
Type *getType() const;
void DeleteBaseReg(const SCEV *&S);
@@ -351,7 +351,7 @@ void Formula::InitialMatch(const SCEV *S, Loop *L, ScalarEvolution &SE) {
/// getNumRegs - Return the total number of register operands used by this
/// formula. This does not include register uses implied by non-constant
/// addrec strides.
-size_t Formula::getNumRegs() const {
+unsigned Formula::getNumRegs() const {
return !!ScaledReg + BaseRegs.size();
}
@@ -4132,22 +4132,19 @@ void LSRInstance::SolveRecurse(SmallVectorImpl<const Formula *> &Solution,
E = LU.Formulae.end(); I != E; ++I) {
const Formula &F = *I;
- // Ignore formulae which may not be ideal in terms of register reuse of
- // ReqRegs. The formula should use all required registers before
- // introducing new ones.
- int NumReqRegsToFind = std::min(F.getNumRegs(), ReqRegs.size());
+ // Ignore formulae which do not use any of the required registers.
+ bool SatisfiedReqReg = true;
for (SmallSetVector<const SCEV *, 4>::const_iterator J = ReqRegs.begin(),
JE = ReqRegs.end(); J != JE; ++J) {
const SCEV *Reg = *J;
- if ((F.ScaledReg && F.ScaledReg == Reg) ||
- std::find(F.BaseRegs.begin(), F.BaseRegs.end(), Reg) !=
+ if ((!F.ScaledReg || F.ScaledReg != Reg) &&
+ std::find(F.BaseRegs.begin(), F.BaseRegs.end(), Reg) ==
F.BaseRegs.end()) {
- --NumReqRegsToFind;
- if (NumReqRegsToFind == 0)
- break;
+ SatisfiedReqReg = false;
+ break;
}
}
- if (NumReqRegsToFind != 0) {
+ if (!SatisfiedReqReg) {
// If none of the formulae satisfied the required registers, then we could
// clear ReqRegs and try again. Currently, we simply give up in this case.
continue;