blob: d61afad4db5778380d57957647c49574d754e299 [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;
Derek Schuffad154c82016-03-28 17:05:30 +000031 MachineFunctionProperties getRequiredProperties() const override {
32 return MachineFunctionProperties().set(
Matthias Braun1eb47362016-08-25 01:27:13 +000033 MachineFunctionProperties::Property::NoVRegs);
Derek Schuffad154c82016-03-28 17:05:30 +000034 }
David Majnemer97890232015-09-17 20:45:18 +000035};
36}
37
David Majnemer97890232015-09-17 20:45:18 +000038char FuncletLayout::ID = 0;
39char &llvm::FuncletLayoutID = FuncletLayout::ID;
40INITIALIZE_PASS(FuncletLayout, "funclet-layout",
41 "Contiguously Lay Out Funclets", false, false)
42
43bool FuncletLayout::runOnMachineFunction(MachineFunction &F) {
David Majnemer16193552015-10-04 02:22:52 +000044 DenseMap<const MachineBasicBlock *, int> FuncletMembership =
45 getFuncletMembership(F);
46 if (FuncletMembership.empty())
David Majnemer97890232015-09-17 20:45:18 +000047 return false;
48
David Majnemere4f9b092015-10-05 20:09:16 +000049 F.sort([&](MachineBasicBlock &X, MachineBasicBlock &Y) {
50 auto FuncletX = FuncletMembership.find(&X);
51 auto FuncletY = FuncletMembership.find(&Y);
52 assert(FuncletX != FuncletMembership.end());
53 assert(FuncletY != FuncletMembership.end());
54 return FuncletX->second < FuncletY->second;
David Majnemer9966fe82015-09-18 08:18:07 +000055 });
David Majnemer97890232015-09-17 20:45:18 +000056
57 // Conservatively assume we changed something.
58 return true;
59}