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:
Chris Lattner
2008-01-08 18:05:21 +00:00
parent e51775dc5e
commit dcc8b4f5d3
4 changed files with 23 additions and 15 deletions

View File

@@ -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.

View File

@@ -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");

View File

@@ -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;

View File

@@ -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)";