mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-04 02:24:29 +00:00
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
This commit is contained in:
@ -256,7 +256,7 @@ struct Formula {
|
|||||||
|
|
||||||
void InitialMatch(const SCEV *S, Loop *L, ScalarEvolution &SE);
|
void InitialMatch(const SCEV *S, Loop *L, ScalarEvolution &SE);
|
||||||
|
|
||||||
size_t getNumRegs() const;
|
unsigned getNumRegs() const;
|
||||||
Type *getType() const;
|
Type *getType() const;
|
||||||
|
|
||||||
void DeleteBaseReg(const SCEV *&S);
|
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
|
/// getNumRegs - Return the total number of register operands used by this
|
||||||
/// formula. This does not include register uses implied by non-constant
|
/// formula. This does not include register uses implied by non-constant
|
||||||
/// addrec strides.
|
/// addrec strides.
|
||||||
size_t Formula::getNumRegs() const {
|
unsigned Formula::getNumRegs() const {
|
||||||
return !!ScaledReg + BaseRegs.size();
|
return !!ScaledReg + BaseRegs.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4132,22 +4132,19 @@ void LSRInstance::SolveRecurse(SmallVectorImpl<const Formula *> &Solution,
|
|||||||
E = LU.Formulae.end(); I != E; ++I) {
|
E = LU.Formulae.end(); I != E; ++I) {
|
||||||
const Formula &F = *I;
|
const Formula &F = *I;
|
||||||
|
|
||||||
// Ignore formulae which may not be ideal in terms of register reuse of
|
// Ignore formulae which do not use any of the required registers.
|
||||||
// ReqRegs. The formula should use all required registers before
|
bool SatisfiedReqReg = true;
|
||||||
// introducing new ones.
|
|
||||||
int NumReqRegsToFind = std::min(F.getNumRegs(), ReqRegs.size());
|
|
||||||
for (SmallSetVector<const SCEV *, 4>::const_iterator J = ReqRegs.begin(),
|
for (SmallSetVector<const SCEV *, 4>::const_iterator J = ReqRegs.begin(),
|
||||||
JE = ReqRegs.end(); J != JE; ++J) {
|
JE = ReqRegs.end(); J != JE; ++J) {
|
||||||
const SCEV *Reg = *J;
|
const SCEV *Reg = *J;
|
||||||
if ((F.ScaledReg && F.ScaledReg == Reg) ||
|
if ((!F.ScaledReg || F.ScaledReg != Reg) &&
|
||||||
std::find(F.BaseRegs.begin(), F.BaseRegs.end(), Reg) !=
|
std::find(F.BaseRegs.begin(), F.BaseRegs.end(), Reg) ==
|
||||||
F.BaseRegs.end()) {
|
F.BaseRegs.end()) {
|
||||||
--NumReqRegsToFind;
|
SatisfiedReqReg = false;
|
||||||
if (NumReqRegsToFind == 0)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (NumReqRegsToFind != 0) {
|
if (!SatisfiedReqReg) {
|
||||||
// If none of the formulae satisfied the required registers, then we could
|
// 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.
|
// clear ReqRegs and try again. Currently, we simply give up in this case.
|
||||||
continue;
|
continue;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
config.suffixes = ['.ll' '.c']
|
config.suffixes = ['.ll']
|
||||||
|
|
||||||
targets = set(config.root.targets_to_build.split())
|
targets = set(config.root.targets_to_build.split())
|
||||||
if not 'ARM64' in targets:
|
if not 'ARM64' in targets:
|
||||||
|
@ -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);
|
|
||||||
}
|
|
Reference in New Issue
Block a user