1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4
5// Defines the type "ValueNum".
6
7// This file exists only to break an include file cycle -- had been in ValueNum.h. But that
8// file wanted to include gentree.h to get GT_COUNT, and gentree.h wanted ton include ValueNum.h to
9// the ValueNum type.
10
11/*****************************************************************************/
12#ifndef _VALUENUMTYPE_H_
13#define _VALUENUMTYPE_H_
14/*****************************************************************************/
15
16// We will represent ValueNum's as unsigned integers.
17typedef UINT32 ValueNum;
18
19// There are two "kinds" of value numbers, which differ in their modeling of the actions of other threads.
20// "Liberal" value numbers assume that the other threads change contents of memory locations only at
21// synchronization points. Liberal VNs are appropriate, for example, in identifying CSE opportunities.
22// "Conservative" value numbers assume that the contents of memory locations change arbitrarily between
23// every two accesses. Conservative VNs are appropriate, for example, in assertion prop, where an observation
24// of a property of the value in some storage location is used to perform an optimization downstream on
25// an operation involving the contents of that storage location. If other threads may modify the storage
26// location between the two accesses, the observed property may no longer hold -- and conservative VNs make
27// it clear that the values need not be the same.
28//
29enum ValueNumKind
30{
31 VNK_Liberal,
32 VNK_Conservative
33};
34
35struct ValueNumPair
36{
37private:
38 ValueNum m_liberal;
39 ValueNum m_conservative;
40
41public:
42 ValueNum GetLiberal() const
43 {
44 return m_liberal;
45 }
46 void SetLiberal(ValueNum vn)
47 {
48 m_liberal = vn;
49 }
50 ValueNum GetConservative() const
51 {
52 return m_conservative;
53 }
54 void SetConservative(ValueNum vn)
55 {
56 m_conservative = vn;
57 }
58
59 ValueNum* GetLiberalAddr()
60 {
61 return &m_liberal;
62 }
63 ValueNum* GetConservativeAddr()
64 {
65 return &m_conservative;
66 }
67
68 ValueNum Get(ValueNumKind vnk)
69 {
70 if (vnk == VNK_Liberal)
71 {
72 return m_liberal;
73 }
74 else
75 {
76 assert(vnk == VNK_Conservative);
77 return m_conservative;
78 }
79 }
80
81 void SetBoth(ValueNum vn)
82 {
83 m_liberal = vn;
84 m_conservative = vn;
85 }
86
87 void operator=(const ValueNumPair& vn2)
88 {
89 m_liberal = vn2.m_liberal;
90 m_conservative = vn2.m_conservative;
91 }
92
93 // Initializes both elements to "NoVN". Defined in ValueNum.cpp.
94 ValueNumPair();
95
96 ValueNumPair(ValueNum lib, ValueNum cons) : m_liberal(lib), m_conservative(cons)
97 {
98 }
99
100 // True iff neither element is "NoVN". Defined in ValueNum.cpp.
101 bool BothDefined() const;
102
103 bool BothEqual() const
104 {
105 return m_liberal == m_conservative;
106 }
107};
108
109#endif // _VALUENUMTYPE_H_
110