mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 20:59:51 +00:00
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:
parent
a529a37fbd
commit
2d51a4ce8f
@ -141,6 +141,51 @@ void InstrInfoEmitter::EmitOperandInfo(std::ostream &OS,
|
||||
// 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,
|
||||
bool &isStore, bool &isLoad,
|
||||
bool &NeverHasSideEffects) {
|
||||
@ -148,26 +193,11 @@ void InstrInfoEmitter::InferFromPattern(const CodeGenInstruction &Inst,
|
||||
isLoad = Inst.isLoad;
|
||||
NeverHasSideEffects = Inst.neverHasSideEffects;
|
||||
|
||||
const TreePattern *Pattern = CDP.getInstruction(Inst.TheDef).getPattern();
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
InstAnalyzer(CDP, isStore, isLoad, NeverHasSideEffects).Analyze(Inst.TheDef);
|
||||
|
||||
// If the .td file explicitly says there is no side effect, believe it.
|
||||
if (Inst.neverHasSideEffects)
|
||||
NeverHasSideEffects = true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -29,7 +29,7 @@ class CodeGenInstruction;
|
||||
|
||||
class InstrInfoEmitter : public TableGenBackend {
|
||||
RecordKeeper &Records;
|
||||
CodeGenDAGPatterns CDP;
|
||||
const CodeGenDAGPatterns CDP;
|
||||
std::map<std::string, unsigned> ItinClassMap;
|
||||
|
||||
public:
|
||||
|
Loading…
Reference in New Issue
Block a user