summaryrefslogtreecommitdiff
path: root/src/jit/compilerbitsettraits.h
blob: 29881d4c9b575b587123a9007932ecae9b518b0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

#ifndef CompilerBitSetTraits_DEFINED
#define CompilerBitSetTraits_DEFINED 1

#include "bitset.h"
#include "compiler.h"
#include "iallocator.h"
#include "bitsetasshortlong.h"

///////////////////////////////////////////////////////////////////////////////
// 
// CompAllocBitSetTraits: a base class for other BitSet traits classes.
// 
// The classes in this file define "BitSetTraits" arguments to the "BitSetOps" type, ones that assume that
// Compiler* is the "Env" type.
// 
// This class just captures the compiler's allocator as an IAllocator.
//
class CompAllocBitSetTraits
{
public:
    static inline IAllocator* GetAllocator(class Compiler* comp);

#ifdef DEBUG
    static inline IAllocator* GetDebugOnlyAllocator(class Compiler* comp);
#endif // DEBUG
};

///////////////////////////////////////////////////////////////////////////////
// 
// TrackedVarBitSetTraits
// 
// This class is customizes the bit set to represent sets of tracked local vars.
// The size of the bitset is determined by the # of tracked locals (up to some internal
// maximum), and the Compiler* tracks the tracked local epochs.
//
class TrackedVarBitSetTraits: public CompAllocBitSetTraits
{
public:
    static inline unsigned GetSize(Compiler* comp);

    static inline unsigned GetArrSize(Compiler* comp, unsigned elemSize);

    static inline unsigned GetEpoch(class Compiler* comp);

    static inline BitSetSupport::BitSetOpCounter* GetOpCounter(Compiler* comp);
};

///////////////////////////////////////////////////////////////////////////////
// 
// AllVarBitSetTraits
// 
// This class is customizes the bit set to represent sets of all local vars (tracked or not) --
// at least up to some maximum index.  (This index is private to the Compiler, and it is
// the responsibility of the compiler not to use indices >= this maximum.)
// We rely on the fact that variables are never deleted, and therefore use the
// total # of locals as the epoch number (up to the maximum).
//
class AllVarBitSetTraits: public CompAllocBitSetTraits
{
public:
    static inline unsigned GetSize(Compiler* comp);

    static inline unsigned GetArrSize(Compiler* comp, unsigned elemSize);

    static inline unsigned GetEpoch(class Compiler* comp);

    static inline BitSetSupport::BitSetOpCounter* GetOpCounter(Compiler* comp);
};

///////////////////////////////////////////////////////////////////////////////
// 
// BasicBlockBitSetTraits
// 
// This class is customizes the bit set to represent sets of BasicBlocks.
// The size of the bitset is determined by maximum assigned BasicBlock number
// (Compiler::fgBBNumMax) (Note that fgBBcount is not equal to this during inlining,
// when fgBBcount is the number of blocks in the inlined function, but the assigned
// block numbers are higher than the inliner function. fgBBNumMax counts both.
// Thus, if you only care about the inlinee, during inlining, this bit set will waste
// the lower numbered block bits.) The Compiler* tracks the BasicBlock epochs.
//
class BasicBlockBitSetTraits: public CompAllocBitSetTraits
{
public:
    static inline unsigned GetSize(Compiler* comp);

    static inline unsigned GetArrSize(Compiler* comp, unsigned elemSize);

    static inline unsigned GetEpoch(class Compiler* comp);

    static inline BitSetSupport::BitSetOpCounter* GetOpCounter(Compiler* comp);
};

///////////////////////////////////////////////////////////////////////////////
// 
// BitVecTraits
// 
// This class simplifies creation and usage of "ShortLong" bitsets.
//
struct BitVecTraits
{
private:
    unsigned size;
    Compiler* comp;

public:

    BitVecTraits(unsigned size, Compiler* comp)
        : size(size)
        , comp(comp)
    { }

    static inline IAllocator* GetAllocator(BitVecTraits* b);

#ifdef DEBUG
    static inline IAllocator* GetDebugOnlyAllocator(BitVecTraits* b);
#endif // DEBUG

    static inline unsigned GetSize(BitVecTraits* b);

    static inline unsigned GetArrSize(BitVecTraits* b, unsigned elemSize);

    static inline unsigned GetEpoch(BitVecTraits* b);

    static inline BitSetSupport::BitSetOpCounter* GetOpCounter(BitVecTraits* b);
};

#endif // CompilerBitSetTraits_DEFINED