blob: 4307c1524adeb4ec9a5d58ba314e132f944e04e6 [file] [log] [blame]
David Majnemer97890232015-09-17 20:45:18 +00001//===-- FuncletLayout.cpp - Contiguously lay out funclets -----------------===//
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 file implements basic block placement transformations which result in
11// funclets being contiguous.
12//
13//===----------------------------------------------------------------------===//
14#include "llvm/CodeGen/Passes.h"
David Majnemer16193552015-10-04 02:22:52 +000015#include "llvm/CodeGen/Analysis.h"
David Majnemer97890232015-09-17 20:45:18 +000016#include "llvm/CodeGen/MachineFunction.h"
17#include "llvm/CodeGen/MachineFunctionPass.h"
David Majnemer97890232015-09-17 20:45:18 +000018using namespace llvm;
19
20#define DEBUG_TYPE "funclet-layout"
21
22namespace {
23class FuncletLayout : public MachineFunctionPass {
24public:
25 static char ID; // Pass identification, replacement for typeid
26 FuncletLayout() : MachineFunctionPass(ID) {
27 initializeFuncletLayoutPass(*PassRegistry::getPassRegistry());
28 }
29
30 bool runOnMachineFunction(MachineFunction &F) override;
31};
32}
33
David Majnemer97890232015-09-17 20:45:18 +000034char FuncletLayout::ID = 0;
35char &llvm::FuncletLayoutID = FuncletLayout::ID;
36INITIALIZE_PASS(FuncletLayout, "funclet-layout",
37 "Contiguously Lay Out Funclets", false, false)
38
39bool FuncletLayout::runOnMachineFunction(MachineFunction &F) {
David Majnemer16193552015-10-04 02:22:52 +000040 DenseMap<const MachineBasicBlock *, int> FuncletMembership =
41 getFuncletMembership(F);
42 if (FuncletMembership.empty())
David Majnemer97890232015-09-17 20:45:18 +000043 return false;
44
David Majnemer9966fe82015-09-18 08:18:07 +000045 F.sort([&](MachineBasicBlock &x, MachineBasicBlock &y) {
46 return FuncletMembership[&x] < FuncletMembership[&y];
47 });
David Majnemer97890232015-09-17 20:45:18 +000048
49 // Conservatively assume we changed something.
50 return true;
51}