1*9880d681SAndroid Build Coastguard Worker //===-- FuncletLayout.cpp - Contiguously lay out funclets -----------------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file implements basic block placement transformations which result in 11*9880d681SAndroid Build Coastguard Worker // funclets being contiguous. 12*9880d681SAndroid Build Coastguard Worker // 13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/Passes.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/Analysis.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunction.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunctionPass.h" 18*9880d681SAndroid Build Coastguard Worker using namespace llvm; 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "funclet-layout" 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker namespace { 23*9880d681SAndroid Build Coastguard Worker class FuncletLayout : public MachineFunctionPass { 24*9880d681SAndroid Build Coastguard Worker public: 25*9880d681SAndroid Build Coastguard Worker static char ID; // Pass identification, replacement for typeid FuncletLayout()26*9880d681SAndroid Build Coastguard Worker FuncletLayout() : MachineFunctionPass(ID) { 27*9880d681SAndroid Build Coastguard Worker initializeFuncletLayoutPass(*PassRegistry::getPassRegistry()); 28*9880d681SAndroid Build Coastguard Worker } 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker bool runOnMachineFunction(MachineFunction &F) override; getRequiredProperties() const31*9880d681SAndroid Build Coastguard Worker MachineFunctionProperties getRequiredProperties() const override { 32*9880d681SAndroid Build Coastguard Worker return MachineFunctionProperties().set( 33*9880d681SAndroid Build Coastguard Worker MachineFunctionProperties::Property::AllVRegsAllocated); 34*9880d681SAndroid Build Coastguard Worker } 35*9880d681SAndroid Build Coastguard Worker }; 36*9880d681SAndroid Build Coastguard Worker } 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker char FuncletLayout::ID = 0; 39*9880d681SAndroid Build Coastguard Worker char &llvm::FuncletLayoutID = FuncletLayout::ID; 40*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS(FuncletLayout, "funclet-layout", 41*9880d681SAndroid Build Coastguard Worker "Contiguously Lay Out Funclets", false, false) 42*9880d681SAndroid Build Coastguard Worker runOnMachineFunction(MachineFunction & F)43*9880d681SAndroid Build Coastguard Workerbool FuncletLayout::runOnMachineFunction(MachineFunction &F) { 44*9880d681SAndroid Build Coastguard Worker DenseMap<const MachineBasicBlock *, int> FuncletMembership = 45*9880d681SAndroid Build Coastguard Worker getFuncletMembership(F); 46*9880d681SAndroid Build Coastguard Worker if (FuncletMembership.empty()) 47*9880d681SAndroid Build Coastguard Worker return false; 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker F.sort([&](MachineBasicBlock &X, MachineBasicBlock &Y) { 50*9880d681SAndroid Build Coastguard Worker auto FuncletX = FuncletMembership.find(&X); 51*9880d681SAndroid Build Coastguard Worker auto FuncletY = FuncletMembership.find(&Y); 52*9880d681SAndroid Build Coastguard Worker assert(FuncletX != FuncletMembership.end()); 53*9880d681SAndroid Build Coastguard Worker assert(FuncletY != FuncletMembership.end()); 54*9880d681SAndroid Build Coastguard Worker return FuncletX->second < FuncletY->second; 55*9880d681SAndroid Build Coastguard Worker }); 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker // Conservatively assume we changed something. 58*9880d681SAndroid Build Coastguard Worker return true; 59*9880d681SAndroid Build Coastguard Worker } 60