From efcb0061df93e0b85236a6b670075cc32cc3c3a0 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Mon, 1 May 2006 09:04:20 +0000 Subject: [PATCH] Mark instructions whose pattern is (store ...) isStore. llvm-svn: 28032 --- utils/TableGen/InstrInfoEmitter.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/utils/TableGen/InstrInfoEmitter.cpp b/utils/TableGen/InstrInfoEmitter.cpp index ad043bdc104..15ca5205cd7 100644 --- a/utils/TableGen/InstrInfoEmitter.cpp +++ b/utils/TableGen/InstrInfoEmitter.cpp @@ -184,6 +184,22 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num, OS << "\",\t" << NumOperands << ", " << ItinClass << ", 0"; + // Try to determine (from the pattern), if the instruction is a store. + bool isStore = false; + if (dynamic_cast(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(Dag->getOperator()); + if (OpDef) { + Record *Operator = OpDef->getDef(); + if (Operator->isSubClassOf("SDNode") && + Operator->getValueAsString("Opcode") == "ISD::STORE") + isStore = true; + } + } + } + // Emit all of the target indepedent flags... if (Inst.isReturn) OS << "|M_RET_FLAG"; if (Inst.isBranch) OS << "|M_BRANCH_FLAG"; @@ -191,7 +207,7 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num, if (Inst.hasDelaySlot) OS << "|M_DELAY_SLOT_FLAG"; if (Inst.isCall) OS << "|M_CALL_FLAG"; if (Inst.isLoad) OS << "|M_LOAD_FLAG"; - if (Inst.isStore) OS << "|M_STORE_FLAG"; + if (Inst.isStore || isStore) OS << "|M_STORE_FLAG"; if (Inst.isTwoAddress) OS << "|M_2_ADDR_FLAG"; if (Inst.isConvertibleToThreeAddress) OS << "|M_CONVERTIBLE_TO_3_ADDR"; if (Inst.isCommutable) OS << "|M_COMMUTABLE";