remove some old hacky code that tried to infer whether a store

occured in a pattern, but failed miserably.  The new code works for
any instruction that has a store in its pattern, including all the 
x86 mem op mem instructions.

The only target-independent code that uses this is branch folding,
so this won't change anything in practice.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45648 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2008-01-06 02:16:26 +00:00
parent a529a37fbd
commit 2d51a4ce8f
2 changed files with 50 additions and 20 deletions

View File

@ -141,6 +141,51 @@ void InstrInfoEmitter::EmitOperandInfo(std::ostream &OS,
// Instruction Analysis // Instruction Analysis
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
class InstAnalyzer {
const CodeGenDAGPatterns &CDP;
bool &isStore;
bool &isLoad;
bool &NeverHasSideEffects;
public:
InstAnalyzer(const CodeGenDAGPatterns &cdp,
bool &isstore, bool &isload, bool &nhse)
: CDP(cdp), isStore(isstore), isLoad(isload), NeverHasSideEffects(nhse) {
}
void Analyze(Record *InstRecord) {
const TreePattern *Pattern = CDP.getInstruction(InstRecord).getPattern();
if (Pattern == 0) return; // No pattern.
// Assume there is no side-effect unless we see one.
// FIXME: Enable this.
//NeverHasSideEffects = true;
// FIXME: Assume only the first tree is the pattern. The others are clobber
// nodes.
AnalyzeNode(Pattern->getTree(0));
}
private:
void AnalyzeNode(const TreePatternNode *N) {
if (N->isLeaf()) {
return;
}
if (N->getOperator()->getName() != "set") {
// Get information about the SDNode for the operator.
const SDNodeInfo &OpInfo = CDP.getSDNodeInfo(N->getOperator());
if (OpInfo.getEnumName() == "ISD::STORE")
isStore = true;
}
for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i)
AnalyzeNode(N->getChild(i));
}
};
void InstrInfoEmitter::InferFromPattern(const CodeGenInstruction &Inst, void InstrInfoEmitter::InferFromPattern(const CodeGenInstruction &Inst,
bool &isStore, bool &isLoad, bool &isStore, bool &isLoad,
bool &NeverHasSideEffects) { bool &NeverHasSideEffects) {
@ -148,26 +193,11 @@ void InstrInfoEmitter::InferFromPattern(const CodeGenInstruction &Inst,
isLoad = Inst.isLoad; isLoad = Inst.isLoad;
NeverHasSideEffects = Inst.neverHasSideEffects; NeverHasSideEffects = Inst.neverHasSideEffects;
const TreePattern *Pattern = CDP.getInstruction(Inst.TheDef).getPattern(); InstAnalyzer(CDP, isStore, isLoad, NeverHasSideEffects).Analyze(Inst.TheDef);
if (Pattern == 0) return; // No pattern.
// FIXME: Change this to use pattern info.
if (dynamic_cast<ListInit*>(Inst.TheDef->getValueInit("Pattern"))) {
ListInit *LI = Inst.TheDef->getValueAsListInit("Pattern");
if (LI && LI->getSize() > 0) {
DagInit *Dag = (DagInit *)LI->getElement(0);
DefInit *OpDef = dynamic_cast<DefInit*>(Dag->getOperator());
if (OpDef) {
Record *Operator = OpDef->getDef();
if (Operator->isSubClassOf("SDNode")) {
const std::string Opcode = Operator->getValueAsString("Opcode");
if (Opcode == "ISD::STORE" || Opcode == "ISD::TRUNCSTORE")
isStore = true;
}
}
}
}
// If the .td file explicitly says there is no side effect, believe it.
if (Inst.neverHasSideEffects)
NeverHasSideEffects = true;
} }

View File

@ -29,7 +29,7 @@ class CodeGenInstruction;
class InstrInfoEmitter : public TableGenBackend { class InstrInfoEmitter : public TableGenBackend {
RecordKeeper &Records; RecordKeeper &Records;
CodeGenDAGPatterns CDP; const CodeGenDAGPatterns CDP;
std::map<std::string, unsigned> ItinClassMap; std::map<std::string, unsigned> ItinClassMap;
public: public: