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:
47   ConcreteSortRegion(const T *Unit) : Unit(Unit) {}
48   MachineBasicBlock *getHeader() const override { return Unit->getHeader(); }
49   bool contains(const MachineBasicBlock *MBB) const override {
50     return Unit->contains(MBB);
51   }
52   unsigned getNumBlocks() const override { return Unit->getNumBlocks(); }
53   iterator_range<block_iterator> blocks() const override {
54     return Unit->blocks();
55   }
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:
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