mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 05:00:26 +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
|
// 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user