def FeatureUseMISched: SubtargetFeature<"use-misched", "UseMISched", "true",
"Use the MachineScheduler">;
-def FeaturePostRAScheduler : SubtargetFeature<"use-postra-scheduler",
- "UsePostRAScheduler", "true", "Schedule again after register allocation">;
+def FeatureNoPostRASched : SubtargetFeature<"disable-postra-scheduler",
+ "DisablePostRAScheduler", "true",
+ "Don't schedule again after register allocation">;
//===----------------------------------------------------------------------===//
// ARM architecture class
FeatureSlowLoadDSubreg,
FeatureSlowVGETLNi32,
FeatureSlowVDUP32,
- FeatureUseMISched]>;
+ FeatureUseMISched,
+ FeatureNoPostRASched]>;
def : ProcessorModel<"cortex-r4", CortexA8Model, [ARMv7r, ProcR4,
FeatureHasRetAddrStack,
def : ProcessorModel<"cortex-m3", CortexM3Model, [ARMv7m,
ProcM3,
- FeatureHasNoBranchPredictor,
- FeaturePostRAScheduler]>;
+ FeatureHasNoBranchPredictor]>;
def : ProcessorModel<"sc300", CortexM3Model, [ARMv7m,
ProcM3,
FeatureVFP4,
FeatureVFPOnlySP,
FeatureD16,
- FeatureHasNoBranchPredictor,
- FeaturePostRAScheduler]>;
+ FeatureHasNoBranchPredictor]>;
def : ProcNoItin<"cortex-m7", [ARMv7em,
FeatureFPARMv8,
- FeatureD16,
- FeaturePostRAScheduler]>;
+ FeatureD16]>;
def : ProcNoItin<"cortex-m23", [ARMv8mBaseline,
FeatureNoMovt]>;
FeatureFPARMv8,
FeatureD16,
FeatureVFPOnlySP,
- FeatureHasNoBranchPredictor,
- FeaturePostRAScheduler]>;
+ FeatureHasNoBranchPredictor]>;
def : ProcNoItin<"cortex-a32", [ARMv8a,
FeatureHWDivThumb,
FeatureHasSlowFPVMLx,
FeatureCrypto,
FeatureUseMISched,
- FeatureZCZeroing]>;
+ FeatureZCZeroing,
+ FeatureNoPostRASched]>;
def : ProcNoItin<"exynos-m1", [ARMv8a, ProcExynosM1,
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())
+ if (disablePostRAScheduler())
return false;
- return (!isThumb() || hasThumb2());
+ // Don't reschedule potential IT blocks.
+ return !isThumb1Only();
}
bool ARMSubtarget::enableAtomicExpand() const { return hasAnyDataBarrier(); }
/// UseMISched - True if MachineScheduler should be used for this subtarget.
bool UseMISched = false;
- /// UsePostRAScheduler - True if scheduling should happen again after
+ /// DisablePostRAScheduler - False if scheduling should happen again after
/// register allocation.
- bool UsePostRAScheduler = false;
+ bool DisablePostRAScheduler = 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 disablePostRAScheduler() const { return DisablePostRAScheduler; }
bool useSoftFloat() const { return UseSoftFloat; }
bool isThumb() const { return InThumbMode; }
bool isThumb1Only() const { return InThumbMode && !HasThumb2; }