@@ -39,6 +39,10 @@ class LocalAddressVisitor final : public GenTreeVisitor<LocalAddressVisitor>
39
39
unsigned m_lclNum;
40
40
unsigned m_offset;
41
41
bool m_address;
42
+ bool m_excludeFromVN; // This value should not participate in VN optimizations,
43
+ // for example, because it represents a reinterpreted struct.
44
+ // When we transform it we should set `DontVN()` for `LclVar`
45
+ // and `NotAField` for `LclFld`.
42
46
INDEBUG (bool m_consumed;)
43
47
44
48
public:
@@ -49,6 +53,7 @@ class LocalAddressVisitor final : public GenTreeVisitor<LocalAddressVisitor>
49
53
, m_lclNum(BAD_VAR_NUM)
50
54
, m_offset(0 )
51
55
, m_address(false )
56
+ , m_excludeFromVN(false )
52
57
#ifdef DEBUG
53
58
, m_consumed(false )
54
59
#endif // DEBUG
@@ -112,6 +117,10 @@ class LocalAddressVisitor final : public GenTreeVisitor<LocalAddressVisitor>
112
117
assert (!IsLocation () && !IsAddress ());
113
118
114
119
m_lclNum = lclVar->GetLclNum ();
120
+ if (lclVar->DontVN ())
121
+ {
122
+ m_excludeFromVN = true ;
123
+ }
115
124
116
125
assert (m_offset == 0 );
117
126
assert (m_fieldSeq == nullptr );
@@ -195,10 +204,11 @@ class LocalAddressVisitor final : public GenTreeVisitor<LocalAddressVisitor>
195
204
196
205
if (val.IsLocation ())
197
206
{
198
- m_address = true ;
199
- m_lclNum = val.m_lclNum ;
200
- m_offset = val.m_offset ;
201
- m_fieldSeq = val.m_fieldSeq ;
207
+ m_address = true ;
208
+ m_lclNum = val.m_lclNum ;
209
+ m_offset = val.m_offset ;
210
+ m_fieldSeq = val.m_fieldSeq ;
211
+ m_excludeFromVN = val.m_excludeFromVN ;
202
212
}
203
213
204
214
INDEBUG (val.Consume ();)
@@ -246,7 +256,7 @@ class LocalAddressVisitor final : public GenTreeVisitor<LocalAddressVisitor>
246
256
m_lclNum = val.m_lclNum ;
247
257
m_offset = newOffset.Value ();
248
258
249
- if (field->gtFldMayOverlap )
259
+ if (field->gtFldMayOverlap || val. m_excludeFromVN )
250
260
{
251
261
m_fieldSeq = FieldSeqStore::NotAField ();
252
262
}
@@ -287,9 +297,10 @@ class LocalAddressVisitor final : public GenTreeVisitor<LocalAddressVisitor>
287
297
288
298
if (val.IsAddress ())
289
299
{
290
- m_lclNum = val.m_lclNum ;
291
- m_offset = val.m_offset ;
292
- m_fieldSeq = val.m_fieldSeq ;
300
+ m_lclNum = val.m_lclNum ;
301
+ m_offset = val.m_offset ;
302
+ m_fieldSeq = val.m_fieldSeq ;
303
+ m_excludeFromVN = val.m_excludeFromVN ;
293
304
}
294
305
295
306
INDEBUG (val.Consume ();)
0 commit comments