18dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen//===-------- EdgeBundles.h - Bundles of CFG edges --------------*- c++ -*-===// 28dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// 38dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// The LLVM Compiler Infrastructure 48dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// 58dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source 68dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// License. See LICENSE.TXT for details. 78dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// 88dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 98dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// 108dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// The EdgeBundles analysis forms equivalence classes of CFG edges such that all 118dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// edges leaving a machine basic block are in the same bundle, and all edges 128dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// leaving a basic block are in the same bundle. 138dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen// 148dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 158dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 168dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen#ifndef LLVM_CODEGEN_EDGEBUNDLES_H 178dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen#define LLVM_CODEGEN_EDGEBUNDLES_H 188dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 19f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0cJakob Stoklund Olesen#include "llvm/ADT/ArrayRef.h" 208dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen#include "llvm/ADT/IntEqClasses.h" 2125ad1cc32af8d526eb72893a513a486bc28c5106Benjamin Kramer#include "llvm/ADT/Twine.h" 228dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen#include "llvm/CodeGen/MachineFunctionPass.h" 238dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 248dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesennamespace llvm { 258dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 268dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesenclass EdgeBundles : public MachineFunctionPass { 278dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen const MachineFunction *MF; 288dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 298dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen /// EC - Each edge bundle is an equivalence class. The keys are: 308dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen /// 2*BB->getNumber() -> Ingoing bundle. 318dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen /// 2*BB->getNumber()+1 -> Outgoing bundle. 328dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen IntEqClasses EC; 338dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 34f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0cJakob Stoklund Olesen /// Blocks - Map each bundle to a list of basic block numbers. 35f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0cJakob Stoklund Olesen SmallVector<SmallVector<unsigned, 8>, 4> Blocks; 36f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0cJakob Stoklund Olesen 378dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesenpublic: 388dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen static char ID; 398dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen EdgeBundles() : MachineFunctionPass(ID) {} 408dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 418dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen /// getBundle - Return the ingoing (Out = false) or outgoing (Out = true) 428dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen /// bundle number for basic block #N 438dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen unsigned getBundle(unsigned N, bool Out) const { return EC[2 * N + Out]; } 448dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 45631ee4b89f494a3056c62f84e434e1ecf266bb8aJakob Stoklund Olesen /// getNumBundles - Return the total number of bundles in the CFG. 46631ee4b89f494a3056c62f84e434e1ecf266bb8aJakob Stoklund Olesen unsigned getNumBundles() const { return EC.getNumClasses(); } 47631ee4b89f494a3056c62f84e434e1ecf266bb8aJakob Stoklund Olesen 48f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0cJakob Stoklund Olesen /// getBlocks - Return an array of blocks that are connected to Bundle. 491dc12aa148f0ecb4135fa3e47e7a2ac81ceac394Jakob Stoklund Olesen ArrayRef<unsigned> getBlocks(unsigned Bundle) const { return Blocks[Bundle]; } 50f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0cJakob Stoklund Olesen 518dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen /// getMachineFunction - Return the last machine function computed. 528dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen const MachineFunction *getMachineFunction() const { return MF; } 538dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 548dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen /// view - Visualize the annotated bipartite CFG with Graphviz. 558dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen void view() const; 568dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 578dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesenprivate: 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnMachineFunction(MachineFunction&) override; 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage&) const override; 608dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen}; 618dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 628dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen} // end namespace llvm 638dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen 648dd070edc2209ecfdae49780ec1596b349e2cbd1Jakob Stoklund Olesen#endif 65