| //===-- WebAssemblySortRegion.h - WebAssembly Sort SortRegion ----*- C++-*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// | |
| /// \file | |
| /// \brief This file implements regions used in CFGSort and CFGStackify. | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSORTREGION_H | |
| #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSORTREGION_H | |
| #include "llvm/ADT/ArrayRef.h" | |
| #include "llvm/ADT/DenseMap.h" | |
| #include "llvm/ADT/iterator_range.h" | |
| namespace llvm { | |
| class MachineBasicBlock; | |
| class MachineLoop; | |
| class MachineLoopInfo; | |
| class WebAssemblyException; | |
| class WebAssemblyExceptionInfo; | |
| namespace WebAssembly { | |
| // Wrapper for loops and exceptions | |
| class SortRegion { | |
| public: | |
| virtual ~SortRegion() = default; | |
| virtual MachineBasicBlock *getHeader() const = 0; | |
| virtual bool contains(const MachineBasicBlock *MBB) const = 0; | |
| virtual unsigned getNumBlocks() const = 0; | |
| using block_iterator = ArrayRef<MachineBasicBlock *>::const_iterator; | |
| virtual iterator_range<block_iterator> blocks() const = 0; | |
| virtual bool isLoop() const = 0; | |
| }; | |
| template <typename T> class ConcreteSortRegion : public SortRegion { | |
| const T *Unit; | |
| public: | |
| ConcreteSortRegion(const T *Unit) : Unit(Unit) {} | |
| MachineBasicBlock *getHeader() const override { return Unit->getHeader(); } | |
| bool contains(const MachineBasicBlock *MBB) const override { | |
| return Unit->contains(MBB); | |
| } | |
| unsigned getNumBlocks() const override { return Unit->getNumBlocks(); } | |
| iterator_range<block_iterator> blocks() const override { | |
| return Unit->blocks(); | |
| } | |
| bool isLoop() const override { return false; } | |
| }; | |
| // This class has information of nested SortRegions; this is analogous to what | |
| // LoopInfo is for loops. | |
| class SortRegionInfo { | |
| friend class ConcreteSortRegion<MachineLoopInfo>; | |
| friend class ConcreteSortRegion<WebAssemblyException>; | |
| const MachineLoopInfo &MLI; | |
| const WebAssemblyExceptionInfo &WEI; | |
| DenseMap<const MachineLoop *, std::unique_ptr<SortRegion>> LoopMap; | |
| DenseMap<const WebAssemblyException *, std::unique_ptr<SortRegion>> | |
| ExceptionMap; | |
| public: | |
| SortRegionInfo(const MachineLoopInfo &MLI, | |
| const WebAssemblyExceptionInfo &WEI) | |
| : MLI(MLI), WEI(WEI) {} | |
| // Returns a smallest loop or exception that contains MBB | |
| const SortRegion *getRegionFor(const MachineBasicBlock *MBB); | |
| // Return the "bottom" block among all blocks dominated by the region | |
| // (MachineLoop or WebAssemblyException) header. This works when the entity is | |
| // discontiguous. | |
| MachineBasicBlock *getBottom(const SortRegion *R); | |
| MachineBasicBlock *getBottom(const MachineLoop *ML); | |
| MachineBasicBlock *getBottom(const WebAssemblyException *WE); | |
| }; | |
| } // end namespace WebAssembly | |
| } // end namespace llvm | |
| #endif |