aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/CodeGen/TailDuplication.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/TailDuplication.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/TailDuplication.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/TailDuplication.cpp b/contrib/llvm-project/llvm/lib/CodeGen/TailDuplication.cpp
new file mode 100644
index 000000000000..bf3d2088e196
--- /dev/null
+++ b/contrib/llvm-project/llvm/lib/CodeGen/TailDuplication.cpp
@@ -0,0 +1,102 @@
+//===- TailDuplication.cpp - Duplicate blocks into predecessors' tails ----===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+/// \file This pass duplicates basic blocks ending in unconditional branches
+/// into the tails of their predecessors, using the TailDuplicator utility
+/// class.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Analysis/ProfileSummaryInfo.h"
+#include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"
+#include "llvm/CodeGen/MBFIWrapper.h"
+#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
+#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/CodeGen/MachineFunctionPass.h"
+#include "llvm/CodeGen/TailDuplicator.h"
+#include "llvm/InitializePasses.h"
+#include "llvm/Pass.h"
+#include "llvm/PassRegistry.h"
+
+using namespace llvm;
+
+#define DEBUG_TYPE "tailduplication"
+
+namespace {
+
+class TailDuplicateBase : public MachineFunctionPass {
+ TailDuplicator Duplicator;
+ std::unique_ptr<MBFIWrapper> MBFIW;
+ bool PreRegAlloc;
+public:
+ TailDuplicateBase(char &PassID, bool PreRegAlloc)
+ : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}
+
+ bool runOnMachineFunction(MachineFunction &MF) override;
+
+ void getAnalysisUsage(AnalysisUsage &AU) const override {
+ AU.addRequired<MachineBranchProbabilityInfo>();
+ AU.addRequired<LazyMachineBlockFrequencyInfoPass>();
+ AU.addRequired<ProfileSummaryInfoWrapperPass>();
+ MachineFunctionPass::getAnalysisUsage(AU);
+ }
+};
+
+class TailDuplicate : public TailDuplicateBase {
+public:
+ static char ID;
+ TailDuplicate() : TailDuplicateBase(ID, false) {
+ initializeTailDuplicatePass(*PassRegistry::getPassRegistry());
+ }
+};
+
+class EarlyTailDuplicate : public TailDuplicateBase {
+public:
+ static char ID;
+ EarlyTailDuplicate() : TailDuplicateBase(ID, true) {
+ initializeEarlyTailDuplicatePass(*PassRegistry::getPassRegistry());
+ }
+
+ MachineFunctionProperties getClearedProperties() const override {
+ return MachineFunctionProperties()
+ .set(MachineFunctionProperties::Property::NoPHIs);
+ }
+};
+
+} // end anonymous namespace
+
+char TailDuplicate::ID;
+char EarlyTailDuplicate::ID;
+
+char &llvm::TailDuplicateID = TailDuplicate::ID;
+char &llvm::EarlyTailDuplicateID = EarlyTailDuplicate::ID;
+
+INITIALIZE_PASS(TailDuplicate, DEBUG_TYPE, "Tail Duplication", false, false)
+INITIALIZE_PASS(EarlyTailDuplicate, "early-tailduplication",
+ "Early Tail Duplication", false, false)
+
+bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) {
+ if (skipFunction(MF.getFunction()))
+ return false;
+
+ auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
+ auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
+ auto *MBFI = (PSI && PSI->hasProfileSummary()) ?
+ &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI() :
+ nullptr;
+ if (MBFI)
+ MBFIW = std::make_unique<MBFIWrapper>(*MBFI);
+ Duplicator.initMF(MF, PreRegAlloc, MBPI, MBFI ? MBFIW.get() : nullptr, PSI,
+ /*LayoutMode=*/false);
+
+ bool MadeChange = false;
+ while (Duplicator.tailDuplicateBlocks())
+ MadeChange = true;
+
+ return MadeChange;
+}