diff options
Diffstat (limited to 'src/jit/valuenumtype.h')
-rw-r--r-- | src/jit/valuenumtype.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/jit/valuenumtype.h b/src/jit/valuenumtype.h new file mode 100644 index 0000000000..f898d87532 --- /dev/null +++ b/src/jit/valuenumtype.h @@ -0,0 +1,101 @@ +// 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. + +// Defines the type "ValueNum". + +// This file exists only to break an include file cycle -- had been in ValueNum.h. But that +// file wanted to include gentree.h to get GT_COUNT, and gentree.h wanted ton include ValueNum.h to +// the ValueNum type. + +/*****************************************************************************/ +#ifndef _VALUENUMTYPE_H_ +#define _VALUENUMTYPE_H_ +/*****************************************************************************/ + +// We will represent ValueNum's as unsigned integers. +typedef UINT32 ValueNum; + +// There are two "kinds" of value numbers, which differ in their modeling of the actions of other threads. +// "Liberal" value numbers assume that the other threads change contents of heap locations only at +// synchronization points. Liberal VNs are appropriate, for example, in identifying CSE opportunities. +// "Conservative" value numbers assume that the contents of heap locations change arbitrarily between +// every two accesses. Conservative VNs are appropriate, for example, in assertion prop, where an observation +// of a property of the value in some storage location is used to perform an optimization downstream on +// an operation involving the contents of that storage location. If other threads may modify the storage +// location between the two accesses, the observed property may no longer hold -- and conservative VNs make +// it clear that the values need not be the same. +// +enum ValueNumKind +{ + VNK_Liberal, + VNK_Conservative +}; + +struct ValueNumPair +{ +private: + ValueNum m_liberal; + ValueNum m_conservative; + +public: + ValueNum GetLiberal() const + { + return m_liberal; + } + void SetLiberal(ValueNum vn) + { + m_liberal = vn; + } + ValueNum GetConservative() const + { + return m_conservative; + } + void SetConservative(ValueNum vn) + { + m_conservative = vn; + } + + ValueNum* GetLiberalAddr() + { + return &m_liberal; + } + ValueNum* GetConservativeAddr() + { + return &m_conservative; + } + + ValueNum Get(ValueNumKind vnk) + { + return vnk == VNK_Liberal ? m_liberal : m_conservative; + } + + void SetBoth(ValueNum vn) + { + m_liberal = vn; + m_conservative = vn; + } + + void operator=(const ValueNumPair& vn2) + { + m_liberal = vn2.m_liberal; + m_conservative = vn2.m_conservative; + } + + // Initializes both elements to "NoVN". Defined in ValueNum.cpp. + ValueNumPair(); + + ValueNumPair(ValueNum lib, ValueNum cons) : m_liberal(lib), m_conservative(cons) + { + } + + // True iff neither element is "NoVN". Defined in ValueNum.cpp. + bool BothDefined() const; + + bool BothEqual() const + { + return m_liberal == m_conservative; + } +}; + +#endif // _VALUENUMTYPE_H_ |