blob: ba348b4a9d41b5e86223a3e36d104b7de61600f6 [file] [log] [blame]
Eugene Zelenko6ac7a342017-06-07 23:53:32 +00001//===- TailDuplication.cpp - Duplicate blocks into predecessors' tails ----===//
Bob Wilson2d4ff122009-11-26 00:32:21 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Bob Wilson2d4ff122009-11-26 00:32:21 +00006//
7//===----------------------------------------------------------------------===//
8//
Matthias Braun3ab9fcb2018-01-19 06:08:17 +00009/// \file This pass duplicates basic blocks ending in unconditional branches
10/// into the tails of their predecessors, using the TailDuplicator utility
11/// class.
Bob Wilson2d4ff122009-11-26 00:32:21 +000012//
13//===----------------------------------------------------------------------===//
14
Eugene Zelenko6ac7a342017-06-07 23:53:32 +000015#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
16#include "llvm/CodeGen/MachineFunction.h"
Bob Wilson2d4ff122009-11-26 00:32:21 +000017#include "llvm/CodeGen/MachineFunctionPass.h"
Matthias Braund9847b12017-12-13 02:51:01 +000018#include "llvm/CodeGen/MachineRegisterInfo.h"
19#include "llvm/CodeGen/Passes.h"
Kyle Butt3232dbb2016-04-08 20:35:01 +000020#include "llvm/CodeGen/TailDuplicator.h"
Eugene Zelenko6ac7a342017-06-07 23:53:32 +000021#include "llvm/Pass.h"
22
Bob Wilson2d4ff122009-11-26 00:32:21 +000023using namespace llvm;
24
Chandler Carruth1b9dde02014-04-22 02:02:50 +000025#define DEBUG_TYPE "tailduplication"
26
Bob Wilson2d4ff122009-11-26 00:32:21 +000027namespace {
Eugene Zelenko6ac7a342017-06-07 23:53:32 +000028
Matthias Braun3ab9fcb2018-01-19 06:08:17 +000029class TailDuplicateBase : public MachineFunctionPass {
Kyle Butt3232dbb2016-04-08 20:35:01 +000030 TailDuplicator Duplicator;
Matthias Braun3ab9fcb2018-01-19 06:08:17 +000031 bool PreRegAlloc;
Kyle Butt3232dbb2016-04-08 20:35:01 +000032public:
Matthias Braun3ab9fcb2018-01-19 06:08:17 +000033 TailDuplicateBase(char &PassID, bool PreRegAlloc)
34 : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}
Evan Cheng1bbe6be2009-12-03 08:43:53 +000035
Kyle Butt3232dbb2016-04-08 20:35:01 +000036 bool runOnMachineFunction(MachineFunction &MF) override;
Bob Wilson2d4ff122009-11-26 00:32:21 +000037
Matthias Braun3ab9fcb2018-01-19 06:08:17 +000038 void getAnalysisUsage(AnalysisUsage &AU) const override {
39 AU.addRequired<MachineBranchProbabilityInfo>();
40 MachineFunctionPass::getAnalysisUsage(AU);
41 }
42};
43
44class TailDuplicate : public TailDuplicateBase {
45public:
46 static char ID;
47 TailDuplicate() : TailDuplicateBase(ID, false) {
48 initializeTailDuplicatePass(*PassRegistry::getPassRegistry());
49 }
50};
51
52class EarlyTailDuplicate : public TailDuplicateBase {
53public:
54 static char ID;
55 EarlyTailDuplicate() : TailDuplicateBase(ID, true) {
56 initializeEarlyTailDuplicatePass(*PassRegistry::getPassRegistry());
57 }
Kyle Butt3232dbb2016-04-08 20:35:01 +000058};
Bob Wilson2d4ff122009-11-26 00:32:21 +000059
Eugene Zelenko6ac7a342017-06-07 23:53:32 +000060} // end anonymous namespace
61
Matthias Braun3ab9fcb2018-01-19 06:08:17 +000062char TailDuplicate::ID;
63char EarlyTailDuplicate::ID;
Bob Wilson2d4ff122009-11-26 00:32:21 +000064
Matthias Braun3ab9fcb2018-01-19 06:08:17 +000065char &llvm::TailDuplicateID = TailDuplicate::ID;
66char &llvm::EarlyTailDuplicateID = EarlyTailDuplicate::ID;
Andrew Trick1fa5bcb2012-02-08 21:23:13 +000067
Matthias Braun3ab9fcb2018-01-19 06:08:17 +000068INITIALIZE_PASS(TailDuplicate, DEBUG_TYPE, "Tail Duplication", false, false)
69INITIALIZE_PASS(EarlyTailDuplicate, "early-tailduplication",
70 "Early Tail Duplication", false, false)
Bob Wilson2d4ff122009-11-26 00:32:21 +000071
Matthias Braun3ab9fcb2018-01-19 06:08:17 +000072bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) {
Matthias Braunf1caa282017-12-15 22:22:58 +000073 if (skipFunction(MF.getFunction()))
Paul Robinson7c99ec52014-03-31 17:43:35 +000074 return false;
75
Kyle Butt3232dbb2016-04-08 20:35:01 +000076 auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
Matthias Braun3ab9fcb2018-01-19 06:08:17 +000077 Duplicator.initMF(MF, PreRegAlloc, MBPI, /*LayoutMode=*/false);
Bob Wilson2d4ff122009-11-26 00:32:21 +000078
79 bool MadeChange = false;
Kyle Butt3ed42732016-08-25 01:37:03 +000080 while (Duplicator.tailDuplicateBlocks())
Jakob Stoklund Olesen73ef9552010-01-15 19:59:57 +000081 MadeChange = true;
Bob Wilson2d4ff122009-11-26 00:32:21 +000082
83 return MadeChange;
84}