1 //===-- WebAssemblySortRegion.h - WebAssembly Sort SortRegion ----*- C++-*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// \brief This file implements regions used in CFGSort and CFGStackify. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSORTREGION_H 15 #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSORTREGION_H 16 17 #include "llvm/ADT/ArrayRef.h" 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/ADT/iterator_range.h" 20 21 namespace llvm { 22 23 class MachineBasicBlock; 24 class MachineLoop; 25 class MachineLoopInfo; 26 class WebAssemblyException; 27 class WebAssemblyExceptionInfo; 28 29 namespace WebAssembly { 30 31 // Wrapper for loops and exceptions 32 class SortRegion { 33 public: 34 virtual ~SortRegion() = default; 35 virtual MachineBasicBlock *getHeader() const = 0; 36 virtual bool contains(const MachineBasicBlock *MBB) const = 0; 37 virtual unsigned getNumBlocks() const = 0; 38 using block_iterator = typename ArrayRef<MachineBasicBlock *>::const_iterator; 39 virtual iterator_range<block_iterator> blocks() const = 0; 40 virtual bool isLoop() const = 0; 41 }; 42 43 template <typename T> class ConcreteSortRegion : public SortRegion { 44 const T *Unit; 45 46 public: ConcreteSortRegion(const T * Unit)47 ConcreteSortRegion(const T *Unit) : Unit(Unit) {} getHeader()48 MachineBasicBlock *getHeader() const override { return Unit->getHeader(); } contains(const MachineBasicBlock * MBB)49 bool contains(const MachineBasicBlock *MBB) const override { 50 return Unit->contains(MBB); 51 } getNumBlocks()52 unsigned getNumBlocks() const override { return Unit->getNumBlocks(); } blocks()53 iterator_range<block_iterator> blocks() const override { 54 return Unit->blocks(); 55 } isLoop()56 bool isLoop() const override { return false; } 57 }; 58 59 // This class has information of nested SortRegions; this is analogous to what 60 // LoopInfo is for loops. 61 class SortRegionInfo { 62 friend class ConcreteSortRegion<MachineLoopInfo>; 63 friend class ConcreteSortRegion<WebAssemblyException>; 64 65 const MachineLoopInfo &MLI; 66 const WebAssemblyExceptionInfo &WEI; 67 DenseMap<const MachineLoop *, std::unique_ptr<SortRegion>> LoopMap; 68 DenseMap<const WebAssemblyException *, std::unique_ptr<SortRegion>> 69 ExceptionMap; 70 71 public: SortRegionInfo(const MachineLoopInfo & MLI,const WebAssemblyExceptionInfo & WEI)72 SortRegionInfo(const MachineLoopInfo &MLI, 73 const WebAssemblyExceptionInfo &WEI) 74 : MLI(MLI), WEI(WEI) {} 75 76 // Returns a smallest loop or exception that contains MBB 77 const SortRegion *getRegionFor(const MachineBasicBlock *MBB); 78 79 // Return the "bottom" block among all blocks dominated by the region 80 // (MachineLoop or WebAssemblyException) header. This works when the entity is 81 // discontiguous. 82 MachineBasicBlock *getBottom(const SortRegion *R); 83 MachineBasicBlock *getBottom(const MachineLoop *ML); 84 MachineBasicBlock *getBottom(const WebAssemblyException *WE); 85 }; 86 87 } // end namespace WebAssembly 88 89 } // end namespace llvm 90 91 #endif 92