mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-13 22:58:50 +00:00
Add instruction flags: hasExtraSrcRegAllocReq and hasExtraDefRegAllocReq. When
set, these flags indicate the instructions source / def operands have special register allocation requirement that are not captured in their register classes. Post-allocation passes (e.g. post-alloc scheduler) should not change their allocations. e.g. ARM::LDRD require the two definitions to be allocated even / odd register pair. llvm-svn: 83196
This commit is contained in:
parent
b4e6fce681
commit
8ea3f4a592
@ -203,6 +203,8 @@ class Instruction {
|
||||
bit hasCtrlDep = 0; // Does this instruction r/w ctrl-flow chains?
|
||||
bit isNotDuplicable = 0; // Is it unsafe to duplicate this instruction?
|
||||
bit isAsCheapAsAMove = 0; // As cheap (or cheaper) than a move instruction.
|
||||
bit hasExtraSrcRegAllocReq = 0; // Sources have special regalloc requirement?
|
||||
bit hasExtraDefRegAllocReq = 0; // Defs have special regalloc requirement?
|
||||
|
||||
// Side effect flags - When set, the flags have these meanings:
|
||||
//
|
||||
|
@ -111,7 +111,9 @@ namespace TID {
|
||||
ConvertibleTo3Addr,
|
||||
UsesCustomDAGSchedInserter,
|
||||
Rematerializable,
|
||||
CheapAsAMove
|
||||
CheapAsAMove,
|
||||
ExtraSrcRegAllocReq,
|
||||
ExtraDefRegAllocReq
|
||||
};
|
||||
}
|
||||
|
||||
@ -443,6 +445,26 @@ public:
|
||||
bool isAsCheapAsAMove() const {
|
||||
return Flags & (1 << TID::CheapAsAMove);
|
||||
}
|
||||
|
||||
/// hasExtraSrcRegAllocReq - Returns true if this instruction source operands
|
||||
/// have special register allocation requirements that are not captured by the
|
||||
/// operand register classes. e.g. ARM::STRD's two source registers must be an
|
||||
/// even / odd pair, ARM::STM registers have to be in ascending order.
|
||||
/// Post-register allocation passes should not attempt to change allocations
|
||||
/// for sources of instructions with this flag.
|
||||
bool hasExtraSrcRegAllocReq() const {
|
||||
return Flags & (1 << TID::ExtraSrcRegAllocReq);
|
||||
}
|
||||
|
||||
/// hasExtraDefRegAllocReq - Returns true if this instruction def operands
|
||||
/// have special register allocation requirements that are not captured by the
|
||||
/// operand register classes. e.g. ARM::LDRD's two def registers must be an
|
||||
/// even / odd pair, ARM::LDM registers have to be in ascending order.
|
||||
/// Post-register allocation passes should not attempt to change allocations
|
||||
/// for definitions of instructions with this flag.
|
||||
bool hasExtraDefRegAllocReq() const {
|
||||
return Flags & (1 << TID::ExtraDefRegAllocReq);
|
||||
}
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -101,6 +101,8 @@ CodeGenInstruction::CodeGenInstruction(Record *R, const std::string &AsmStr)
|
||||
mayHaveSideEffects = R->getValueAsBit("mayHaveSideEffects");
|
||||
neverHasSideEffects = R->getValueAsBit("neverHasSideEffects");
|
||||
isAsCheapAsAMove = R->getValueAsBit("isAsCheapAsAMove");
|
||||
hasExtraSrcRegAllocReq = R->getValueAsBit("hasExtraSrcRegAllocReq");
|
||||
hasExtraDefRegAllocReq = R->getValueAsBit("hasExtraDefRegAllocReq");
|
||||
hasOptionalDef = false;
|
||||
isVariadic = false;
|
||||
|
||||
|
@ -106,6 +106,8 @@ namespace llvm {
|
||||
bool mayHaveSideEffects;
|
||||
bool neverHasSideEffects;
|
||||
bool isAsCheapAsAMove;
|
||||
bool hasExtraSrcRegAllocReq;
|
||||
bool hasExtraDefRegAllocReq;
|
||||
|
||||
/// ParseOperandName - Parse an operand name like "$foo" or "$foo.bar",
|
||||
/// where $foo is a whole operand and $foo.bar refers to a suboperand.
|
||||
|
@ -280,6 +280,8 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
|
||||
if (Inst.isVariadic) OS << "|(1<<TID::Variadic)";
|
||||
if (Inst.hasSideEffects) OS << "|(1<<TID::UnmodeledSideEffects)";
|
||||
if (Inst.isAsCheapAsAMove) OS << "|(1<<TID::CheapAsAMove)";
|
||||
if (Inst.hasExtraSrcRegAllocReq) OS << "|(1<<TID::ExtraSrcRegAllocReq)";
|
||||
if (Inst.hasExtraDefRegAllocReq) OS << "|(1<<TID::ExtraDefRegAllocReq)";
|
||||
OS << ", 0";
|
||||
|
||||
// Emit all of the target-specific flags...
|
||||
|
Loading…
Reference in New Issue
Block a user