mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-01 00:17:01 +00:00
add a mayLoad property for machine instructions, a correlary to mayStore.
This is currently not set by anything. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45748 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -90,6 +90,7 @@ namespace TID {
|
|||||||
NotDuplicable,
|
NotDuplicable,
|
||||||
DelaySlot,
|
DelaySlot,
|
||||||
SimpleLoad,
|
SimpleLoad,
|
||||||
|
MayLoad,
|
||||||
MayStore,
|
MayStore,
|
||||||
NeverHasSideEffects,
|
NeverHasSideEffects,
|
||||||
MayHaveSideEffects,
|
MayHaveSideEffects,
|
||||||
@@ -308,6 +309,14 @@ public:
|
|||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// Side Effect Analysis
|
// Side Effect Analysis
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
/// mayLoad - Return true if this instruction could possibly read memory.
|
||||||
|
/// Instructions with this flag set are not necessarily simple load
|
||||||
|
/// instructions, they may load a value and modify it, for example.
|
||||||
|
bool mayLoad() const {
|
||||||
|
return Flags & (1 << TID::MayLoad);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// mayStore - Return true if this instruction could possibly modify memory.
|
/// mayStore - Return true if this instruction could possibly modify memory.
|
||||||
/// Instructions with this flag set are not necessarily simple store
|
/// Instructions with this flag set are not necessarily simple store
|
||||||
@@ -317,8 +326,6 @@ public:
|
|||||||
return Flags & (1 << TID::MayStore);
|
return Flags & (1 << TID::MayStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: mayLoad.
|
|
||||||
|
|
||||||
/// hasNoSideEffects - Return true if all instances of this instruction are
|
/// hasNoSideEffects - Return true if all instances of this instruction are
|
||||||
/// guaranteed to have no side effects other than:
|
/// guaranteed to have no side effects other than:
|
||||||
/// 1. The register operands that are def/used by the MachineInstr.
|
/// 1. The register operands that are def/used by the MachineInstr.
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ CodeGenInstruction::CodeGenInstruction(Record *R, const std::string &AsmStr)
|
|||||||
isBarrier = R->getValueAsBit("isBarrier");
|
isBarrier = R->getValueAsBit("isBarrier");
|
||||||
isCall = R->getValueAsBit("isCall");
|
isCall = R->getValueAsBit("isCall");
|
||||||
isSimpleLoad = R->getValueAsBit("isSimpleLoad");
|
isSimpleLoad = R->getValueAsBit("isSimpleLoad");
|
||||||
|
mayLoad = R->getValueAsBit("mayLoad");
|
||||||
mayStore = R->getValueAsBit("mayStore");
|
mayStore = R->getValueAsBit("mayStore");
|
||||||
isImplicitDef= R->getValueAsBit("isImplicitDef");
|
isImplicitDef= R->getValueAsBit("isImplicitDef");
|
||||||
bool isTwoAddress = R->getValueAsBit("isTwoAddress");
|
bool isTwoAddress = R->getValueAsBit("isTwoAddress");
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ namespace llvm {
|
|||||||
bool isBarrier;
|
bool isBarrier;
|
||||||
bool isCall;
|
bool isCall;
|
||||||
bool isSimpleLoad;
|
bool isSimpleLoad;
|
||||||
bool mayStore;
|
bool mayLoad, mayStore;
|
||||||
bool isImplicitDef;
|
bool isImplicitDef;
|
||||||
bool isPredicable;
|
bool isPredicable;
|
||||||
bool isConvertibleToThreeAddress;
|
bool isConvertibleToThreeAddress;
|
||||||
|
|||||||
@@ -144,12 +144,12 @@ void InstrInfoEmitter::EmitOperandInfo(std::ostream &OS,
|
|||||||
class InstAnalyzer {
|
class InstAnalyzer {
|
||||||
const CodeGenDAGPatterns &CDP;
|
const CodeGenDAGPatterns &CDP;
|
||||||
bool &mayStore;
|
bool &mayStore;
|
||||||
bool &isLoad;
|
bool &mayLoad;
|
||||||
bool &NeverHasSideEffects;
|
bool &NeverHasSideEffects;
|
||||||
public:
|
public:
|
||||||
InstAnalyzer(const CodeGenDAGPatterns &cdp,
|
InstAnalyzer(const CodeGenDAGPatterns &cdp,
|
||||||
bool &maystore, bool &isload, bool &nhse)
|
bool &maystore, bool &mayload, bool &nhse)
|
||||||
: CDP(cdp), mayStore(maystore), isLoad(isload), NeverHasSideEffects(nhse) {
|
: CDP(cdp), mayStore(maystore), mayLoad(mayload), NeverHasSideEffects(nhse){
|
||||||
}
|
}
|
||||||
|
|
||||||
void Analyze(Record *InstRecord) {
|
void Analyze(Record *InstRecord) {
|
||||||
@@ -166,9 +166,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void AnalyzeNode(const TreePatternNode *N) {
|
void AnalyzeNode(const TreePatternNode *N) {
|
||||||
if (N->isLeaf()) {
|
if (N->isLeaf())
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (N->getOperator()->getName() != "set") {
|
if (N->getOperator()->getName() != "set") {
|
||||||
// Get information about the SDNode for the operator.
|
// Get information about the SDNode for the operator.
|
||||||
@@ -191,11 +190,11 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
void InstrInfoEmitter::InferFromPattern(const CodeGenInstruction &Inst,
|
void InstrInfoEmitter::InferFromPattern(const CodeGenInstruction &Inst,
|
||||||
bool &mayStore, bool &isLoad,
|
bool &mayStore, bool &mayLoad,
|
||||||
bool &NeverHasSideEffects) {
|
bool &NeverHasSideEffects) {
|
||||||
mayStore = isLoad = NeverHasSideEffects = false;
|
mayStore = mayLoad = NeverHasSideEffects = false;
|
||||||
|
|
||||||
InstAnalyzer(CDP, mayStore, isLoad, NeverHasSideEffects).Analyze(Inst.TheDef);
|
InstAnalyzer(CDP, mayStore, mayLoad,NeverHasSideEffects).Analyze(Inst.TheDef);
|
||||||
|
|
||||||
// InstAnalyzer only correctly analyzes mayStore so far.
|
// InstAnalyzer only correctly analyzes mayStore so far.
|
||||||
if (Inst.mayStore) { // If the .td file explicitly sets mayStore, use it.
|
if (Inst.mayStore) { // If the .td file explicitly sets mayStore, use it.
|
||||||
@@ -210,7 +209,7 @@ void InstrInfoEmitter::InferFromPattern(const CodeGenInstruction &Inst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// These two override everything.
|
// These two override everything.
|
||||||
isLoad = Inst.isSimpleLoad;
|
mayLoad = Inst.mayLoad;
|
||||||
NeverHasSideEffects = Inst.neverHasSideEffects;
|
NeverHasSideEffects = Inst.neverHasSideEffects;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@@ -281,8 +280,8 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
|
|||||||
const OperandInfoMapTy &OpInfo,
|
const OperandInfoMapTy &OpInfo,
|
||||||
std::ostream &OS) {
|
std::ostream &OS) {
|
||||||
// Determine properties of the instruction from its pattern.
|
// Determine properties of the instruction from its pattern.
|
||||||
bool mayStore, isSimpleLoad, NeverHasSideEffects;
|
bool mayStore, mayLoad, NeverHasSideEffects;
|
||||||
InferFromPattern(Inst, mayStore, isSimpleLoad, NeverHasSideEffects);
|
InferFromPattern(Inst, mayStore, mayLoad, NeverHasSideEffects);
|
||||||
|
|
||||||
if (NeverHasSideEffects && Inst.mayHaveSideEffects) {
|
if (NeverHasSideEffects && Inst.mayHaveSideEffects) {
|
||||||
std::cerr << "error: Instruction '" << Inst.TheDef->getName()
|
std::cerr << "error: Instruction '" << Inst.TheDef->getName()
|
||||||
@@ -308,7 +307,8 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
|
|||||||
if (Inst.isBarrier) OS << "|(1<<TID::Barrier)";
|
if (Inst.isBarrier) OS << "|(1<<TID::Barrier)";
|
||||||
if (Inst.hasDelaySlot) OS << "|(1<<TID::DelaySlot)";
|
if (Inst.hasDelaySlot) OS << "|(1<<TID::DelaySlot)";
|
||||||
if (Inst.isCall) OS << "|(1<<TID::Call)";
|
if (Inst.isCall) OS << "|(1<<TID::Call)";
|
||||||
if (isSimpleLoad) OS << "|(1<<TID::SimpleLoad)";
|
if (Inst.isSimpleLoad) OS << "|(1<<TID::SimpleLoad)";
|
||||||
|
if (mayLoad) OS << "|(1<<TID::MayLoad)";
|
||||||
if (mayStore) OS << "|(1<<TID::MayStore)";
|
if (mayStore) OS << "|(1<<TID::MayStore)";
|
||||||
if (Inst.isImplicitDef)OS << "|(1<<TID::ImplicitDef)";
|
if (Inst.isImplicitDef)OS << "|(1<<TID::ImplicitDef)";
|
||||||
if (Inst.isPredicable) OS << "|(1<<TID::Predicable)";
|
if (Inst.isPredicable) OS << "|(1<<TID::Predicable)";
|
||||||
|
|||||||
Reference in New Issue
Block a user