mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 16:17:17 +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:
@@ -483,6 +483,13 @@ public:
|
|||||||
return hasProperty(MCID::NotDuplicable, Type);
|
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
|
/// Returns true if the specified instruction has a delay slot
|
||||||
/// which must be filled by the code generator.
|
/// which must be filled by the code generator.
|
||||||
bool hasDelaySlot(QueryType Type = AnyInBundle) const {
|
bool hasDelaySlot(QueryType Type = AnyInBundle) const {
|
||||||
|
@@ -125,7 +125,8 @@ enum Flag {
|
|||||||
ExtraDefRegAllocReq,
|
ExtraDefRegAllocReq,
|
||||||
RegSequence,
|
RegSequence,
|
||||||
ExtractSubreg,
|
ExtractSubreg,
|
||||||
InsertSubreg
|
InsertSubreg,
|
||||||
|
Convergent
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,6 +332,13 @@ public:
|
|||||||
/// override accordingly.
|
/// override accordingly.
|
||||||
bool isInsertSubregLike() const { return Flags & (1 << MCID::InsertSubreg); }
|
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
|
// Side Effect Analysis
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
|
@@ -381,6 +381,7 @@ class Instruction {
|
|||||||
bit hasPostISelHook = 0; // To be *adjusted* after isel by target hook.
|
bit hasPostISelHook = 0; // To be *adjusted* after isel by target hook.
|
||||||
bit hasCtrlDep = 0; // Does this instruction r/w ctrl-flow chains?
|
bit hasCtrlDep = 0; // Does this instruction r/w ctrl-flow chains?
|
||||||
bit isNotDuplicable = 0; // Is it unsafe to duplicate this instruction?
|
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 isAsCheapAsAMove = 0; // As cheap (or cheaper) than a move instruction.
|
||||||
bit hasExtraSrcRegAllocReq = 0; // Sources have special regalloc requirement?
|
bit hasExtraSrcRegAllocReq = 0; // Sources have special regalloc requirement?
|
||||||
bit hasExtraDefRegAllocReq = 0; // Defs have special regalloc requirement?
|
bit hasExtraDefRegAllocReq = 0; // Defs have special regalloc requirement?
|
||||||
|
@@ -320,6 +320,7 @@ CodeGenInstruction::CodeGenInstruction(Record *R)
|
|||||||
isRegSequence = R->getValueAsBit("isRegSequence");
|
isRegSequence = R->getValueAsBit("isRegSequence");
|
||||||
isExtractSubreg = R->getValueAsBit("isExtractSubreg");
|
isExtractSubreg = R->getValueAsBit("isExtractSubreg");
|
||||||
isInsertSubreg = R->getValueAsBit("isInsertSubreg");
|
isInsertSubreg = R->getValueAsBit("isInsertSubreg");
|
||||||
|
isConvergent = R->getValueAsBit("isConvergent");
|
||||||
|
|
||||||
bool Unset;
|
bool Unset;
|
||||||
mayLoad = R->getValueAsBitOrUnset("mayLoad", Unset);
|
mayLoad = R->getValueAsBitOrUnset("mayLoad", Unset);
|
||||||
|
@@ -255,6 +255,7 @@ namespace llvm {
|
|||||||
bool isRegSequence : 1;
|
bool isRegSequence : 1;
|
||||||
bool isExtractSubreg : 1;
|
bool isExtractSubreg : 1;
|
||||||
bool isInsertSubreg : 1;
|
bool isInsertSubreg : 1;
|
||||||
|
bool isConvergent : 1;
|
||||||
|
|
||||||
std::string DeprecatedReason;
|
std::string DeprecatedReason;
|
||||||
bool HasComplexDeprecationPredicate;
|
bool HasComplexDeprecationPredicate;
|
||||||
|
@@ -479,37 +479,38 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
|
|||||||
<< SchedModels.getSchedClassIdx(Inst) << ",\t0";
|
<< SchedModels.getSchedClassIdx(Inst) << ",\t0";
|
||||||
|
|
||||||
// Emit all of the target independent flags...
|
// Emit all of the target independent flags...
|
||||||
if (Inst.isPseudo) OS << "|(1<<MCID::Pseudo)";
|
if (Inst.isPseudo) OS << "|(1ULL<<MCID::Pseudo)";
|
||||||
if (Inst.isReturn) OS << "|(1<<MCID::Return)";
|
if (Inst.isReturn) OS << "|(1ULL<<MCID::Return)";
|
||||||
if (Inst.isBranch) OS << "|(1<<MCID::Branch)";
|
if (Inst.isBranch) OS << "|(1ULL<<MCID::Branch)";
|
||||||
if (Inst.isIndirectBranch) OS << "|(1<<MCID::IndirectBranch)";
|
if (Inst.isIndirectBranch) OS << "|(1ULL<<MCID::IndirectBranch)";
|
||||||
if (Inst.isCompare) OS << "|(1<<MCID::Compare)";
|
if (Inst.isCompare) OS << "|(1ULL<<MCID::Compare)";
|
||||||
if (Inst.isMoveImm) OS << "|(1<<MCID::MoveImm)";
|
if (Inst.isMoveImm) OS << "|(1ULL<<MCID::MoveImm)";
|
||||||
if (Inst.isBitcast) OS << "|(1<<MCID::Bitcast)";
|
if (Inst.isBitcast) OS << "|(1ULL<<MCID::Bitcast)";
|
||||||
if (Inst.isSelect) OS << "|(1<<MCID::Select)";
|
if (Inst.isSelect) OS << "|(1ULL<<MCID::Select)";
|
||||||
if (Inst.isBarrier) OS << "|(1<<MCID::Barrier)";
|
if (Inst.isBarrier) OS << "|(1ULL<<MCID::Barrier)";
|
||||||
if (Inst.hasDelaySlot) OS << "|(1<<MCID::DelaySlot)";
|
if (Inst.hasDelaySlot) OS << "|(1ULL<<MCID::DelaySlot)";
|
||||||
if (Inst.isCall) OS << "|(1<<MCID::Call)";
|
if (Inst.isCall) OS << "|(1ULL<<MCID::Call)";
|
||||||
if (Inst.canFoldAsLoad) OS << "|(1<<MCID::FoldableAsLoad)";
|
if (Inst.canFoldAsLoad) OS << "|(1ULL<<MCID::FoldableAsLoad)";
|
||||||
if (Inst.mayLoad) OS << "|(1<<MCID::MayLoad)";
|
if (Inst.mayLoad) OS << "|(1ULL<<MCID::MayLoad)";
|
||||||
if (Inst.mayStore) OS << "|(1<<MCID::MayStore)";
|
if (Inst.mayStore) OS << "|(1ULL<<MCID::MayStore)";
|
||||||
if (Inst.isPredicable) OS << "|(1<<MCID::Predicable)";
|
if (Inst.isPredicable) OS << "|(1ULL<<MCID::Predicable)";
|
||||||
if (Inst.isConvertibleToThreeAddress) OS << "|(1<<MCID::ConvertibleTo3Addr)";
|
if (Inst.isConvertibleToThreeAddress) OS << "|(1ULL<<MCID::ConvertibleTo3Addr)";
|
||||||
if (Inst.isCommutable) OS << "|(1<<MCID::Commutable)";
|
if (Inst.isCommutable) OS << "|(1ULL<<MCID::Commutable)";
|
||||||
if (Inst.isTerminator) OS << "|(1<<MCID::Terminator)";
|
if (Inst.isTerminator) OS << "|(1ULL<<MCID::Terminator)";
|
||||||
if (Inst.isReMaterializable) OS << "|(1<<MCID::Rematerializable)";
|
if (Inst.isReMaterializable) OS << "|(1ULL<<MCID::Rematerializable)";
|
||||||
if (Inst.isNotDuplicable) OS << "|(1<<MCID::NotDuplicable)";
|
if (Inst.isNotDuplicable) OS << "|(1ULL<<MCID::NotDuplicable)";
|
||||||
if (Inst.Operands.hasOptionalDef) OS << "|(1<<MCID::HasOptionalDef)";
|
if (Inst.Operands.hasOptionalDef) OS << "|(1ULL<<MCID::HasOptionalDef)";
|
||||||
if (Inst.usesCustomInserter) OS << "|(1<<MCID::UsesCustomInserter)";
|
if (Inst.usesCustomInserter) OS << "|(1ULL<<MCID::UsesCustomInserter)";
|
||||||
if (Inst.hasPostISelHook) OS << "|(1<<MCID::HasPostISelHook)";
|
if (Inst.hasPostISelHook) OS << "|(1ULL<<MCID::HasPostISelHook)";
|
||||||
if (Inst.Operands.isVariadic)OS << "|(1<<MCID::Variadic)";
|
if (Inst.Operands.isVariadic)OS << "|(1ULL<<MCID::Variadic)";
|
||||||
if (Inst.hasSideEffects) OS << "|(1<<MCID::UnmodeledSideEffects)";
|
if (Inst.hasSideEffects) OS << "|(1ULL<<MCID::UnmodeledSideEffects)";
|
||||||
if (Inst.isAsCheapAsAMove) OS << "|(1<<MCID::CheapAsAMove)";
|
if (Inst.isAsCheapAsAMove) OS << "|(1ULL<<MCID::CheapAsAMove)";
|
||||||
if (Inst.hasExtraSrcRegAllocReq) OS << "|(1<<MCID::ExtraSrcRegAllocReq)";
|
if (Inst.hasExtraSrcRegAllocReq) OS << "|(1ULL<<MCID::ExtraSrcRegAllocReq)";
|
||||||
if (Inst.hasExtraDefRegAllocReq) OS << "|(1<<MCID::ExtraDefRegAllocReq)";
|
if (Inst.hasExtraDefRegAllocReq) OS << "|(1ULL<<MCID::ExtraDefRegAllocReq)";
|
||||||
if (Inst.isRegSequence) OS << "|(1<<MCID::RegSequence)";
|
if (Inst.isRegSequence) OS << "|(1ULL<<MCID::RegSequence)";
|
||||||
if (Inst.isExtractSubreg) OS << "|(1<<MCID::ExtractSubreg)";
|
if (Inst.isExtractSubreg) OS << "|(1ULL<<MCID::ExtractSubreg)";
|
||||||
if (Inst.isInsertSubreg) OS << "|(1<<MCID::InsertSubreg)";
|
if (Inst.isInsertSubreg) OS << "|(1ULL<<MCID::InsertSubreg)";
|
||||||
|
if (Inst.isConvergent) OS << "|(1ULL<<MCID::Convergent)";
|
||||||
|
|
||||||
// Emit all of the target-specific flags...
|
// Emit all of the target-specific flags...
|
||||||
BitsInit *TSF = Inst.TheDef->getValueAsBitsInit("TSFlags");
|
BitsInit *TSF = Inst.TheDef->getValueAsBitsInit("TSFlags");
|
||||||
|
Reference in New Issue
Block a user