blob: 25cd7802264ea22a1f863732a6232199ffe6f70c [file] [log] [blame]
Eugene Zelenko643c0a42017-06-07 23:53:32 +00001//===- TailDuplication.cpp - Duplicate blocks into predecessors' tails ----===//
Bob Wilson15acadd2009-11-26 00:32:21 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Matthias Braun9334f5c2018-01-19 06:08:17 +000010/// \file This pass duplicates basic blocks ending in unconditional branches
11/// into the tails of their predecessors, using the TailDuplicator utility
12/// class.
Bob Wilson15acadd2009-11-26 00:32:21 +000013//
14//===----------------------------------------------------------------------===//
15
Eugene Zelenko643c0a42017-06-07 23:53:32 +000016#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
17#include "llvm/CodeGen/MachineFunction.h"
Bob Wilson15acadd2009-11-26 00:32:21 +000018#include "llvm/CodeGen/MachineFunctionPass.h"
Matthias Braunf09cbb92017-12-13 02:51:01 +000019#include "llvm/CodeGen/MachineRegisterInfo.h"
20#include "llvm/CodeGen/Passes.h"
Kyle Butt31fe4c92016-04-08 20:35:01 +000021#include "llvm/CodeGen/TailDuplicator.h"
Eugene Zelenko643c0a42017-06-07 23:53:32 +000022#include "llvm/Pass.h"
23
Bob Wilson15acadd2009-11-26 00:32:21 +000024using namespace llvm;
25
Chandler Carruth8677f2f2014-04-22 02:02:50 +000026#define DEBUG_TYPE "tailduplication"
27
Bob Wilson15acadd2009-11-26 00:32:21 +000028namespace {
Eugene Zelenko643c0a42017-06-07 23:53:32 +000029
Matthias Braun9334f5c2018-01-19 06:08:17 +000030class TailDuplicateBase : public MachineFunctionPass {
Kyle Butt31fe4c92016-04-08 20:35:01 +000031 TailDuplicator Duplicator;
Matthias Braun9334f5c2018-01-19 06:08:17 +000032 bool PreRegAlloc;
Kyle Butt31fe4c92016-04-08 20:35:01 +000033public:
Matthias Braun9334f5c2018-01-19 06:08:17 +000034 TailDuplicateBase(char &PassID, bool PreRegAlloc)
35 : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}
Evan Cheng111e7622009-12-03 08:43:53 +000036
Kyle Butt31fe4c92016-04-08 20:35:01 +000037 bool runOnMachineFunction(MachineFunction &MF) override;
Bob Wilson15acadd2009-11-26 00:32:21 +000038
Matthias Braun9334f5c2018-01-19 06:08:17 +000039 void getAnalysisUsage(AnalysisUsage &AU) const override {
40 AU.addRequired<MachineBranchProbabilityInfo>();
41 MachineFunctionPass::getAnalysisUsage(AU);
42 }
43};
44
45class TailDuplicate : public TailDuplicateBase {
46public:
47 static char ID;
48 TailDuplicate() : TailDuplicateBase(ID, false) {
49 initializeTailDuplicatePass(*PassRegistry::getPassRegistry());
50 }
51};
52
53class EarlyTailDuplicate : public TailDuplicateBase {
54public:
55 static char ID;
56 EarlyTailDuplicate() : TailDuplicateBase(ID, true) {
57 initializeEarlyTailDuplicatePass(*PassRegistry::getPassRegistry());
58 }
Kyle Butt31fe4c92016-04-08 20:35:01 +000059};
Bob Wilson15acadd2009-11-26 00:32:21 +000060
Eugene Zelenko643c0a42017-06-07 23:53:32 +000061} // end anonymous namespace
62
Matthias Braun9334f5c2018-01-19 06:08:17 +000063char TailDuplicate::ID;
64char EarlyTailDuplicate::ID;
Bob Wilson15acadd2009-11-26 00:32:21 +000065
Matthias Braun9334f5c2018-01-19 06:08:17 +000066char &llvm::TailDuplicateID = TailDuplicate::ID;
67char &llvm::EarlyTailDuplicateID = EarlyTailDuplicate::ID;
Andrew Trick1dd8c852012-02-08 21:23:13 +000068
Matthias Braun9334f5c2018-01-19 06:08:17 +000069INITIALIZE_PASS(TailDuplicate, DEBUG_TYPE, "Tail Duplication", false, false)
70INITIALIZE_PASS(EarlyTailDuplicate, "early-tailduplication",
71 "Early Tail Duplication", false, false)
Bob Wilson15acadd2009-11-26 00:32:21 +000072
Matthias Braun9334f5c2018-01-19 06:08:17 +000073bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) {
Matthias Braund3181392017-12-15 22:22:58 +000074 if (skipFunction(MF.getFunction()))
Paul Robinson5fa58a52014-03-31 17:43:35 +000075 return false;
76
Kyle Butt31fe4c92016-04-08 20:35:01 +000077 auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
Matthias Braun9334f5c2018-01-19 06:08:17 +000078 Duplicator.initMF(MF, PreRegAlloc, MBPI, /*LayoutMode=*/false);
Bob Wilson15acadd2009-11-26 00:32:21 +000079
80 bool MadeChange = false;
Kyle Butt227103b2016-08-25 01:37:03 +000081 while (Duplicator.tailDuplicateBlocks())
Jakob Stoklund Olesen057d5392010-01-15 19:59:57 +000082 MadeChange = true;
Bob Wilson15acadd2009-11-26 00:32:21 +000083
84 return MadeChange;
85}