def FeatureUseMISched: SubtargetFeature<"use-misched", "UseMISched", "true",
"Use the MachineScheduler">;
+def FeaturePostRAScheduler : SubtargetFeature<"use-postra-scheduler",
+ "UsePostRAScheduler", "true", "Schedule again after register allocation">;
+
//===----------------------------------------------------------------------===//
// ARM architecture class
//
def : ProcessorModel<"cortex-m3", CortexM3Model, [ARMv7m,
ProcM3,
- FeatureHasNoBranchPredictor]>;
+ FeatureHasNoBranchPredictor,
+ FeaturePostRAScheduler]>;
def : ProcessorModel<"sc300", CortexM3Model, [ARMv7m,
ProcM3,
FeatureVFP4,
FeatureVFPOnlySP,
FeatureD16,
- FeatureHasNoBranchPredictor]>;
+ FeatureHasNoBranchPredictor,
+ FeaturePostRAScheduler]>;
def : ProcNoItin<"cortex-m7", [ARMv7em,
FeatureFPARMv8,
- FeatureD16]>;
+ FeatureD16,
+ FeaturePostRAScheduler]>;
def : ProcNoItin<"cortex-m23", [ARMv8mBaseline,
FeatureNoMovt]>;
FeatureFPARMv8,
FeatureD16,
FeatureVFPOnlySP,
- FeatureHasNoBranchPredictor]>;
+ FeatureHasNoBranchPredictor,
+ FeaturePostRAScheduler]>;
def : ProcNoItin<"cortex-a32", [ARMv8a,
FeatureHWDivThumb,
// This overrides the PostRAScheduler bit in the SchedModel for any CPU.
bool ARMSubtarget::enablePostRAScheduler() const {
+ if (usePostRAScheduler())
+ return true;
+ if (SchedModel.PostRAScheduler)
+ return true;
// No need for PostRA scheduling on subtargets where we use the
// MachineScheduler.
if (useMachineScheduler())
/// UseMISched - True if MachineScheduler should be used for this subtarget.
bool UseMISched = false;
+ /// UsePostRAScheduler - True if scheduling should happen again after
+ /// register allocation.
+ bool UsePostRAScheduler = false;
+
/// HasThumb2 - True if Thumb2 instructions are supported.
bool HasThumb2 = false;
bool isRWPI() const;
bool useMachineScheduler() const { return UseMISched; }
+ bool usePostRAScheduler() const { return UsePostRAScheduler; }
bool useSoftFloat() const { return UseSoftFloat; }
bool isThumb() const { return InThumbMode; }
bool isThumb1Only() const { return InThumbMode && !HasThumb2; }