mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-08 18:31:23 +00:00
do not share old induction variables when this would result in invalid
instructions (that would have to be split later) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35227 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
69cb9b78f1
commit
8e59e163db
@ -875,6 +875,16 @@ public:
|
|||||||
/// scale of the target addressing mode for load / store of the given type.
|
/// scale of the target addressing mode for load / store of the given type.
|
||||||
virtual bool isLegalAddressScale(int64_t S, const Type *Ty) const;
|
virtual bool isLegalAddressScale(int64_t S, const Type *Ty) const;
|
||||||
|
|
||||||
|
/// isLegalAddressScaleAndImm - Return true if S works for IsLegalAddressScale
|
||||||
|
/// and V works for isLegalAddressImmediate _and_ both can be applied
|
||||||
|
/// simultaneously to the same instruction.
|
||||||
|
virtual bool isLegalAddressScaleAndImm(int64_t S, int64_t V,
|
||||||
|
const Type* Ty) const;
|
||||||
|
/// isLegalAddressScaleAndImm - Return true if S works for IsLegalAddressScale
|
||||||
|
/// and GV works for isLegalAddressImmediate _and_ both can be applied
|
||||||
|
/// simultaneously to the same instruction.
|
||||||
|
virtual bool isLegalAddressScaleAndImm(int64_t S, GlobalValue *GV) const;
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// Div utility functions
|
// Div utility functions
|
||||||
//
|
//
|
||||||
|
@ -1958,6 +1958,22 @@ bool TargetLowering::isLegalAddressScale(int64_t S, const Type *Ty) const {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// isLegalAddressScaleAndImm - Return true if S works for IsLegalAddressScale
|
||||||
|
/// and V works for isLegalAddressImmediate _and_ both can be applied
|
||||||
|
/// simultaneously to the same instruction.
|
||||||
|
bool TargetLowering::isLegalAddressScaleAndImm(int64_t S, int64_t V,
|
||||||
|
const Type* Ty) const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// isLegalAddressScaleAndImm - Return true if S works for IsLegalAddressScale
|
||||||
|
/// and GV works for isLegalAddressImmediate _and_ both can be applied
|
||||||
|
/// simultaneously to the same instruction.
|
||||||
|
bool TargetLowering::isLegalAddressScaleAndImm(int64_t S,
|
||||||
|
GlobalValue *GV) const {
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Magic for divide replacement
|
// Magic for divide replacement
|
||||||
|
|
||||||
|
@ -1379,6 +1379,24 @@ bool ARMTargetLowering::isLegalAddressScale(int64_t S, const Type *Ty) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// isLegalAddressScaleAndImm - Return true if S works for IsLegalAddressScale
|
||||||
|
/// and V works for isLegalAddressImmediate _and_ both can be applied
|
||||||
|
/// simultaneously to the same instruction.
|
||||||
|
bool ARMTargetLowering::isLegalAddressScaleAndImm(int64_t S, int64_t V,
|
||||||
|
const Type* Ty) const {
|
||||||
|
if (V == 0)
|
||||||
|
return isLegalAddressScale(S, Ty);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// isLegalAddressScaleAndImm - Return true if S works for IsLegalAddressScale
|
||||||
|
/// and GV works for isLegalAddressImmediate _and_ both can be applied
|
||||||
|
/// simultaneously to the same instruction.
|
||||||
|
bool ARMTargetLowering::isLegalAddressScaleAndImm(int64_t S,
|
||||||
|
GlobalValue *GV) const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool getIndexedAddressParts(SDNode *Ptr, MVT::ValueType VT,
|
static bool getIndexedAddressParts(SDNode *Ptr, MVT::ValueType VT,
|
||||||
bool isSEXTLoad, SDOperand &Base,
|
bool isSEXTLoad, SDOperand &Base,
|
||||||
SDOperand &Offset, bool &isInc,
|
SDOperand &Offset, bool &isInc,
|
||||||
|
@ -100,6 +100,17 @@ namespace llvm {
|
|||||||
/// type.
|
/// type.
|
||||||
virtual bool isLegalAddressScale(int64_t S, const Type *Ty) const;
|
virtual bool isLegalAddressScale(int64_t S, const Type *Ty) const;
|
||||||
|
|
||||||
|
/// isLegalAddressScaleAndImm - Return true if S works for
|
||||||
|
/// IsLegalAddressScale and V works for isLegalAddressImmediate _and_
|
||||||
|
/// both can be applied simultaneously to the same instruction.
|
||||||
|
virtual bool isLegalAddressScaleAndImm(int64_t S, int64_t V,
|
||||||
|
const Type *Ty) const;
|
||||||
|
|
||||||
|
/// isLegalAddressScaleAndImm - Return true if S works for
|
||||||
|
/// IsLegalAddressScale and GV works for isLegalAddressImmediate _and_
|
||||||
|
/// both can be applied simultaneously to the same instruction.
|
||||||
|
virtual bool isLegalAddressScaleAndImm(int64_t S, GlobalValue *GV) const;
|
||||||
|
|
||||||
/// getPreIndexedAddressParts - returns true by value, base pointer and
|
/// getPreIndexedAddressParts - returns true by value, base pointer and
|
||||||
/// offset pointer and addressing mode by reference if the node's address
|
/// offset pointer and addressing mode by reference if the node's address
|
||||||
/// can be legally represented as pre-indexed load / store address.
|
/// can be legally represented as pre-indexed load / store address.
|
||||||
|
@ -883,9 +883,16 @@ static bool isZero(SCEVHandle &V) {
|
|||||||
///
|
///
|
||||||
bool LoopStrengthReduce::ValidStride(int64_t Scale,
|
bool LoopStrengthReduce::ValidStride(int64_t Scale,
|
||||||
const std::vector<BasedUser>& UsersToProcess) {
|
const std::vector<BasedUser>& UsersToProcess) {
|
||||||
for (unsigned i=0, e = UsersToProcess.size(); i!=e; ++i)
|
int64_t Imm;
|
||||||
if (!TLI->isLegalAddressScale(Scale, UsersToProcess[i].Inst->getType()))
|
for (unsigned i=0, e = UsersToProcess.size(); i!=e; ++i) {
|
||||||
|
if (SCEVConstant *SC = dyn_cast<SCEVConstant>(UsersToProcess[i].Imm))
|
||||||
|
Imm = SC->getValue()->getSExtValue();
|
||||||
|
else
|
||||||
|
Imm = 0;
|
||||||
|
if (!TLI->isLegalAddressScaleAndImm(Scale, Imm,
|
||||||
|
UsersToProcess[i].Inst->getType()))
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -968,22 +975,6 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride,
|
|||||||
SCEVHandle CommonExprs =
|
SCEVHandle CommonExprs =
|
||||||
RemoveCommonExpressionsFromUseBases(UsersToProcess);
|
RemoveCommonExpressionsFromUseBases(UsersToProcess);
|
||||||
|
|
||||||
// Check if it is possible to reuse a IV with stride that is factor of this
|
|
||||||
// stride. And the multiple is a number that can be encoded in the scale
|
|
||||||
// field of the target addressing mode.
|
|
||||||
PHINode *NewPHI = NULL;
|
|
||||||
Value *IncV = NULL;
|
|
||||||
IVExpr ReuseIV;
|
|
||||||
unsigned RewriteFactor = CheckForIVReuse(Stride, ReuseIV,
|
|
||||||
CommonExprs->getType(),
|
|
||||||
UsersToProcess);
|
|
||||||
if (RewriteFactor != 0) {
|
|
||||||
DOUT << "BASED ON IV of STRIDE " << *ReuseIV.Stride
|
|
||||||
<< " and BASE " << *ReuseIV.Base << " :\n";
|
|
||||||
NewPHI = ReuseIV.PHI;
|
|
||||||
IncV = ReuseIV.IncV;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next, figure out what we can represent in the immediate fields of
|
// Next, figure out what we can represent in the immediate fields of
|
||||||
// instructions. If we can represent anything there, move it to the imm
|
// instructions. If we can represent anything there, move it to the imm
|
||||||
// fields of the BasedUsers. We do this so that it increases the commonality
|
// fields of the BasedUsers. We do this so that it increases the commonality
|
||||||
@ -1011,6 +1002,23 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if it is possible to reuse a IV with stride that is factor of this
|
||||||
|
// stride. And the multiple is a number that can be encoded in the scale
|
||||||
|
// field of the target addressing mode. And we will have a valid
|
||||||
|
// instruction after this substition, including the immediate field, if any.
|
||||||
|
PHINode *NewPHI = NULL;
|
||||||
|
Value *IncV = NULL;
|
||||||
|
IVExpr ReuseIV;
|
||||||
|
unsigned RewriteFactor = CheckForIVReuse(Stride, ReuseIV,
|
||||||
|
CommonExprs->getType(),
|
||||||
|
UsersToProcess);
|
||||||
|
if (RewriteFactor != 0) {
|
||||||
|
DOUT << "BASED ON IV of STRIDE " << *ReuseIV.Stride
|
||||||
|
<< " and BASE " << *ReuseIV.Base << " :\n";
|
||||||
|
NewPHI = ReuseIV.PHI;
|
||||||
|
IncV = ReuseIV.IncV;
|
||||||
|
}
|
||||||
|
|
||||||
// Now that we know what we need to do, insert the PHI node itself.
|
// Now that we know what we need to do, insert the PHI node itself.
|
||||||
//
|
//
|
||||||
DOUT << "INSERTING IV of STRIDE " << *Stride << " and BASE "
|
DOUT << "INSERTING IV of STRIDE " << *Stride << " and BASE "
|
||||||
|
Loading…
Reference in New Issue
Block a user