Tail Duplication: Accept explicit threshold for duplicating.

This will allow tail duplication and tail merging during layout to have a
shared threshold to make sure that they don't overlap. No observable change
intended.

llvm-svn: 278981
This commit is contained in:
Kyle Butt 2016-08-17 21:07:35 +00:00
parent feafec588f
commit db3391ebe0
2 changed files with 13 additions and 5 deletions

View File

@ -34,6 +34,7 @@ class TailDuplicator {
const MachineModuleInfo *MMI;
MachineRegisterInfo *MRI;
bool PreRegAlloc;
unsigned TailDupSize;
// A list of virtual registers for which to update SSA form.
SmallVector<unsigned, 16> SSAUpdateVRs;
@ -45,8 +46,11 @@ class TailDuplicator {
DenseMap<unsigned, AvailableValsTy> SSAUpdateVals;
public:
/// Prepare to run on a specific machine function.
/// @param TailDupSize - Maxmimum size of blocks to tail-duplicate.
void initMF(MachineFunction &MF, const MachineModuleInfo *MMI,
const MachineBranchProbabilityInfo *MBPI);
const MachineBranchProbabilityInfo *MBPI,
unsigned TailDupSize = 0);
bool tailDuplicateBlocks(MachineFunction &MF);
static bool isSimpleBB(MachineBasicBlock *TailBB);
bool shouldTailDuplicate(const MachineFunction &MF, bool IsSimple,

View File

@ -57,12 +57,14 @@ static cl::opt<unsigned> TailDupLimit("tail-dup-limit", cl::init(~0U),
namespace llvm {
void TailDuplicator::initMF(MachineFunction &MF, const MachineModuleInfo *MMIin,
const MachineBranchProbabilityInfo *MBPIin) {
const MachineBranchProbabilityInfo *MBPIin,
unsigned TailDupSizeIn) {
TII = MF.getSubtarget().getInstrInfo();
TRI = MF.getSubtarget().getRegisterInfo();
MRI = &MF.getRegInfo();
MMI = MMIin;
MBPI = MBPIin;
TailDupSize = TailDupSizeIn;
assert(MBPI != nullptr && "Machine Branch Probability Info required");
@ -511,12 +513,14 @@ bool TailDuplicator::shouldTailDuplicate(const MachineFunction &MF,
// duplicate only one, because one branch instruction can be eliminated to
// compensate for the duplication.
unsigned MaxDuplicateCount;
if (TailDuplicateSize.getNumOccurrences() == 0 &&
// FIXME: Use Function::optForSize().
if (TailDupSize == 0 &&
TailDuplicateSize.getNumOccurrences() == 0 &&
MF.getFunction()->optForSize())
MaxDuplicateCount = 1;
else
else if (TailDupSize == 0)
MaxDuplicateCount = TailDuplicateSize;
else
MaxDuplicateCount = TailDupSize;
// If the block to be duplicated ends in an unanalyzable fallthrough, don't
// duplicate it.