mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Rework scev-aa's basic computation so that it doesn't depend
on ScalarEvolution successfully folding and preserving range information for both A-B and B-A. Now, if it gets either one, it's sufficient. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@107249 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
204b7cad7a
commit
49bda917db
@ -106,6 +106,12 @@ ScalarEvolutionAliasAnalysis::GetBaseValue(const SCEV *S) {
|
|||||||
AliasAnalysis::AliasResult
|
AliasAnalysis::AliasResult
|
||||||
ScalarEvolutionAliasAnalysis::alias(const Value *A, unsigned ASize,
|
ScalarEvolutionAliasAnalysis::alias(const Value *A, unsigned ASize,
|
||||||
const Value *B, unsigned BSize) {
|
const Value *B, unsigned BSize) {
|
||||||
|
// If either of the memory references is empty, it doesn't matter what the
|
||||||
|
// pointer values are. This allows the code below to ignore this special
|
||||||
|
// case.
|
||||||
|
if (ASize == 0 || BSize == 0)
|
||||||
|
return NoAlias;
|
||||||
|
|
||||||
// This is ScalarEvolutionAliasAnalysis. Get the SCEVs!
|
// This is ScalarEvolutionAliasAnalysis. Get the SCEVs!
|
||||||
const SCEV *AS = SE->getSCEV(const_cast<Value *>(A));
|
const SCEV *AS = SE->getSCEV(const_cast<Value *>(A));
|
||||||
const SCEV *BS = SE->getSCEV(const_cast<Value *>(B));
|
const SCEV *BS = SE->getSCEV(const_cast<Value *>(B));
|
||||||
@ -118,14 +124,32 @@ ScalarEvolutionAliasAnalysis::alias(const Value *A, unsigned ASize,
|
|||||||
if (SE->getEffectiveSCEVType(AS->getType()) ==
|
if (SE->getEffectiveSCEVType(AS->getType()) ==
|
||||||
SE->getEffectiveSCEVType(BS->getType())) {
|
SE->getEffectiveSCEVType(BS->getType())) {
|
||||||
unsigned BitWidth = SE->getTypeSizeInBits(AS->getType());
|
unsigned BitWidth = SE->getTypeSizeInBits(AS->getType());
|
||||||
APInt AI(BitWidth, ASize);
|
APInt ASizeInt(BitWidth, ASize);
|
||||||
|
APInt BSizeInt(BitWidth, BSize);
|
||||||
|
|
||||||
|
// Compute the difference between the two pointers.
|
||||||
const SCEV *BA = SE->getMinusSCEV(BS, AS);
|
const SCEV *BA = SE->getMinusSCEV(BS, AS);
|
||||||
if (AI.ule(SE->getUnsignedRange(BA).getUnsignedMin())) {
|
|
||||||
APInt BI(BitWidth, BSize);
|
// Test whether the difference is known to be great enough that memory of
|
||||||
const SCEV *AB = SE->getMinusSCEV(AS, BS);
|
// the given sizes don't overlap. This assumes that ASizeInt and BSizeInt
|
||||||
if (BI.ule(SE->getUnsignedRange(AB).getUnsignedMin()))
|
// are non-zero, which is special-cased above.
|
||||||
return NoAlias;
|
if (ASizeInt.ule(SE->getUnsignedRange(BA).getUnsignedMin()) &&
|
||||||
}
|
(-BSizeInt).uge(SE->getUnsignedRange(BA).getUnsignedMax()))
|
||||||
|
return NoAlias;
|
||||||
|
|
||||||
|
// Folding the subtraction while preserving range information can be tricky
|
||||||
|
// (because of INT_MIN, etc.); if the prior test failed, swap AS and BS
|
||||||
|
// and try again to see if things fold better that way.
|
||||||
|
|
||||||
|
// Compute the difference between the two pointers.
|
||||||
|
const SCEV *AB = SE->getMinusSCEV(AS, BS);
|
||||||
|
|
||||||
|
// Test whether the difference is known to be great enough that memory of
|
||||||
|
// the given sizes don't overlap. This assumes that ASizeInt and BSizeInt
|
||||||
|
// are non-zero, which is special-cased above.
|
||||||
|
if (BSizeInt.ule(SE->getUnsignedRange(AB).getUnsignedMin()) &&
|
||||||
|
(-ASizeInt).uge(SE->getUnsignedRange(AB).getUnsignedMax()))
|
||||||
|
return NoAlias;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If ScalarEvolution can find an underlying object, form a new query.
|
// If ScalarEvolution can find an underlying object, form a new query.
|
||||||
|
Loading…
Reference in New Issue
Block a user