void InitialMatch(const SCEV *S, Loop *L, ScalarEvolution &SE);
- size_t getNumRegs() const;
+ unsigned getNumRegs() const;
Type *getType() const;
void DeleteBaseReg(const SCEV *&S);
/// 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();
}
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;
+++ /dev/null
-// RUN: clang %s -O3 -target arm64-apple-ios -o - -S -mllvm -debug-only=loop-reduce 2>&1| FileCheck %s
-// REQUIRES: asserts
-
-// LSR used to fail here due to a bug in the ReqRegs test. To complicate
-// things, this could only be reproduced with clang because the uses would
-// come out in different order when invoked through llc.
-
-// CHECK: The chosen solution requires
-// CHECK-NOT: No Satisfactory Solution
-
-typedef unsigned long iter_t;
-void use_int(int result);
-
-struct _state {
- int N;
- int M;
- int K;
- double* data;
-};
-void
-do_integer_add(iter_t iterations, void* cookie)
-{
- struct _state *pState = (struct _state*)cookie;
- register int i;
- register int a = pState->N + 57;
-
- while (iterations-- > 0) {
- for (i = 1; i < 1001; ++i) {
- a=a+a+i; a=a+a+i; a=a+a+i; a=a+a+i;
- a=a+a+i; a=a+a+i; a=a+a+i; a=a+a+i;
- a=a+a+i; a=a+a+i;
-
- }
- }
- use_int(a);
-}