12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- //===-- 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 = typename 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
|