mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-14 22:20:52 +00:00

This is in preparation for tail duplication during block placement. See D18226. This needs to be a utility class for 2 reasons. No passes may run after block placement, and also, tail-duplication affects subsequent layout decisions, so it must be interleaved with placement, and can't be separated out into its own pass. The original pass is still useful, and now runs by delegating to the utility class. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265842 91177308-0d34-0410-b5e6-96231b3b80d8
66 lines
1.9 KiB
C++
66 lines
1.9 KiB
C++
//===-- TailDuplication.cpp - Duplicate blocks into predecessors' tails ---===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This pass duplicates basic blocks ending in unconditional branches into
|
|
// the tails of their predecessors, using the TailDuplicator utility class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
|
#include "llvm/CodeGen/Passes.h"
|
|
#include "llvm/CodeGen/TailDuplicator.h"
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/Support/Debug.h"
|
|
using namespace llvm;
|
|
|
|
#define DEBUG_TYPE "tailduplication"
|
|
|
|
namespace {
|
|
/// Perform tail duplication. Delegates to TailDuplicator
|
|
class TailDuplicatePass : public MachineFunctionPass {
|
|
TailDuplicator Duplicator;
|
|
|
|
public:
|
|
static char ID;
|
|
explicit TailDuplicatePass() : MachineFunctionPass(ID) {}
|
|
|
|
bool runOnMachineFunction(MachineFunction &MF) override;
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
|
};
|
|
|
|
char TailDuplicatePass::ID = 0;
|
|
}
|
|
|
|
char &llvm::TailDuplicateID = TailDuplicatePass::ID;
|
|
|
|
INITIALIZE_PASS(TailDuplicatePass, "tailduplication", "Tail Duplication", false,
|
|
false)
|
|
|
|
bool TailDuplicatePass::runOnMachineFunction(MachineFunction &MF) {
|
|
if (skipOptnoneFunction(*MF.getFunction()))
|
|
return false;
|
|
|
|
auto MMI = getAnalysisIfAvailable<MachineModuleInfo>();
|
|
auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
|
|
|
|
Duplicator.initMF(MF, MMI, MBPI);
|
|
|
|
bool MadeChange = false;
|
|
while (Duplicator.tailDuplicateBlocks(MF))
|
|
MadeChange = true;
|
|
|
|
return MadeChange;
|
|
}
|
|
|
|
void TailDuplicatePass::getAnalysisUsage(AnalysisUsage &AU) const {
|
|
AU.addRequired<MachineBranchProbabilityInfo>();
|
|
MachineFunctionPass::getAnalysisUsage(AU);
|
|
}
|