From: Chandler Carruth Date: Mon, 28 Apr 2014 23:07:49 +0000 (+0000) Subject: Revert r207271 for now. This commit introduced a test case that ran X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=af09fb613f354e5fa88d5d41480c6f302f2418e8;p=oota-llvm.git 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 --- diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 13e4fceec66..16a001ad934 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 &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_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; diff --git a/test/Transforms/LoopStrengthReduce/ARM64/lit.local.cfg b/test/Transforms/LoopStrengthReduce/ARM64/lit.local.cfg index f8162f04c5f..a49957999f0 100644 --- a/test/Transforms/LoopStrengthReduce/ARM64/lit.local.cfg +++ b/test/Transforms/LoopStrengthReduce/ARM64/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll' '.c'] +config.suffixes = ['.ll'] targets = set(config.root.targets_to_build.split()) if not 'ARM64' in targets: diff --git a/test/Transforms/LoopStrengthReduce/ARM64/req-regs.c b/test/Transforms/LoopStrengthReduce/ARM64/req-regs.c deleted file mode 100644 index 0c3c1dd5035..00000000000 --- a/test/Transforms/LoopStrengthReduce/ARM64/req-regs.c +++ /dev/null @@ -1,36 +0,0 @@ -// 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); -}