mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 07:31:53 +00:00
Add support for the convergent flag at the MC and MachineInstr levels.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238450 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4c9279423e
commit
2f6ca834ff
@ -483,6 +483,13 @@ public:
|
||||
return hasProperty(MCID::NotDuplicable, Type);
|
||||
}
|
||||
|
||||
/// Return true if this instruction is convergent.
|
||||
/// Convergent instructions can only be moved to locations that are
|
||||
/// control-equivalent to their initial position.
|
||||
bool isConvergent(QueryType Type = AnyInBundle) const {
|
||||
return hasProperty(MCID::Convergent, Type);
|
||||
}
|
||||
|
||||
/// Returns true if the specified instruction has a delay slot
|
||||
/// which must be filled by the code generator.
|
||||
bool hasDelaySlot(QueryType Type = AnyInBundle) const {
|
||||
|
@ -125,7 +125,8 @@ enum Flag {
|
||||
ExtraDefRegAllocReq,
|
||||
RegSequence,
|
||||
ExtractSubreg,
|
||||
InsertSubreg
|
||||
InsertSubreg,
|
||||
Convergent
|
||||
};
|
||||
}
|
||||
|
||||
@ -331,6 +332,13 @@ public:
|
||||
/// override accordingly.
|
||||
bool isInsertSubregLike() const { return Flags & (1 << MCID::InsertSubreg); }
|
||||
|
||||
|
||||
/// \brief Return true if this instruction is convergent.
|
||||
///
|
||||
/// Convergent instructions may only be moved to locations that are
|
||||
/// control-equivalent to their original positions.
|
||||
bool isConvergent() const { return Flags & (1 << MCID::Convergent); }
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Side Effect Analysis
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
@ -381,6 +381,7 @@ class Instruction {
|
||||
bit hasPostISelHook = 0; // To be *adjusted* after isel by target hook.
|
||||
bit hasCtrlDep = 0; // Does this instruction r/w ctrl-flow chains?
|
||||
bit isNotDuplicable = 0; // Is it unsafe to duplicate this instruction?
|
||||
bit isConvergent = 0; // Is this instruction convergent?
|
||||
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?
|
||||
|
@ -320,6 +320,7 @@ CodeGenInstruction::CodeGenInstruction(Record *R)
|
||||
isRegSequence = R->getValueAsBit("isRegSequence");
|
||||
isExtractSubreg = R->getValueAsBit("isExtractSubreg");
|
||||
isInsertSubreg = R->getValueAsBit("isInsertSubreg");
|
||||
isConvergent = R->getValueAsBit("isConvergent");
|
||||
|
||||
bool Unset;
|
||||
mayLoad = R->getValueAsBitOrUnset("mayLoad", Unset);
|
||||
|
@ -255,6 +255,7 @@ namespace llvm {
|
||||
bool isRegSequence : 1;
|
||||
bool isExtractSubreg : 1;
|
||||
bool isInsertSubreg : 1;
|
||||
bool isConvergent : 1;
|
||||
|
||||
std::string DeprecatedReason;
|
||||
bool HasComplexDeprecationPredicate;
|
||||
|
@ -479,37 +479,38 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
|
||||
<< SchedModels.getSchedClassIdx(Inst) << ",\t0";
|
||||
|
||||
// Emit all of the target independent flags...
|
||||
if (Inst.isPseudo) OS << "|(1<<MCID::Pseudo)";
|
||||
if (Inst.isReturn) OS << "|(1<<MCID::Return)";
|
||||
if (Inst.isBranch) OS << "|(1<<MCID::Branch)";
|
||||
if (Inst.isIndirectBranch) OS << "|(1<<MCID::IndirectBranch)";
|
||||
if (Inst.isCompare) OS << "|(1<<MCID::Compare)";
|
||||
if (Inst.isMoveImm) OS << "|(1<<MCID::MoveImm)";
|
||||
if (Inst.isBitcast) OS << "|(1<<MCID::Bitcast)";
|
||||
if (Inst.isSelect) OS << "|(1<<MCID::Select)";
|
||||
if (Inst.isBarrier) OS << "|(1<<MCID::Barrier)";
|
||||
if (Inst.hasDelaySlot) OS << "|(1<<MCID::DelaySlot)";
|
||||
if (Inst.isCall) OS << "|(1<<MCID::Call)";
|
||||
if (Inst.canFoldAsLoad) OS << "|(1<<MCID::FoldableAsLoad)";
|
||||
if (Inst.mayLoad) OS << "|(1<<MCID::MayLoad)";
|
||||
if (Inst.mayStore) OS << "|(1<<MCID::MayStore)";
|
||||
if (Inst.isPredicable) OS << "|(1<<MCID::Predicable)";
|
||||
if (Inst.isConvertibleToThreeAddress) OS << "|(1<<MCID::ConvertibleTo3Addr)";
|
||||
if (Inst.isCommutable) OS << "|(1<<MCID::Commutable)";
|
||||
if (Inst.isTerminator) OS << "|(1<<MCID::Terminator)";
|
||||
if (Inst.isReMaterializable) OS << "|(1<<MCID::Rematerializable)";
|
||||
if (Inst.isNotDuplicable) OS << "|(1<<MCID::NotDuplicable)";
|
||||
if (Inst.Operands.hasOptionalDef) OS << "|(1<<MCID::HasOptionalDef)";
|
||||
if (Inst.usesCustomInserter) OS << "|(1<<MCID::UsesCustomInserter)";
|
||||
if (Inst.hasPostISelHook) OS << "|(1<<MCID::HasPostISelHook)";
|
||||
if (Inst.Operands.isVariadic)OS << "|(1<<MCID::Variadic)";
|
||||
if (Inst.hasSideEffects) OS << "|(1<<MCID::UnmodeledSideEffects)";
|
||||
if (Inst.isAsCheapAsAMove) OS << "|(1<<MCID::CheapAsAMove)";
|
||||
if (Inst.hasExtraSrcRegAllocReq) OS << "|(1<<MCID::ExtraSrcRegAllocReq)";
|
||||
if (Inst.hasExtraDefRegAllocReq) OS << "|(1<<MCID::ExtraDefRegAllocReq)";
|
||||
if (Inst.isRegSequence) OS << "|(1<<MCID::RegSequence)";
|
||||
if (Inst.isExtractSubreg) OS << "|(1<<MCID::ExtractSubreg)";
|
||||
if (Inst.isInsertSubreg) OS << "|(1<<MCID::InsertSubreg)";
|
||||
if (Inst.isPseudo) OS << "|(1ULL<<MCID::Pseudo)";
|
||||
if (Inst.isReturn) OS << "|(1ULL<<MCID::Return)";
|
||||
if (Inst.isBranch) OS << "|(1ULL<<MCID::Branch)";
|
||||
if (Inst.isIndirectBranch) OS << "|(1ULL<<MCID::IndirectBranch)";
|
||||
if (Inst.isCompare) OS << "|(1ULL<<MCID::Compare)";
|
||||
if (Inst.isMoveImm) OS << "|(1ULL<<MCID::MoveImm)";
|
||||
if (Inst.isBitcast) OS << "|(1ULL<<MCID::Bitcast)";
|
||||
if (Inst.isSelect) OS << "|(1ULL<<MCID::Select)";
|
||||
if (Inst.isBarrier) OS << "|(1ULL<<MCID::Barrier)";
|
||||
if (Inst.hasDelaySlot) OS << "|(1ULL<<MCID::DelaySlot)";
|
||||
if (Inst.isCall) OS << "|(1ULL<<MCID::Call)";
|
||||
if (Inst.canFoldAsLoad) OS << "|(1ULL<<MCID::FoldableAsLoad)";
|
||||
if (Inst.mayLoad) OS << "|(1ULL<<MCID::MayLoad)";
|
||||
if (Inst.mayStore) OS << "|(1ULL<<MCID::MayStore)";
|
||||
if (Inst.isPredicable) OS << "|(1ULL<<MCID::Predicable)";
|
||||
if (Inst.isConvertibleToThreeAddress) OS << "|(1ULL<<MCID::ConvertibleTo3Addr)";
|
||||
if (Inst.isCommutable) OS << "|(1ULL<<MCID::Commutable)";
|
||||
if (Inst.isTerminator) OS << "|(1ULL<<MCID::Terminator)";
|
||||
if (Inst.isReMaterializable) OS << "|(1ULL<<MCID::Rematerializable)";
|
||||
if (Inst.isNotDuplicable) OS << "|(1ULL<<MCID::NotDuplicable)";
|
||||
if (Inst.Operands.hasOptionalDef) OS << "|(1ULL<<MCID::HasOptionalDef)";
|
||||
if (Inst.usesCustomInserter) OS << "|(1ULL<<MCID::UsesCustomInserter)";
|
||||
if (Inst.hasPostISelHook) OS << "|(1ULL<<MCID::HasPostISelHook)";
|
||||
if (Inst.Operands.isVariadic)OS << "|(1ULL<<MCID::Variadic)";
|
||||
if (Inst.hasSideEffects) OS << "|(1ULL<<MCID::UnmodeledSideEffects)";
|
||||
if (Inst.isAsCheapAsAMove) OS << "|(1ULL<<MCID::CheapAsAMove)";
|
||||
if (Inst.hasExtraSrcRegAllocReq) OS << "|(1ULL<<MCID::ExtraSrcRegAllocReq)";
|
||||
if (Inst.hasExtraDefRegAllocReq) OS << "|(1ULL<<MCID::ExtraDefRegAllocReq)";
|
||||
if (Inst.isRegSequence) OS << "|(1ULL<<MCID::RegSequence)";
|
||||
if (Inst.isExtractSubreg) OS << "|(1ULL<<MCID::ExtractSubreg)";
|
||||
if (Inst.isInsertSubreg) OS << "|(1ULL<<MCID::InsertSubreg)";
|
||||
if (Inst.isConvergent) OS << "|(1ULL<<MCID::Convergent)";
|
||||
|
||||
// Emit all of the target-specific flags...
|
||||
BitsInit *TSF = Inst.TheDef->getValueAsBitsInit("TSFlags");
|
||||
|
Loading…
Reference in New Issue
Block a user