Author: void Date: Thu Dec 13 19:48:59 2007 New Revision: 45022 URL: http://llvm.org/viewvc/llvm-project?rev=45022&view=rev Log: Add flags to indicate that there are "never" side effects or that there "may be" side effects for machine instructions.
Modified: llvm/trunk/include/llvm/Target/TargetInstrInfo.h llvm/trunk/lib/Target/Target.td llvm/trunk/utils/TableGen/CodeGenInstruction.h llvm/trunk/utils/TableGen/CodeGenTarget.cpp llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp Modified: llvm/trunk/include/llvm/Target/TargetInstrInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetInstrInfo.h?rev=45022&r1=45021&r2=45022&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetInstrInfo.h (original) +++ llvm/trunk/include/llvm/Target/TargetInstrInfo.h Thu Dec 13 19:48:59 2007 @@ -91,6 +91,18 @@ // ARM instructions which can set condition code if 's' bit is set. const unsigned M_HAS_OPTIONAL_DEF = 1 << 17; +// M_MAY_HAVE_SIDE_EFFECTS - Set if this instruction *might* have side effects, +// e.g. load instructions. Note: This and M_NEVER_HAS_SIDE_EFFECTS are mutually +// exclusive. You can't set both! If neither flag is set, then the instruction +// *always* has side effects. +const unsigned M_MAY_HAVE_SIDE_EFFECTS = 1 << 18; + +// M_NEVER_HAS_SIDE_EFFECTS - Set if this instruction *never* has side effects, +// e.g., xor on X86. Note: This and M_MAY_HAVE_SIDE_EFFECTS are mutually +// exclusive. You can't set both! If neither flag is set, then the instruction +// *always* has side effects. +const unsigned M_NEVER_HAS_SIDE_EFFECTS = 1 << 19; + // Machine operand flags // M_LOOK_UP_PTR_REG_CLASS - Set if this operand is a pointer value and it // requires a callback to look up its register class. Modified: llvm/trunk/lib/Target/Target.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Target.td?rev=45022&r1=45021&r2=45022&view=diff ============================================================================== --- llvm/trunk/lib/Target/Target.td (original) +++ llvm/trunk/lib/Target/Target.td Thu Dec 13 19:48:59 2007 @@ -203,6 +203,11 @@ bit usesCustomDAGSchedInserter = 0; // Pseudo instr needing special help. bit hasCtrlDep = 0; // Does this instruction r/w ctrl-flow chains? bit isNotDuplicable = 0; // Is it unsafe to duplicate this instruction? + + // Side effect flags - If neither of these flags is set, then the instruction + // *always* has side effects. Otherwise, it's one or the other. + bit mayHaveSideEffects = 0; // This instruction *may* have side effects. + bit neverHasSideEffects = 0; // This instruction never has side effects. InstrItinClass Itinerary = NoItinerary;// Execution steps used for scheduling. Modified: llvm/trunk/utils/TableGen/CodeGenInstruction.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenInstruction.h?rev=45022&r1=45021&r2=45022&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CodeGenInstruction.h (original) +++ llvm/trunk/utils/TableGen/CodeGenInstruction.h Thu Dec 13 19:48:59 2007 @@ -104,6 +104,8 @@ bool hasCtrlDep; bool isNotDuplicable; bool hasOptionalDef; + bool mayHaveSideEffects; + bool neverHasSideEffects; /// ParseOperandName - Parse an operand name like "$foo" or "$foo.bar", /// where $foo is a whole operand and $foo.bar refers to a suboperand. Modified: llvm/trunk/utils/TableGen/CodeGenTarget.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenTarget.cpp?rev=45022&r1=45021&r2=45022&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CodeGenTarget.cpp (original) +++ llvm/trunk/utils/TableGen/CodeGenTarget.cpp Thu Dec 13 19:48:59 2007 @@ -395,9 +395,15 @@ usesCustomDAGSchedInserter = R->getValueAsBit("usesCustomDAGSchedInserter"); hasCtrlDep = R->getValueAsBit("hasCtrlDep"); isNotDuplicable = R->getValueAsBit("isNotDuplicable"); + mayHaveSideEffects = R->getValueAsBit("mayHaveSideEffects"); + neverHasSideEffects = R->getValueAsBit("neverHasSideEffects"); hasOptionalDef = false; hasVariableNumberOfOperands = false; - + + if (mayHaveSideEffects && neverHasSideEffects) + throw R->getName() + + ": cannot have both 'mayHaveSideEffects' and 'neverHasSideEffects' set!"; + DagInit *DI; try { DI = R->getValueAsDag("OutOperandList"); Modified: llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp?rev=45022&r1=45021&r2=45022&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp Thu Dec 13 19:48:59 2007 @@ -253,8 +253,9 @@ if (Inst.hasOptionalDef) OS << "|M_HAS_OPTIONAL_DEF"; if (Inst.usesCustomDAGSchedInserter) OS << "|M_USES_CUSTOM_DAG_SCHED_INSERTION"; - if (Inst.hasVariableNumberOfOperands) - OS << "|M_VARIABLE_OPS"; + if (Inst.hasVariableNumberOfOperands) OS << "|M_VARIABLE_OPS"; + if (Inst.mayHaveSideEffects) OS << "|M_MAY_HAVE_SIDE_EFFECTS"; + if (Inst.neverHasSideEffects) OS << "|M_NEVER_HAS_SIDE_EFFECTS"; OS << ", 0"; // Emit all of the target-specific flags... _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits