blob: df1eebf43b2b6be98e2abe71125e725aeb13002e [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"
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
Kyle Butt3232dbb2016-04-08 20:35:01 +000029/// Perform tail duplication. Delegates to TailDuplicator
30class TailDuplicatePass : public MachineFunctionPass {
31 TailDuplicator Duplicator;
Evan Cheng1bbe6be2009-12-03 08:43:53 +000032
Kyle Butt3232dbb2016-04-08 20:35:01 +000033public:
34 static char ID;
Eugene Zelenko6ac7a342017-06-07 23:53:32 +000035
Kyle Butt3232dbb2016-04-08 20:35:01 +000036 explicit TailDuplicatePass() : MachineFunctionPass(ID) {}
Evan Cheng1bbe6be2009-12-03 08:43:53 +000037
Kyle Butt3232dbb2016-04-08 20:35:01 +000038 bool runOnMachineFunction(MachineFunction &MF) override;
Bob Wilson2d4ff122009-11-26 00:32:21 +000039
Kyle Butt3232dbb2016-04-08 20:35:01 +000040 void getAnalysisUsage(AnalysisUsage &AU) const override;
41};
Bob Wilson2d4ff122009-11-26 00:32:21 +000042
Eugene Zelenko6ac7a342017-06-07 23:53:32 +000043} // end anonymous namespace
44
Kyle Butt3232dbb2016-04-08 20:35:01 +000045char TailDuplicatePass::ID = 0;
Bob Wilson2d4ff122009-11-26 00:32:21 +000046
Andrew Trick1fa5bcb2012-02-08 21:23:13 +000047char &llvm::TailDuplicateID = TailDuplicatePass::ID;
48
Matthias Braun1527baa2017-05-25 21:26:32 +000049INITIALIZE_PASS(TailDuplicatePass, DEBUG_TYPE, "Tail Duplication", false, false)
Bob Wilson2d4ff122009-11-26 00:32:21 +000050
Bob Wilson9594db52009-11-26 21:38:41 +000051bool TailDuplicatePass::runOnMachineFunction(MachineFunction &MF) {
Matthias Braunf1caa282017-12-15 22:22:58 +000052 if (skipFunction(MF.getFunction()))
Paul Robinson7c99ec52014-03-31 17:43:35 +000053 return false;
54
Kyle Butt3232dbb2016-04-08 20:35:01 +000055 auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
Akira Hatanakaa07ffb52014-02-12 18:09:18 +000056
Matthias Braun8426d132017-08-23 03:17:59 +000057 // TODO: Querying isSSA() to determine pre-/post-regalloc is fragile, better
58 // split this into two passes instead.
59 bool PreRegAlloc = MF.getRegInfo().isSSA();
60 Duplicator.initMF(MF, PreRegAlloc, MBPI, /* LayoutMode */ false);
Bob Wilson2d4ff122009-11-26 00:32:21 +000061
62 bool MadeChange = false;
Kyle Butt3ed42732016-08-25 01:37:03 +000063 while (Duplicator.tailDuplicateBlocks())
Jakob Stoklund Olesen73ef9552010-01-15 19:59:57 +000064 MadeChange = true;
Bob Wilson2d4ff122009-11-26 00:32:21 +000065
66 return MadeChange;
67}
68
Akira Hatanakaa07ffb52014-02-12 18:09:18 +000069void TailDuplicatePass::getAnalysisUsage(AnalysisUsage &AU) const {
70 AU.addRequired<MachineBranchProbabilityInfo>();
71 MachineFunctionPass::getAnalysisUsage(AU);
72}