diff --git a/llvm/include/llvm/CodeGen/TargetInstrInfo.h b/llvm/include/llvm/CodeGen/TargetInstrInfo.h --- a/llvm/include/llvm/CodeGen/TargetInstrInfo.h +++ b/llvm/include/llvm/CodeGen/TargetInstrInfo.h @@ -1937,6 +1937,10 @@ return Formatter.get(); } + /// Returns the target-specific default value for tail duplication. + /// This value will be used if the tail-dup-size argument is not provided. + virtual unsigned getTailDuplicateSizeOverride() const { return 2; } + private: mutable std::unique_ptr Formatter; unsigned CallFrameSetupOpcode, CallFrameDestroyOpcode; diff --git a/llvm/lib/CodeGen/TailDuplicator.cpp b/llvm/lib/CodeGen/TailDuplicator.cpp --- a/llvm/lib/CodeGen/TailDuplicator.cpp +++ b/llvm/lib/CodeGen/TailDuplicator.cpp @@ -564,12 +564,17 @@ // duplicate only one, because one branch instruction can be eliminated to // compensate for the duplication. unsigned MaxDuplicateCount; + bool OptForSize = MF->getFunction().hasOptSize() || llvm::shouldOptimizeForSize(&TailBB, PSI, MBFI); - if (TailDupSize == 0) - MaxDuplicateCount = TailDuplicateSize; - else + if (TailDupSize == 0) { + if (TailDuplicateSize.getNumOccurrences() > 0) + MaxDuplicateCount = TailDuplicateSize; + else + MaxDuplicateCount = TII->getTailDuplicateSizeOverride(); + } else MaxDuplicateCount = TailDupSize; + if (OptForSize) MaxDuplicateCount = 1;