blob: 131b9a22768e328922a713ad4590718236eabdf7 [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//
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//
10// This pass duplicates basic blocks ending in unconditional branches into
Kyle Butt3232dbb2016-04-08 20:35:01 +000011// the tails of their predecessors, using the TailDuplicator utility 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"
Kyle Butt3232dbb2016-04-08 20:35:01 +000018#include "llvm/CodeGen/TailDuplicator.h"
Eugene Zelenko6ac7a342017-06-07 23:53:32 +000019#include "llvm/Pass.h"
20
Bob Wilson2d4ff122009-11-26 00:32:21 +000021using namespace llvm;
22
Chandler Carruth1b9dde02014-04-22 02:02:50 +000023#define DEBUG_TYPE "tailduplication"
24
Bob Wilson2d4ff122009-11-26 00:32:21 +000025namespace {
Eugene Zelenko6ac7a342017-06-07 23:53:32 +000026
Kyle Butt3232dbb2016-04-08 20:35:01 +000027/// Perform tail duplication. Delegates to TailDuplicator
28class TailDuplicatePass : public MachineFunctionPass {
29 TailDuplicator Duplicator;
Evan Cheng1bbe6be2009-12-03 08:43:53 +000030
Kyle Butt3232dbb2016-04-08 20:35:01 +000031public:
32 static char ID;
Eugene Zelenko6ac7a342017-06-07 23:53:32 +000033
Kyle Butt3232dbb2016-04-08 20:35:01 +000034 explicit TailDuplicatePass() : MachineFunctionPass(ID) {}
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
Kyle Butt3232dbb2016-04-08 20:35:01 +000038 void getAnalysisUsage(AnalysisUsage &AU) const override;
39};
Bob Wilson2d4ff122009-11-26 00:32:21 +000040
Eugene Zelenko6ac7a342017-06-07 23:53:32 +000041} // end anonymous namespace
42
Kyle Butt3232dbb2016-04-08 20:35:01 +000043char TailDuplicatePass::ID = 0;
Bob Wilson2d4ff122009-11-26 00:32:21 +000044
Andrew Trick1fa5bcb2012-02-08 21:23:13 +000045char &llvm::TailDuplicateID = TailDuplicatePass::ID;
46
Matthias Braun1527baa2017-05-25 21:26:32 +000047INITIALIZE_PASS(TailDuplicatePass, DEBUG_TYPE, "Tail Duplication", false, false)
Bob Wilson2d4ff122009-11-26 00:32:21 +000048
Bob Wilson9594db52009-11-26 21:38:41 +000049bool TailDuplicatePass::runOnMachineFunction(MachineFunction &MF) {
Andrew Kayloraa641a52016-04-22 22:06:11 +000050 if (skipFunction(*MF.getFunction()))
Paul Robinson7c99ec52014-03-31 17:43:35 +000051 return false;
52
Kyle Butt3232dbb2016-04-08 20:35:01 +000053 auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
Akira Hatanakaa07ffb52014-02-12 18:09:18 +000054
Matthias Braun8426d132017-08-23 03:17:59 +000055 // TODO: Querying isSSA() to determine pre-/post-regalloc is fragile, better
56 // split this into two passes instead.
57 bool PreRegAlloc = MF.getRegInfo().isSSA();
58 Duplicator.initMF(MF, PreRegAlloc, MBPI, /* LayoutMode */ false);
Bob Wilson2d4ff122009-11-26 00:32:21 +000059
60 bool MadeChange = false;
Kyle Butt3ed42732016-08-25 01:37:03 +000061 while (Duplicator.tailDuplicateBlocks())
Jakob Stoklund Olesen73ef9552010-01-15 19:59:57 +000062 MadeChange = true;
Bob Wilson2d4ff122009-11-26 00:32:21 +000063
64 return MadeChange;
65}
66
Akira Hatanakaa07ffb52014-02-12 18:09:18 +000067void TailDuplicatePass::getAnalysisUsage(AnalysisUsage &AU) const {
68 AU.addRequired<MachineBranchProbabilityInfo>();
69 MachineFunctionPass::getAnalysisUsage(AU);
70}