diff --git a/lib/Target/AArch64/AArch64SchedA57.td b/lib/Target/AArch64/AArch64SchedA57.td index 4066db084d1..3ec41578a94 100644 --- a/lib/Target/AArch64/AArch64SchedA57.td +++ b/lib/Target/AArch64/AArch64SchedA57.td @@ -26,6 +26,10 @@ def CortexA57Model : SchedMachineModel { let MicroOpBufferSize = 128; // 128 micro-op re-order buffer let LoadLatency = 4; // Optimistic load latency let MispredictPenalty = 14; // Fetch + Decode/Rename/Dispatch + Branch + + // Enable partial & runtime unrolling. The magic number is chosen based on + // experiments and benchmarking data. + let LoopMicroOpBufferSize = 16; } //===----------------------------------------------------------------------===// diff --git a/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/lib/Target/AArch64/AArch64TargetTransformInfo.cpp index dbdf199a25c..b1a2914236b 100644 --- a/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -128,6 +128,10 @@ public: unsigned getCostOfKeepingLiveOverCall(ArrayRef Tys) const override; + void getUnrollingPreferences(const Function *F, Loop *L, + UnrollingPreferences &UP) const override; + + /// @} }; @@ -544,3 +548,9 @@ unsigned AArch64TTI::getMaxInterleaveFactor() const { return 4; return 2; } + +void AArch64TTI::getUnrollingPreferences(const Function *F, Loop *L, + UnrollingPreferences &UP) const { + // Disable partial & runtime unrolling on -Os. + UP.PartialOptSizeThreshold = 0; +}