Skip to content

Commit 3c38189

Browse files
authored
Runtime lookup clean up, enable for helper-based tail calls (#83430)
1 parent ea57982 commit 3c38189

File tree

14 files changed

+59
-124
lines changed

14 files changed

+59
-124
lines changed

src/coreclr/inc/corinfo.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,9 +1268,6 @@ struct CORINFO_RUNTIME_LOOKUP
12681268
// If set, test for null and branch to helper if null
12691269
bool testForNull;
12701270

1271-
// If set, test the lowest bit and dereference if set (see code:FixupPointer)
1272-
bool testForFixup;
1273-
12741271
uint16_t sizeOffset;
12751272
size_t offsets[CORINFO_MAXINDIRECTIONS];
12761273

src/coreclr/inc/jiteeversionguid.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ typedef const GUID *LPCGUID;
4343
#define GUID_DEFINED
4444
#endif // !GUID_DEFINED
4545

46-
constexpr GUID JITEEVersionIdentifier = { /* b0e1ce41-2339-491d-ab72-736a8d233ea1 */
47-
0xb0e1ce41,
48-
0x2339,
49-
0x491d,
50-
{0xab, 0x72, 0x73, 0x6a, 0x8d, 0x23, 0x3e, 0xa1}
46+
constexpr GUID JITEEVersionIdentifier = { /* 3a8a07e7-928e-4281-ab68-cd4017c1141b */
47+
0x3a8a07e7,
48+
0x928e,
49+
0x4281,
50+
{0xab, 0x68, 0xcd, 0x40, 0x17, 0xc1, 0x14, 0x1b}
5151
};
5252

5353
//////////////////////////////////////////////////////////////////////////////////////////////////////////

src/coreclr/jit/compiler.hpp

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,27 +1029,6 @@ inline GenTreeCall* Compiler::gtNewHelperCallNode(
10291029
return result;
10301030
}
10311031

1032-
//------------------------------------------------------------------------------
1033-
// gtNewRuntimeLookupHelperCallNode : Helper to create a runtime lookup call helper node.
1034-
//
1035-
//
1036-
// Arguments:
1037-
// helper - Call helper
1038-
// type - Type of the node
1039-
// args - Call args
1040-
//
1041-
// Return Value:
1042-
// New CT_HELPER node
1043-
1044-
inline GenTreeCall* Compiler::gtNewRuntimeLookupHelperCallNode(CORINFO_RUNTIME_LOOKUP* pRuntimeLookup,
1045-
GenTree* ctxTree,
1046-
void* compileTimeHandle)
1047-
{
1048-
GenTree* argNode = gtNewIconEmbHndNode(pRuntimeLookup->signature, nullptr, GTF_ICON_GLOBAL_PTR, compileTimeHandle);
1049-
GenTreeCall* call = gtNewHelperCallNode(pRuntimeLookup->helper, TYP_I_IMPL, ctxTree, argNode);
1050-
return call;
1051-
}
1052-
10531032
//------------------------------------------------------------------------
10541033
// gtNewAllocObjNode: A little helper to create an object allocation node.
10551034
//

src/coreclr/jit/fgbasic.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4648,6 +4648,9 @@ BasicBlock* Compiler::fgSplitBlockBeforeTree(
46484648
BasicBlockFlags originalFlags = block->bbFlags;
46494649
BasicBlock* prevBb = block;
46504650

4651+
// We use fgSplitBlockAfterStatement() API here to split the block, however, we want to split
4652+
// it *Before* rather than *After* so if the current statement is the first in the
4653+
// current block - invoke fgSplitBlockAtBeginning
46514654
if (stmt == block->firstStmt())
46524655
{
46534656
block = fgSplitBlockAtBeginning(prevBb);

src/coreclr/jit/importer.cpp

Lines changed: 10 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1782,36 +1782,22 @@ GenTree* Compiler::impRuntimeLookupToTree(CORINFO_RESOLVED_TOKEN* pResolvedToken
17821782

17831783
if (pRuntimeLookup->testForNull)
17841784
{
1785+
// Import just a helper call and mark it for late expansion in fgExpandRuntimeLookups phase
17851786
assert(pRuntimeLookup->indirections != 0);
1787+
GenTreeCall* helperCall = gtNewRuntimeLookupHelperCallNode(pRuntimeLookup, ctxTree, compileTimeHandle);
17861788

1787-
// Call the helper
1788-
// - Setup argNode with the pointer to the signature returned by the lookup
1789-
GenTree* argNode =
1790-
gtNewIconEmbHndNode(pRuntimeLookup->signature, nullptr, GTF_ICON_GLOBAL_PTR, compileTimeHandle);
1791-
GenTreeCall* helperCall = gtNewHelperCallNode(pRuntimeLookup->helper, TYP_I_IMPL, ctxTree, argNode);
1792-
1793-
// No need to perform CSE/hoisting for signature node - it is expected to end up in a rarely-taken block after
1794-
// "Expand runtime lookups" phase.
1795-
argNode->gtFlags |= GTF_DONT_CSE;
1796-
1797-
// Leave a note that this method has runtime lookups we might want to expand (nullchecks, size checks) later.
1798-
// We can also consider marking current block as a runtime lookup holder to improve TP for Tier0
1799-
impInlineRoot()->setMethodHasExpRuntimeLookup();
1800-
helperCall->SetExpRuntimeLookup();
1801-
if (!impInlineRoot()->GetSignatureToLookupInfoMap()->Lookup(pRuntimeLookup->signature))
1802-
{
1803-
JITDUMP("Registering %p in SignatureToLookupInfoMap\n", pRuntimeLookup->signature)
1804-
impInlineRoot()->GetSignatureToLookupInfoMap()->Set(pRuntimeLookup->signature, *pRuntimeLookup);
1805-
}
1789+
// Spilling it to a temp improves CQ (mainly in Tier0)
18061790
unsigned callLclNum = lvaGrabTemp(true DEBUGARG("spilling helperCall"));
18071791
impAssignTempGen(callLclNum, helperCall);
18081792
return gtNewLclvNode(callLclNum, helperCall->TypeGet());
18091793
}
18101794

1795+
// Size-check is not expected without testForNull
1796+
assert(pRuntimeLookup->sizeOffset == CORINFO_NO_SIZE_CHECK);
1797+
18111798
// Slot pointer
1812-
GenTree* slotPtrTree = ctxTree;
1813-
GenTree* indOffTree = nullptr;
1814-
GenTree* lastIndOfTree = nullptr;
1799+
GenTree* slotPtrTree = ctxTree;
1800+
GenTree* indOffTree = nullptr;
18151801

18161802
// Applied repeated indirections
18171803
for (WORD i = 0; i < pRuntimeLookup->indirections; i++)
@@ -1822,18 +1808,10 @@ GenTree* Compiler::impRuntimeLookupToTree(CORINFO_RESOLVED_TOKEN* pResolvedToken
18221808
nullptr DEBUGARG("impRuntimeLookup indirectOffset"));
18231809
}
18241810

1825-
// The last indirection could be subject to a size check (dynamic dictionary expansion)
1826-
bool isLastIndirectionWithSizeCheck =
1827-
((i == pRuntimeLookup->indirections - 1) && (pRuntimeLookup->sizeOffset != CORINFO_NO_SIZE_CHECK));
1828-
18291811
if (i != 0)
18301812
{
18311813
slotPtrTree = gtNewOperNode(GT_IND, TYP_I_IMPL, slotPtrTree);
1832-
slotPtrTree->gtFlags |= GTF_IND_NONFAULTING;
1833-
if (!isLastIndirectionWithSizeCheck)
1834-
{
1835-
slotPtrTree->gtFlags |= GTF_IND_INVARIANT;
1836-
}
1814+
slotPtrTree->gtFlags |= (GTF_IND_NONFAULTING | GTF_IND_INVARIANT);
18371815
}
18381816

18391817
if ((i == 1 && pRuntimeLookup->indirectFirstOffset) || (i == 2 && pRuntimeLookup->indirectSecondOffset))
@@ -1843,12 +1821,6 @@ GenTree* Compiler::impRuntimeLookupToTree(CORINFO_RESOLVED_TOKEN* pResolvedToken
18431821

18441822
if (pRuntimeLookup->offsets[i] != 0)
18451823
{
1846-
if (isLastIndirectionWithSizeCheck)
1847-
{
1848-
lastIndOfTree = impCloneExpr(slotPtrTree, &slotPtrTree, NO_CLASS_HANDLE, CHECK_SPILL_ALL,
1849-
nullptr DEBUGARG("impRuntimeLookup indirectOffset"));
1850-
}
1851-
18521824
slotPtrTree =
18531825
gtNewOperNode(GT_ADD, TYP_I_IMPL, slotPtrTree, gtNewIconNode(pRuntimeLookup->offsets[i], TYP_I_IMPL));
18541826
}
@@ -1865,37 +1837,7 @@ GenTree* Compiler::impRuntimeLookupToTree(CORINFO_RESOLVED_TOKEN* pResolvedToken
18651837
slotPtrTree = gtNewOperNode(GT_IND, TYP_I_IMPL, slotPtrTree);
18661838
slotPtrTree->gtFlags |= GTF_IND_NONFAULTING;
18671839

1868-
if (!pRuntimeLookup->testForFixup)
1869-
{
1870-
return slotPtrTree;
1871-
}
1872-
1873-
impSpillSideEffects(true, CHECK_SPILL_ALL DEBUGARG("bubbling QMark0"));
1874-
1875-
unsigned slotLclNum = lvaGrabTemp(true DEBUGARG("impRuntimeLookup test"));
1876-
impAssignTempGen(slotLclNum, slotPtrTree, NO_CLASS_HANDLE, CHECK_SPILL_ALL, nullptr, impCurStmtDI);
1877-
1878-
GenTree* slot = gtNewLclvNode(slotLclNum, TYP_I_IMPL);
1879-
// downcast the pointer to a TYP_INT on 64-bit targets
1880-
slot = impImplicitIorI4Cast(slot, TYP_INT);
1881-
// Use a GT_AND to check for the lowest bit and indirect if it is set
1882-
GenTree* test = gtNewOperNode(GT_AND, TYP_INT, slot, gtNewIconNode(1));
1883-
GenTree* relop = gtNewOperNode(GT_EQ, TYP_INT, test, gtNewIconNode(0));
1884-
1885-
// slot = GT_IND(slot - 1)
1886-
slot = gtNewLclvNode(slotLclNum, TYP_I_IMPL);
1887-
GenTree* add = gtNewOperNode(GT_ADD, TYP_I_IMPL, slot, gtNewIconNode(-1, TYP_I_IMPL));
1888-
GenTree* indir = gtNewOperNode(GT_IND, TYP_I_IMPL, add);
1889-
indir->gtFlags |= GTF_IND_NONFAULTING;
1890-
indir->gtFlags |= GTF_IND_INVARIANT;
1891-
1892-
slot = gtNewLclvNode(slotLclNum, TYP_I_IMPL);
1893-
GenTree* asg = gtNewAssignNode(slot, indir);
1894-
GenTreeColon* colon = new (this, GT_COLON) GenTreeColon(TYP_VOID, gtNewNothingNode(), asg);
1895-
GenTreeQmark* qmark = gtNewQmarkNode(TYP_VOID, relop, colon);
1896-
impAppendTree(qmark, CHECK_SPILL_NONE, impCurStmtDI);
1897-
1898-
return gtNewLclvNode(slotLclNum, TYP_I_IMPL);
1840+
return slotPtrTree;
18991841
}
19001842

19011843
struct RecursiveGuard

src/coreclr/jit/morph.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7047,14 +7047,8 @@ GenTree* Compiler::getRuntimeLookupTree(CORINFO_RESOLVED_TOKEN* pResolvedToken,
70477047
// If pRuntimeLookup->indirections is equal to CORINFO_USEHELPER, it specifies that a run-time helper should be
70487048
// used; otherwise, it specifies the number of indirections via pRuntimeLookup->offsets array.
70497049
if ((pRuntimeLookup->indirections == CORINFO_USEHELPER) || (pRuntimeLookup->indirections == CORINFO_USENULL) ||
7050-
pRuntimeLookup->testForNull || pRuntimeLookup->testForFixup)
7051-
{
7052-
// If the first condition is true, runtime lookup tree is available only via the run-time helper function.
7053-
// TODO-CQ If the second or third condition is true, we are always using the slow path since we can't
7054-
// introduce control flow at this point. See impRuntimeLookupToTree for the logic to avoid calling the helper.
7055-
// The long-term solution is to introduce a new node representing a runtime lookup, create instances
7056-
// of that node both in the importer and here, and expand the node in lower (introducing control flow if
7057-
// necessary).
7050+
pRuntimeLookup->testForNull)
7051+
{
70587052
return gtNewRuntimeLookupHelperCallNode(pRuntimeLookup,
70597053
getRuntimeContextTree(pLookup->lookupKind.runtimeLookupKind),
70607054
compileTimeHandle);
@@ -7111,7 +7105,6 @@ GenTree* Compiler::getRuntimeLookupTree(CORINFO_RESOLVED_TOKEN* pResolvedToken,
71117105
assert(!pRuntimeLookup->testForNull);
71127106
if (pRuntimeLookup->indirections > 0)
71137107
{
7114-
assert(!pRuntimeLookup->testForFixup);
71157108
result = gtNewOperNode(GT_IND, TYP_I_IMPL, result);
71167109
result->gtFlags |= GTF_IND_NONFAULTING;
71177110
}

src/coreclr/jit/runtimelookup.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,42 @@ static BasicBlock* CreateBlockFromTree(Compiler* comp,
5353
return newBlock;
5454
}
5555

56+
//------------------------------------------------------------------------------
57+
// gtNewRuntimeLookupHelperCallNode : Helper to create a runtime lookup call helper node.
58+
//
59+
// Arguments:
60+
// helper - Call helper
61+
// type - Type of the node
62+
// args - Call args
63+
//
64+
// Return Value:
65+
// New CT_HELPER node
66+
//
67+
GenTreeCall* Compiler::gtNewRuntimeLookupHelperCallNode(CORINFO_RUNTIME_LOOKUP* pRuntimeLookup,
68+
GenTree* ctxTree,
69+
void* compileTimeHandle)
70+
{
71+
// Call the helper
72+
// - Setup argNode with the pointer to the signature returned by the lookup
73+
GenTree* argNode = gtNewIconEmbHndNode(pRuntimeLookup->signature, nullptr, GTF_ICON_GLOBAL_PTR, compileTimeHandle);
74+
GenTreeCall* helperCall = gtNewHelperCallNode(pRuntimeLookup->helper, TYP_I_IMPL, ctxTree, argNode);
75+
76+
// No need to perform CSE/hoisting for signature node - it is expected to end up in a rarely-taken block after
77+
// "Expand runtime lookups" phase.
78+
argNode->gtFlags |= GTF_DONT_CSE;
79+
80+
// Leave a note that this method has runtime lookups we might want to expand (nullchecks, size checks) later.
81+
// We can also consider marking current block as a runtime lookup holder to improve TP for Tier0
82+
impInlineRoot()->setMethodHasExpRuntimeLookup();
83+
helperCall->SetExpRuntimeLookup();
84+
if (!impInlineRoot()->GetSignatureToLookupInfoMap()->Lookup(pRuntimeLookup->signature))
85+
{
86+
JITDUMP("Registering %p in SignatureToLookupInfoMap\n", pRuntimeLookup->signature)
87+
impInlineRoot()->GetSignatureToLookupInfoMap()->Set(pRuntimeLookup->signature, *pRuntimeLookup);
88+
}
89+
return helperCall;
90+
}
91+
5692
//------------------------------------------------------------------------------
5793
// fgExpandRuntimeLookups : partially expand runtime lookups helper calls
5894
// to add a nullcheck [+ size check] and a fast path

src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,6 @@ public unsafe struct CORINFO_RUNTIME_LOOKUP
233233
public byte _testForNull;
234234
public bool testForNull { get { return _testForNull != 0; } set { _testForNull = value ? (byte)1 : (byte)0; } }
235235

236-
// If set, test the lowest bit and dereference if set (see code:FixupPointer)
237-
public byte _testForFixup;
238-
public bool testForFixup { get { return _testForFixup != 0; } set { _testForFixup = value ? (byte)1 : (byte)0; } }
239-
240236
public ushort sizeOffset;
241237
public IntPtr offset0;
242238
public IntPtr offset1;

src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,6 @@ private void ComputeLookup(ref CORINFO_RESOLVED_TOKEN pResolvedToken, object ent
289289
lookup.runtimeLookup.offset1 = IntPtr.Zero;
290290
}
291291
lookup.runtimeLookup.sizeOffset = CORINFO.CORINFO_NO_SIZE_CHECK;
292-
lookup.runtimeLookup.testForFixup = false; // TODO: this will be needed in true multifile
293292
lookup.runtimeLookup.testForNull = false;
294293
lookup.runtimeLookup.indirectFirstOffset = false;
295294
lookup.runtimeLookup.indirectSecondOffset = false;

src/coreclr/tools/superpmi/superpmi-shared/agnostic.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,6 @@ struct Agnostic_CORINFO_RUNTIME_LOOKUP
249249
DWORD helper;
250250
DWORD indirections;
251251
DWORD testForNull;
252-
DWORD testForFixup;
253252
WORD sizeOffset;
254253
DWORDLONG offsets[CORINFO_MAXINDIRECTIONS];
255254
DWORD indirectFirstOffset;

src/coreclr/tools/superpmi/superpmi-shared/spmidumphelper.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ std::string SpmiDumpHelper::DumpAgnostic_CORINFO_RUNTIME_LOOKUP(
5656
const Agnostic_CORINFO_RUNTIME_LOOKUP& lookup)
5757
{
5858
char buffer[MAX_BUFFER_SIZE];
59-
sprintf_s(buffer, MAX_BUFFER_SIZE, " sig-%016llX hlp-%u ind-%u tfn-%u tff-%u so-%u { ", lookup.signature, lookup.helper,
60-
lookup.indirections, lookup.testForNull, lookup.testForFixup, lookup.sizeOffset);
59+
sprintf_s(buffer, MAX_BUFFER_SIZE, " sig-%016llX hlp-%u ind-%u tfn-%u so-%u { ", lookup.signature, lookup.helper,
60+
lookup.indirections, lookup.testForNull, lookup.sizeOffset);
6161
std::string resultDump(buffer);
6262
for (int i = 0; i < CORINFO_MAXINDIRECTIONS; i++)
6363
{

src/coreclr/tools/superpmi/superpmi-shared/spmirecordhelper.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,6 @@ inline Agnostic_CORINFO_RUNTIME_LOOKUP SpmiRecordsHelper::StoreAgnostic_CORINFO_
486486
runtimeLookup.helper = (DWORD)pLookup->helper;
487487
runtimeLookup.indirections = (DWORD)pLookup->indirections;
488488
runtimeLookup.testForNull = (DWORD)pLookup->testForNull;
489-
runtimeLookup.testForFixup = (DWORD)pLookup->testForFixup;
490489
runtimeLookup.sizeOffset = pLookup->sizeOffset;
491490
runtimeLookup.indirectFirstOffset = (DWORD)pLookup->indirectFirstOffset;
492491
runtimeLookup.indirectSecondOffset = (DWORD)pLookup->indirectSecondOffset;
@@ -503,7 +502,6 @@ inline CORINFO_RUNTIME_LOOKUP SpmiRecordsHelper::RestoreCORINFO_RUNTIME_LOOKUP(
503502
runtimeLookup.helper = (CorInfoHelpFunc)lookup.helper;
504503
runtimeLookup.indirections = (WORD)lookup.indirections;
505504
runtimeLookup.testForNull = lookup.testForNull != 0;
506-
runtimeLookup.testForFixup = lookup.testForFixup != 0;
507505
runtimeLookup.sizeOffset = lookup.sizeOffset;
508506
runtimeLookup.indirectFirstOffset = lookup.indirectFirstOffset != 0;
509507
runtimeLookup.indirectSecondOffset = lookup.indirectSecondOffset != 0;

src/coreclr/vm/jitinterface.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2893,7 +2893,6 @@ void CEEInfo::ComputeRuntimeLookupForSharedGenericToken(DictionaryEntryKind entr
28932893
{
28942894
pResult->indirections = 2;
28952895
pResult->testForNull = 0;
2896-
pResult->testForFixup = 0;
28972896
pResult->offsets[0] = offsetof(InstantiatedMethodDesc, m_pPerInstInfo);
28982897

28992898
uint32_t data;
@@ -2933,7 +2932,6 @@ void CEEInfo::ComputeRuntimeLookupForSharedGenericToken(DictionaryEntryKind entr
29332932
// Just use the method descriptor that was passed in!
29342933
pResult->indirections = 0;
29352934
pResult->testForNull = 0;
2936-
pResult->testForFixup = 0;
29372935

29382936
return;
29392937
}
@@ -2970,7 +2968,6 @@ void CEEInfo::ComputeRuntimeLookupForSharedGenericToken(DictionaryEntryKind entr
29702968
{
29712969
pResult->indirections = 3;
29722970
pResult->testForNull = 0;
2973-
pResult->testForFixup = 0;
29742971
pResult->offsets[0] = MethodTable::GetOffsetOfPerInstInfo();
29752972
pResult->offsets[1] = sizeof(TypeHandle*) * (pContextMT->GetNumDicts() - 1);
29762973
uint32_t data;
@@ -2993,7 +2990,6 @@ void CEEInfo::ComputeRuntimeLookupForSharedGenericToken(DictionaryEntryKind entr
29932990
// Just use the vtable pointer itself!
29942991
pResult->indirections = 0;
29952992
pResult->testForNull = 0;
2996-
pResult->testForFixup = 0;
29972993

29982994
return;
29992995
}
@@ -3185,7 +3181,6 @@ void CEEInfo::ComputeRuntimeLookupForSharedGenericToken(DictionaryEntryKind entr
31853181
if (DictionaryLayout::FindToken(pContextMD, pContextMD->GetLoaderAllocator(), 1, &sigBuilder, NULL, signatureSource, pResult, &slot))
31863182
{
31873183
pResult->testForNull = 1;
3188-
pResult->testForFixup = 0;
31893184
int minDictSize = pContextMD->GetNumGenericMethodArgs() + 1 + pContextMD->GetDictionaryLayout()->GetNumInitialSlots();
31903185
if (slot >= minDictSize)
31913186
{
@@ -3204,7 +3199,6 @@ void CEEInfo::ComputeRuntimeLookupForSharedGenericToken(DictionaryEntryKind entr
32043199
if (DictionaryLayout::FindToken(pContextMT, pContextMT->GetLoaderAllocator(), 2, &sigBuilder, NULL, signatureSource, pResult, &slot))
32053200
{
32063201
pResult->testForNull = 1;
3207-
pResult->testForFixup = 0;
32083202
int minDictSize = pContextMT->GetNumGenericArgs() + 1 + pContextMT->GetClass()->GetDictionaryLayout()->GetNumInitialSlots();
32093203
if (slot >= minDictSize)
32103204
{

src/coreclr/vm/prestub.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2843,9 +2843,8 @@ void ProcessDynamicDictionaryLookup(TransitionBlock * pTransitionBlock
28432843

28442844
TADDR genericContextPtr = *(TADDR*)GetFirstArgumentRegisterValuePtr(pTransitionBlock);
28452845

2846-
pResult->testForFixup = pResult->testForNull = false;
28472846
pResult->signature = NULL;
2848-
2847+
pResult->testForNull = false;
28492848
pResult->indirectFirstOffset = 0;
28502849
pResult->indirectSecondOffset = 0;
28512850
// Dictionary size checks skipped by default, unless we decide otherwise

0 commit comments

Comments
 (0)