blob: 6e8ee9e2634ea86716230d26300eb4a6f23378dd [file] [log] [blame]
Bob Wilson2d4ff122009-11-26 00:32:21 +00001//===-- TailDuplication.cpp - Duplicate blocks into predecessors' tails ---===//
2//
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
Bob Wilson2d4ff122009-11-26 00:32:21 +000015#include "llvm/CodeGen/MachineFunctionPass.h"
Kyle Butt3232dbb2016-04-08 20:35:01 +000016#include "llvm/CodeGen/Passes.h"
17#include "llvm/CodeGen/TailDuplicator.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000018#include "llvm/IR/Function.h"
Bob Wilson2d4ff122009-11-26 00:32:21 +000019#include "llvm/Support/Debug.h"
Bob Wilson2d4ff122009-11-26 00:32:21 +000020using namespace llvm;
21
Chandler Carruth1b9dde02014-04-22 02:02:50 +000022#define DEBUG_TYPE "tailduplication"
23
Bob Wilson2d4ff122009-11-26 00:32:21 +000024namespace {
Kyle Butt3232dbb2016-04-08 20:35:01 +000025/// Perform tail duplication. Delegates to TailDuplicator
26class TailDuplicatePass : public MachineFunctionPass {
27 TailDuplicator Duplicator;
Evan Cheng1bbe6be2009-12-03 08:43:53 +000028
Kyle Butt3232dbb2016-04-08 20:35:01 +000029public:
30 static char ID;
31 explicit TailDuplicatePass() : MachineFunctionPass(ID) {}
Evan Cheng1bbe6be2009-12-03 08:43:53 +000032
Kyle Butt3232dbb2016-04-08 20:35:01 +000033 bool runOnMachineFunction(MachineFunction &MF) override;
Bob Wilson2d4ff122009-11-26 00:32:21 +000034
Kyle Butt3232dbb2016-04-08 20:35:01 +000035 void getAnalysisUsage(AnalysisUsage &AU) const override;
36};
Bob Wilson2d4ff122009-11-26 00:32:21 +000037
Kyle Butt3232dbb2016-04-08 20:35:01 +000038char TailDuplicatePass::ID = 0;
Alexander Kornienkof00654e2015-06-23 09:49:53 +000039}
Bob Wilson2d4ff122009-11-26 00:32:21 +000040
Andrew Trick1fa5bcb2012-02-08 21:23:13 +000041char &llvm::TailDuplicateID = TailDuplicatePass::ID;
42
Kyle Butt3232dbb2016-04-08 20:35:01 +000043INITIALIZE_PASS(TailDuplicatePass, "tailduplication", "Tail Duplication", false,
44 false)
Bob Wilson2d4ff122009-11-26 00:32:21 +000045
Bob Wilson9594db52009-11-26 21:38:41 +000046bool TailDuplicatePass::runOnMachineFunction(MachineFunction &MF) {
Andrew Kayloraa641a52016-04-22 22:06:11 +000047 if (skipFunction(*MF.getFunction()))
Paul Robinson7c99ec52014-03-31 17:43:35 +000048 return false;
49
Kyle Butt3232dbb2016-04-08 20:35:01 +000050 auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
Akira Hatanakaa07ffb52014-02-12 18:09:18 +000051
Kyle Buttc7f1eac2016-08-25 01:37:07 +000052 Duplicator.initMF(MF, MBPI);
Bob Wilson2d4ff122009-11-26 00:32:21 +000053
54 bool MadeChange = false;
Kyle Butt3ed42732016-08-25 01:37:03 +000055 while (Duplicator.tailDuplicateBlocks())
Jakob Stoklund Olesen73ef9552010-01-15 19:59:57 +000056 MadeChange = true;
Bob Wilson2d4ff122009-11-26 00:32:21 +000057
58 return MadeChange;
59}
60
Akira Hatanakaa07ffb52014-02-12 18:09:18 +000061void TailDuplicatePass::getAnalysisUsage(AnalysisUsage &AU) const {
62 AU.addRequired<MachineBranchProbabilityInfo>();
63 MachineFunctionPass::getAnalysisUsage(AU);
64}