mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 05:22:04 +00:00
Break PseudoSourceValue out of the Value hierarchy. It is now the root of its own tree containing FixedStackPseudoSourceValue (which you can use isa/dyn_cast on) and MipsCallEntry (which you can't). Anything that needs to use either a PseudoSourceValue* and Value* is strongly encouraged to use a MachinePointerInfo instead.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206255 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -98,7 +98,7 @@ static const Value *getUnderlyingObjectFromInt(const Value *V) {
|
||||
/// and adds support for basic ptrtoint+arithmetic+inttoptr sequences.
|
||||
static void getUnderlyingObjects(const Value *V,
|
||||
SmallVectorImpl<Value *> &Objects) {
|
||||
SmallPtrSet<const Value*, 16> Visited;
|
||||
SmallPtrSet<const Value *, 16> Visited;
|
||||
SmallVector<const Value *, 4> Working(1, V);
|
||||
do {
|
||||
V = Working.pop_back_val();
|
||||
@@ -124,7 +124,8 @@ static void getUnderlyingObjects(const Value *V,
|
||||
} while (!Working.empty());
|
||||
}
|
||||
|
||||
typedef SmallVector<PointerIntPair<const Value *, 1, bool>, 4>
|
||||
typedef PointerUnion<const Value *, const PseudoSourceValue *> ValueType;
|
||||
typedef SmallVector<PointerIntPair<ValueType, 1, bool>, 4>
|
||||
UnderlyingObjectsVector;
|
||||
|
||||
/// getUnderlyingObjectsForInstr - If this machine instr has memory reference
|
||||
@@ -134,25 +135,27 @@ static void getUnderlyingObjectsForInstr(const MachineInstr *MI,
|
||||
const MachineFrameInfo *MFI,
|
||||
UnderlyingObjectsVector &Objects) {
|
||||
if (!MI->hasOneMemOperand() ||
|
||||
!(*MI->memoperands_begin())->getValue() ||
|
||||
(!(*MI->memoperands_begin())->getValue() &&
|
||||
!(*MI->memoperands_begin())->getPseudoValue()) ||
|
||||
(*MI->memoperands_begin())->isVolatile())
|
||||
return;
|
||||
|
||||
const Value *V = (*MI->memoperands_begin())->getValue();
|
||||
if (!V)
|
||||
return;
|
||||
|
||||
if (const PseudoSourceValue *PSV = dyn_cast<PseudoSourceValue>(V)) {
|
||||
if (const PseudoSourceValue *PSV =
|
||||
(*MI->memoperands_begin())->getPseudoValue()) {
|
||||
// For now, ignore PseudoSourceValues which may alias LLVM IR values
|
||||
// because the code that uses this function has no way to cope with
|
||||
// such aliases.
|
||||
if (!PSV->isAliased(MFI)) {
|
||||
bool MayAlias = PSV->mayAlias(MFI);
|
||||
Objects.push_back(UnderlyingObjectsVector::value_type(V, MayAlias));
|
||||
Objects.push_back(UnderlyingObjectsVector::value_type(PSV, MayAlias));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const Value *V = (*MI->memoperands_begin())->getValue();
|
||||
if (!V)
|
||||
return;
|
||||
|
||||
SmallVector<Value *, 4> Objs;
|
||||
getUnderlyingObjects(V, Objs);
|
||||
|
||||
@@ -160,8 +163,6 @@ static void getUnderlyingObjectsForInstr(const MachineInstr *MI,
|
||||
I != IE; ++I) {
|
||||
V = *I;
|
||||
|
||||
assert(!isa<PseudoSourceValue>(V) && "Underlying value is a stack slot!");
|
||||
|
||||
if (!isIdentifiedObject(V)) {
|
||||
Objects.clear();
|
||||
return;
|
||||
@@ -477,6 +478,15 @@ static inline bool isUnsafeMemoryObject(MachineInstr *MI,
|
||||
if ((*MI->memoperands_begin())->isVolatile() ||
|
||||
MI->hasUnmodeledSideEffects())
|
||||
return true;
|
||||
|
||||
if ((*MI->memoperands_begin())->getPseudoValue()) {
|
||||
// Similarly to getUnderlyingObjectForInstr:
|
||||
// For now, ignore PseudoSourceValues which may alias LLVM IR values
|
||||
// because the code that uses this function has no way to cope with
|
||||
// such aliases.
|
||||
return true;
|
||||
}
|
||||
|
||||
const Value *V = (*MI->memoperands_begin())->getValue();
|
||||
if (!V)
|
||||
return true;
|
||||
@@ -485,19 +495,8 @@ static inline bool isUnsafeMemoryObject(MachineInstr *MI,
|
||||
getUnderlyingObjects(V, Objs);
|
||||
for (SmallVectorImpl<Value *>::iterator I = Objs.begin(),
|
||||
IE = Objs.end(); I != IE; ++I) {
|
||||
V = *I;
|
||||
|
||||
if (const PseudoSourceValue *PSV = dyn_cast<PseudoSourceValue>(V)) {
|
||||
// Similarly to getUnderlyingObjectForInstr:
|
||||
// For now, ignore PseudoSourceValues which may alias LLVM IR values
|
||||
// because the code that uses this function has no way to cope with
|
||||
// such aliases.
|
||||
if (PSV->isAliased(MFI))
|
||||
return true;
|
||||
}
|
||||
|
||||
// Does this pointer refer to a distinct and identifiable object?
|
||||
if (!isIdentifiedObject(V))
|
||||
if (!isIdentifiedObject(*I))
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -535,6 +534,9 @@ static bool MIsNeedChainEdge(AliasAnalysis *AA, const MachineFrameInfo *MFI,
|
||||
MachineMemOperand *MMOa = *MIa->memoperands_begin();
|
||||
MachineMemOperand *MMOb = *MIb->memoperands_begin();
|
||||
|
||||
if (!MMOa->getValue() || !MMOb->getValue())
|
||||
return true;
|
||||
|
||||
// The following interface to AA is fashioned after DAGCombiner::isAlias
|
||||
// and operates with MachineMemOperand offset with some important
|
||||
// assumptions:
|
||||
@@ -751,8 +753,8 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
||||
// so that they can be given more precise dependencies. We track
|
||||
// separately the known memory locations that may alias and those
|
||||
// that are known not to alias
|
||||
MapVector<const Value *, std::vector<SUnit *> > AliasMemDefs, NonAliasMemDefs;
|
||||
MapVector<const Value *, std::vector<SUnit *> > AliasMemUses, NonAliasMemUses;
|
||||
MapVector<ValueType, std::vector<SUnit *> > AliasMemDefs, NonAliasMemDefs;
|
||||
MapVector<ValueType, std::vector<SUnit *> > AliasMemUses, NonAliasMemUses;
|
||||
std::set<SUnit*> RejectMemNodes;
|
||||
|
||||
// Remove any stale debug info; sometimes BuildSchedGraph is called again
|
||||
@@ -848,13 +850,13 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
||||
if (isGlobalMemoryObject(AA, MI)) {
|
||||
// Be conservative with these and add dependencies on all memory
|
||||
// references, even those that are known to not alias.
|
||||
for (MapVector<const Value *, std::vector<SUnit *> >::iterator I =
|
||||
for (MapVector<ValueType, std::vector<SUnit *> >::iterator I =
|
||||
NonAliasMemDefs.begin(), E = NonAliasMemDefs.end(); I != E; ++I) {
|
||||
for (unsigned i = 0, e = I->second.size(); i != e; ++i) {
|
||||
I->second[i]->addPred(SDep(SU, SDep::Barrier));
|
||||
}
|
||||
}
|
||||
for (MapVector<const Value *, std::vector<SUnit *> >::iterator I =
|
||||
for (MapVector<ValueType, std::vector<SUnit *> >::iterator I =
|
||||
NonAliasMemUses.begin(), E = NonAliasMemUses.end(); I != E; ++I) {
|
||||
for (unsigned i = 0, e = I->second.size(); i != e; ++i) {
|
||||
SDep Dep(SU, SDep::Barrier);
|
||||
@@ -888,12 +890,12 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
||||
for (unsigned k = 0, m = PendingLoads.size(); k != m; ++k)
|
||||
addChainDependency(AAForDep, MFI, SU, PendingLoads[k], RejectMemNodes,
|
||||
TrueMemOrderLatency);
|
||||
for (MapVector<const Value *, std::vector<SUnit *> >::iterator I =
|
||||
for (MapVector<ValueType, std::vector<SUnit *> >::iterator I =
|
||||
AliasMemDefs.begin(), E = AliasMemDefs.end(); I != E; ++I) {
|
||||
for (unsigned i = 0, e = I->second.size(); i != e; ++i)
|
||||
addChainDependency(AAForDep, MFI, SU, I->second[i], RejectMemNodes);
|
||||
}
|
||||
for (MapVector<const Value *, std::vector<SUnit *> >::iterator I =
|
||||
for (MapVector<ValueType, std::vector<SUnit *> >::iterator I =
|
||||
AliasMemUses.begin(), E = AliasMemUses.end(); I != E; ++I) {
|
||||
for (unsigned i = 0, e = I->second.size(); i != e; ++i)
|
||||
addChainDependency(AAForDep, MFI, SU, I->second[i], RejectMemNodes,
|
||||
@@ -916,7 +918,7 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
||||
bool MayAlias = false;
|
||||
for (UnderlyingObjectsVector::iterator K = Objs.begin(), KE = Objs.end();
|
||||
K != KE; ++K) {
|
||||
const Value *V = K->getPointer();
|
||||
ValueType V = K->getPointer();
|
||||
bool ThisMayAlias = K->getInt();
|
||||
if (ThisMayAlias)
|
||||
MayAlias = true;
|
||||
@@ -924,9 +926,9 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
||||
// A store to a specific PseudoSourceValue. Add precise dependencies.
|
||||
// Record the def in MemDefs, first adding a dep if there is
|
||||
// an existing def.
|
||||
MapVector<const Value *, std::vector<SUnit *> >::iterator I =
|
||||
MapVector<ValueType, std::vector<SUnit *> >::iterator I =
|
||||
((ThisMayAlias) ? AliasMemDefs.find(V) : NonAliasMemDefs.find(V));
|
||||
MapVector<const Value *, std::vector<SUnit *> >::iterator IE =
|
||||
MapVector<ValueType, std::vector<SUnit *> >::iterator IE =
|
||||
((ThisMayAlias) ? AliasMemDefs.end() : NonAliasMemDefs.end());
|
||||
if (I != IE) {
|
||||
for (unsigned i = 0, e = I->second.size(); i != e; ++i)
|
||||
@@ -949,9 +951,9 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
||||
}
|
||||
}
|
||||
// Handle the uses in MemUses, if there are any.
|
||||
MapVector<const Value *, std::vector<SUnit *> >::iterator J =
|
||||
MapVector<ValueType, std::vector<SUnit *> >::iterator J =
|
||||
((ThisMayAlias) ? AliasMemUses.find(V) : NonAliasMemUses.find(V));
|
||||
MapVector<const Value *, std::vector<SUnit *> >::iterator JE =
|
||||
MapVector<ValueType, std::vector<SUnit *> >::iterator JE =
|
||||
((ThisMayAlias) ? AliasMemUses.end() : NonAliasMemUses.end());
|
||||
if (J != JE) {
|
||||
for (unsigned i = 0, e = J->second.size(); i != e; ++i)
|
||||
@@ -996,7 +998,7 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
||||
if (Objs.empty()) {
|
||||
// A load with no underlying object. Depend on all
|
||||
// potentially aliasing stores.
|
||||
for (MapVector<const Value *, std::vector<SUnit *> >::iterator I =
|
||||
for (MapVector<ValueType, std::vector<SUnit *> >::iterator I =
|
||||
AliasMemDefs.begin(), E = AliasMemDefs.end(); I != E; ++I)
|
||||
for (unsigned i = 0, e = I->second.size(); i != e; ++i)
|
||||
addChainDependency(AAForDep, MFI, SU, I->second[i],
|
||||
@@ -1010,16 +1012,16 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
||||
|
||||
for (UnderlyingObjectsVector::iterator
|
||||
J = Objs.begin(), JE = Objs.end(); J != JE; ++J) {
|
||||
const Value *V = J->getPointer();
|
||||
ValueType V = J->getPointer();
|
||||
bool ThisMayAlias = J->getInt();
|
||||
|
||||
if (ThisMayAlias)
|
||||
MayAlias = true;
|
||||
|
||||
// A load from a specific PseudoSourceValue. Add precise dependencies.
|
||||
MapVector<const Value *, std::vector<SUnit *> >::iterator I =
|
||||
MapVector<ValueType, std::vector<SUnit *> >::iterator I =
|
||||
((ThisMayAlias) ? AliasMemDefs.find(V) : NonAliasMemDefs.find(V));
|
||||
MapVector<const Value *, std::vector<SUnit *> >::iterator IE =
|
||||
MapVector<ValueType, std::vector<SUnit *> >::iterator IE =
|
||||
((ThisMayAlias) ? AliasMemDefs.end() : NonAliasMemDefs.end());
|
||||
if (I != IE)
|
||||
for (unsigned i = 0, e = I->second.size(); i != e; ++i)
|
||||
|
||||
Reference in New Issue
Block a user