Skip to content

Commit 4ef3cc6

Browse files
authored
Add ValueNumbering support for GT_SIMD and GT_HWINTRINSIC tree nodes (#31834)
* Added ValueNumbering support for GT_SIMD and GT_HWINTRINSIC tree nodes * Allow SIMD and HW Intrinsics to be CSE candidates * Correctness fix for optAssertionPropMain - Zero out the bbAssertionIn values, as these can be referenced in RangeCheck::MergeAssertion and this is shared state with the CSE phase: bbCseIn * Improve the VNFOA_ArityMask * Update to use the new TARGET macros * Include node type when value numbering SIMDIntrinsicInit Mutate the gloabl heap when performing a HW_INTRINSIC memory store operation Printing of SIMD constants only support 0 * Disable CSE's for some special HW_INTRINSIC categories * Code review feedback * Record csdStructHnd; // The class handle, currently needed to create a SIMD LclVar in PerformCSE * Instead of asserting on a struct handle mismatch, we record it in csdStructHndMismatch and avoid making the candidate into a CSE * Fix the JITDUMP messages to print the CseIndex * add check for (newElemStructHnd != NO_CLASS_HANDLE) * Additional checks for SIMD struct types when setting csdStructHnd Added Mismatched Struct Handle assert in ConsiderCandidates * fix GenTreeSIMD::OperIsMemoryLoad for ARM64 Removed ismatched Struct Handle assert * Fix the printing of BitSets on Linux, change the printf format specifier * Added check for simdNode->OperIsMemoryLoad()) to fgValueNumberSimd Added bool OperIsMemoryLoad() to GenTreeSIMD, returns true for SIMDIntrinsicInitArray Added valuenumfuncs.h to src/coreclr/src/jit/CMakeLists.txt * Avoid calling gtGetStructHandleIfPresent to set csdStructHnd when we have a GT_IND node * Fix check for (newElemStructHnd != hashDsc->csdStructHnd) * added extra value number argument VNF_SimdType for Most SIMD operations added VNF_SimdType // A value number function to compose a SIMD type added vnDumpSimdType * Added bool methods vnEncodesResultTypeForSIMDIntrinsic and vnEncodesResultTypeForHWIntrinsic these return true when a SIMD or HW Instrinsic will use an extra arg to record the result type during value numbering Changes the ValueNumFuncDef to set the arity to zero when a -1 value is passed in Updated InitValueNumStoreStatics to fixup the arity of SIMD or HW Instrinsic that have an extra arg to record the result type Allow a type mismatchj when we have a GT_BLK as the lhs of an assignment, as it is used to zero out Simd structs * Fix for SIMD_WidenLo arg count * fix typo * Fix x86 build breaks Fix SIMD_WidenHi * Added method header comment for vnEncodesResultTypeForHWIntrinsic Added & VNFOA_ArityMask when assigning to vnfOpAttribs[] * Codereview feedback and some more comments * fix typo * Moved the code that sets the arg count for the three SIMD intrinsics * clang-format * Adjust CSE for SIMD types that are live across a call * Proposed fix for #32085 * Revert "Proposed fix for #32085" This reverts commit 169c24e. * Added better comments for optcse SIMD caller saved register heuristics * Added CONFIG_INTEGER: JitDisableSimdVN, Default 0, ValueNumbering of SIMD nodes and HW Intrinsic nodes enabled If 1, then disable ValueNumbering of SIMD nodes If 2, then disable ValueNumbering of HW Intrinsic nodes If 3, disable both SIMD and HW Intrinsic nodes * Moved JitDisableSimdVN from DEBUG to RETAIL
1 parent 6587f82 commit 4ef3cc6

14 files changed

+843
-78
lines changed

src/coreclr/src/jit/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ if (CLR_CMAKE_TARGET_WIN32)
186186
unwind.h
187187
utils.h
188188
valuenum.h
189+
valuenumfuncs.h
189190
valuenumtype.h
190191
varset.h
191192
vartype.h

src/coreclr/src/jit/assertionprop.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5193,8 +5193,15 @@ void Compiler::optAssertionPropMain()
51935193
}
51945194
}
51955195

5196-
if (!optAssertionCount)
5196+
if (optAssertionCount == 0)
51975197
{
5198+
// Zero out the bbAssertionIn values, as these can be referenced in RangeCheck::MergeAssertion
5199+
// and this is sharedstate with the CSE phase: bbCseIn
5200+
//
5201+
for (BasicBlock* block = fgFirstBB; block; block = block->bbNext)
5202+
{
5203+
block->bbAssertionIn = BitVecOps::MakeEmpty(apTraits);
5204+
}
51985205
return;
51995206
}
52005207

src/coreclr/src/jit/bitsetasshortlong.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,12 +412,12 @@ class BitSetOps</*BitSetType*/ BitSetShortLongRep,
412412
char* ptr = res;
413413
if (sizeof(size_t) == sizeof(int64_t))
414414
{
415-
sprintf_s(ptr, remaining, "%016zX", bits);
415+
sprintf_s(ptr, remaining, "%016llX", bits);
416416
}
417417
else
418418
{
419419
assert(sizeof(size_t) == sizeof(int));
420-
sprintf_s(ptr, remaining, "%08zX", bits);
420+
sprintf_s(ptr, remaining, "%08X", bits);
421421
}
422422
return res;
423423
}

src/coreclr/src/jit/compiler.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4674,6 +4674,16 @@ class Compiler
46744674
// Does value-numbering for an intrinsic tree.
46754675
void fgValueNumberIntrinsic(GenTree* tree);
46764676

4677+
#ifdef FEATURE_SIMD
4678+
// Does value-numbering for a GT_SIMD tree
4679+
void fgValueNumberSimd(GenTree* tree);
4680+
#endif // FEATURE_SIMD
4681+
4682+
#ifdef FEATURE_HW_INTRINSICS
4683+
// Does value-numbering for a GT_HWINTRINSIC tree
4684+
void fgValueNumberHWIntrinsic(GenTree* tree);
4685+
#endif // FEATURE_HW_INTRINSICS
4686+
46774687
// Does value-numbering for a call. We interpret some helper calls.
46784688
void fgValueNumberCall(GenTreeCall* call);
46794689

@@ -4698,6 +4708,9 @@ class Compiler
46984708
// Adds the exception set for the current tree node which is performing a overflow checking operation
46994709
void fgValueNumberAddExceptionSetForOverflow(GenTree* tree);
47004710

4711+
// Adds the exception set for the current tree node which is performing a bounds check operation
4712+
void fgValueNumberAddExceptionSetForBoundsCheck(GenTree* tree);
4713+
47014714
// Adds the exception set for the current tree node which is performing a ckfinite operation
47024715
void fgValueNumberAddExceptionSetForCkFinite(GenTree* tree);
47034716

@@ -6190,6 +6203,12 @@ class Compiler
61906203
treeStmtLst* csdTreeList; // list of matching tree nodes: head
61916204
treeStmtLst* csdTreeLast; // list of matching tree nodes: tail
61926205

6206+
// ToDo: This can be removed when gtGetStructHandleIfPresent stops guessing
6207+
// and GT_IND nodes always have valid struct handle.
6208+
//
6209+
CORINFO_CLASS_HANDLE csdStructHnd; // The class handle, currently needed to create a SIMD LclVar in PerformCSE
6210+
bool csdStructHndMismatch;
6211+
61936212
ValueNum defExcSetPromise; // The exception set that is now required for all defs of this CSE.
61946213
// This will be set to NoVN if we decide to abandon this CSE
61956214

@@ -8189,6 +8208,13 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
81898208
#endif // !FEATURE_SIMD
81908209
}
81918210

8211+
#ifdef FEATURE_SIMD
8212+
static bool vnEncodesResultTypeForSIMDIntrinsic(SIMDIntrinsicID intrinsicId);
8213+
#endif // !FEATURE_SIMD
8214+
#ifdef FEATURE_HW_INTRINSICS
8215+
static bool vnEncodesResultTypeForHWIntrinsic(NamedIntrinsic hwIntrinsicID);
8216+
#endif // FEATURE_HW_INTRINSICS
8217+
81928218
private:
81938219
// These routines need not be enclosed under FEATURE_SIMD since lvIsSIMDType()
81948220
// is defined for both FEATURE_SIMD and !FEATURE_SIMD apropriately. The use

src/coreclr/src/jit/gentree.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5405,11 +5405,16 @@ bool GenTree::OperIsImplicitIndir() const
54055405
case GT_ARR_ELEM:
54065406
case GT_ARR_OFFSET:
54075407
return true;
5408+
#ifdef FEATURE_SIMD
5409+
case GT_SIMD:
5410+
{
5411+
return AsSIMD()->OperIsMemoryLoad();
5412+
}
5413+
#endif // FEATURE_SIMD
54085414
#ifdef FEATURE_HW_INTRINSICS
54095415
case GT_HWINTRINSIC:
54105416
{
5411-
GenTreeHWIntrinsic* hwIntrinsicNode = (const_cast<GenTree*>(this))->AsHWIntrinsic();
5412-
return hwIntrinsicNode->OperIsMemoryLoadOrStore();
5417+
return AsHWIntrinsic()->OperIsMemoryLoadOrStore();
54135418
}
54145419
#endif // FEATURE_HW_INTRINSICS
54155420
default:
@@ -18224,6 +18229,16 @@ bool GenTree::isCommutativeSIMDIntrinsic()
1822418229
return false;
1822518230
}
1822618231
}
18232+
18233+
// Returns true for the SIMD Instrinsic instructions that have MemoryLoad semantics, false otherwise
18234+
bool GenTreeSIMD::OperIsMemoryLoad() const
18235+
{
18236+
if (gtSIMDIntrinsicID == SIMDIntrinsicInitArray)
18237+
{
18238+
return true;
18239+
}
18240+
return false;
18241+
}
1822718242
#endif // FEATURE_SIMD
1822818243

1822918244
#ifdef FEATURE_HW_INTRINSICS
@@ -18433,7 +18448,7 @@ GenTree* Compiler::gtNewMustThrowException(unsigned helper, var_types type, CORI
1843318448
}
1843418449

1843518450
// Returns true for the HW Instrinsic instructions that have MemoryLoad semantics, false otherwise
18436-
bool GenTreeHWIntrinsic::OperIsMemoryLoad()
18451+
bool GenTreeHWIntrinsic::OperIsMemoryLoad() const
1843718452
{
1843818453
#ifdef TARGET_XARCH
1843918454
// Some xarch instructions have MemoryLoad sematics
@@ -18475,7 +18490,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad()
1847518490
}
1847618491

1847718492
// Returns true for the HW Instrinsic instructions that have MemoryStore semantics, false otherwise
18478-
bool GenTreeHWIntrinsic::OperIsMemoryStore()
18493+
bool GenTreeHWIntrinsic::OperIsMemoryStore() const
1847918494
{
1848018495
#ifdef TARGET_XARCH
1848118496
// Some xarch instructions have MemoryStore sematics
@@ -18510,7 +18525,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryStore()
1851018525
}
1851118526

1851218527
// Returns true for the HW Instrinsic instructions that have MemoryLoad semantics, false otherwise
18513-
bool GenTreeHWIntrinsic::OperIsMemoryLoadOrStore()
18528+
bool GenTreeHWIntrinsic::OperIsMemoryLoadOrStore() const
1851418529
{
1851518530
#ifdef TARGET_XARCH
1851618531
return OperIsMemoryLoad() || OperIsMemoryStore();

src/coreclr/src/jit/gentree.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4536,6 +4536,9 @@ struct GenTreeSIMD : public GenTreeJitIntrinsic
45364536
{
45374537
}
45384538

4539+
bool OperIsMemoryLoad() const; // Returns true for the SIMD Instrinsic instructions that have MemoryLoad semantics,
4540+
// false otherwise
4541+
45394542
#if DEBUGGABLE_GENTREE
45404543
GenTreeSIMD() : GenTreeJitIntrinsic()
45414544
{
@@ -4584,12 +4587,12 @@ struct GenTreeHWIntrinsic : public GenTreeJitIntrinsic
45844587
// However there are HW Instrinsic instructions that have 3 or even 4 operands and this is
45854588
// supported using a single op1 and using an ArgList for it: gtNewArgList(op1, op2, op3)
45864589

4587-
bool OperIsMemoryLoad(); // Returns true for the HW Instrinsic instructions that have MemoryLoad semantics,
4590+
bool OperIsMemoryLoad() const; // Returns true for the HW Instrinsic instructions that have MemoryLoad semantics,
45884591
// false otherwise
4589-
bool OperIsMemoryStore(); // Returns true for the HW Instrinsic instructions that have MemoryStore semantics,
4592+
bool OperIsMemoryStore() const; // Returns true for the HW Instrinsic instructions that have MemoryStore semantics,
45904593
// false otherwise
4591-
bool OperIsMemoryLoadOrStore(); // Returns true for the HW Instrinsic instructions that have MemoryLoad or
4592-
// MemoryStore semantics, false otherwise
4594+
bool OperIsMemoryLoadOrStore() const; // Returns true for the HW Instrinsic instructions that have MemoryLoad or
4595+
// MemoryStore semantics, false otherwise
45934596

45944597
#if DEBUGGABLE_GENTREE
45954598
GenTreeHWIntrinsic() : GenTreeJitIntrinsic()

src/coreclr/src/jit/hwintrinsic.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,69 @@ CORINFO_CLASS_HANDLE Compiler::gtGetStructHandleForHWSIMD(var_types simdType, va
173173
return NO_CLASS_HANDLE;
174174
}
175175

176+
#ifdef FEATURE_HW_INTRINSICS
177+
//------------------------------------------------------------------------
178+
// vnEncodesResultTypeForHWIntrinsic(NamedIntrinsic hwIntrinsicID):
179+
//
180+
// Arguments:
181+
// hwIntrinsicID -- The id for the HW intrinsic
182+
//
183+
// Return Value:
184+
// Returns true if this intrinsic requires value numbering to add an
185+
// extra SimdType argument that encodes the resulting type.
186+
// If we don't do this overloaded versions can return the same VN
187+
// leading to incorrect CSE subsitutions.
188+
//
189+
/* static */ bool Compiler::vnEncodesResultTypeForHWIntrinsic(NamedIntrinsic hwIntrinsicID)
190+
{
191+
int numArgs = HWIntrinsicInfo::lookupNumArgs(hwIntrinsicID);
192+
193+
// HW Instrinsic's with -1 for numArgs have a varying number of args, so we currently
194+
// give themm a unique value number them, and don't add an extra argument.
195+
//
196+
if (numArgs == -1)
197+
{
198+
return false;
199+
}
200+
201+
// We iterate over all of the different baseType's for this instrinsic in the HWIntrinsicInfo table
202+
// We set diffInsCount to the number of instructions that can execute differently.
203+
//
204+
unsigned diffInsCount = 0;
205+
#ifdef TARGET_XARCH
206+
instruction lastIns = INS_invalid;
207+
#endif
208+
for (var_types baseType = TYP_BYTE; (baseType <= TYP_DOUBLE); baseType = (var_types)(baseType + 1))
209+
{
210+
instruction curIns = HWIntrinsicInfo::lookupIns(hwIntrinsicID, baseType);
211+
if (curIns != INS_invalid)
212+
{
213+
#ifdef TARGET_XARCH
214+
if (curIns != lastIns)
215+
{
216+
diffInsCount++;
217+
// remember the last valid instruction that we saw
218+
lastIns = curIns;
219+
}
220+
#elif defined(TARGET_ARM64)
221+
// On ARM64 we use the same instruction and specify an insOpt arrangement
222+
// so we always consider the instruction operation to be different
223+
//
224+
diffInsCount++;
225+
#endif // TARGET
226+
if (diffInsCount >= 2)
227+
{
228+
// We can early exit the loop now
229+
break;
230+
}
231+
}
232+
}
233+
234+
// If we see two (or more) different instructions we need the extra VNF_SimdType arg
235+
return (diffInsCount >= 2);
236+
}
237+
#endif // FEATURE_HW_INTRINSICS
238+
176239
//------------------------------------------------------------------------
177240
// lookupId: Gets the NamedIntrinsic for a given method name and InstructionSet
178241
//

src/coreclr/src/jit/hwintrinsiclistxarch.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -483,10 +483,10 @@ HARDWARE_INTRINSIC(AVX2_ConvertToUInt32, "ConvertToUI
483483
HARDWARE_INTRINSIC(AVX2_ConvertToVector256Int16, "ConvertToVector256Int16", AVX2, -1, 32, 1, {INS_pmovsxbw, INS_pmovzxbw, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg)
484484
HARDWARE_INTRINSIC(AVX2_ConvertToVector256Int32, "ConvertToVector256Int32", AVX2, -1, 32, 1, {INS_pmovsxbd, INS_pmovzxbd, INS_pmovsxwd, INS_pmovzxwd, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg)
485485
HARDWARE_INTRINSIC(AVX2_ConvertToVector256Int64, "ConvertToVector256Int64", AVX2, -1, 32, 1, {INS_pmovsxbq, INS_pmovzxbq, INS_pmovsxwq, INS_pmovzxwq, INS_pmovsxdq, INS_pmovzxdq, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_SpecialCodeGen|HW_Flag_BaseTypeFromFirstArg)
486-
HARDWARE_INTRINSIC(AVX2_GatherVector128, "GatherVector128", AVX2, -1, 16, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpgatherdd, INS_vpgatherdd, INS_vpgatherdq, INS_vpgatherdq, INS_vgatherdps, INS_vgatherdpd}, HW_Category_IMM, HW_Flag_SpecialCodeGen|HW_Flag_NoContainment)
487-
HARDWARE_INTRINSIC(AVX2_GatherVector256, "GatherVector256", AVX2, -1, 32, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpgatherdd, INS_vpgatherdd, INS_vpgatherdq, INS_vpgatherdq, INS_vgatherdps, INS_vgatherdpd}, HW_Category_IMM, HW_Flag_MaybeMemoryLoad|HW_Flag_SpecialCodeGen|HW_Flag_NoContainment)
488-
HARDWARE_INTRINSIC(AVX2_GatherMaskVector128, "GatherMaskVector128", AVX2, -1, 16, 5, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpgatherdd, INS_vpgatherdd, INS_vpgatherdq, INS_vpgatherdq, INS_vgatherdps, INS_vgatherdpd}, HW_Category_IMM, HW_Flag_MaybeMemoryLoad|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_NoContainment)
489-
HARDWARE_INTRINSIC(AVX2_GatherMaskVector256, "GatherMaskVector256", AVX2, -1, 32, 5, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpgatherdd, INS_vpgatherdd, INS_vpgatherdq, INS_vpgatherdq, INS_vgatherdps, INS_vgatherdpd}, HW_Category_IMM, HW_Flag_MaybeMemoryLoad|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_NoContainment)
486+
HARDWARE_INTRINSIC(AVX2_GatherVector128, "GatherVector128", AVX2, -1, 16, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpgatherdd, INS_vpgatherdd, INS_vpgatherdq, INS_vpgatherdq, INS_vgatherdps, INS_vgatherdpd}, HW_Category_IMM, HW_Flag_SpecialCodeGen|HW_Flag_NoContainment)
487+
HARDWARE_INTRINSIC(AVX2_GatherVector256, "GatherVector256", AVX2, -1, 32, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpgatherdd, INS_vpgatherdd, INS_vpgatherdq, INS_vpgatherdq, INS_vgatherdps, INS_vgatherdpd}, HW_Category_IMM, HW_Flag_MaybeMemoryLoad|HW_Flag_SpecialCodeGen|HW_Flag_NoContainment)
488+
HARDWARE_INTRINSIC(AVX2_GatherMaskVector128, "GatherMaskVector128", AVX2, -1, 16, 5, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpgatherdd, INS_vpgatherdd, INS_vpgatherdq, INS_vpgatherdq, INS_vgatherdps, INS_vgatherdpd}, HW_Category_IMM, HW_Flag_MaybeMemoryLoad|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_NoContainment)
489+
HARDWARE_INTRINSIC(AVX2_GatherMaskVector256, "GatherMaskVector256", AVX2, -1, 32, 5, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpgatherdd, INS_vpgatherdd, INS_vpgatherdq, INS_vpgatherdq, INS_vgatherdps, INS_vgatherdpd}, HW_Category_IMM, HW_Flag_MaybeMemoryLoad|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_NoContainment)
490490
HARDWARE_INTRINSIC(AVX2_HorizontalAdd, "HorizontalAdd", AVX2, -1, 32, 2, {INS_invalid, INS_invalid, INS_phaddw, INS_invalid, INS_phaddd, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoFlag)
491491
HARDWARE_INTRINSIC(AVX2_HorizontalAddSaturate, "HorizontalAddSaturate", AVX2, -1, 32, 2, {INS_invalid, INS_invalid, INS_phaddsw, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoFlag)
492492
HARDWARE_INTRINSIC(AVX2_HorizontalSubtract, "HorizontalSubtract", AVX2, -1, 32, 2, {INS_invalid, INS_invalid, INS_phsubw, INS_invalid, INS_phsubd, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoFlag)

src/coreclr/src/jit/jitconfigvalues.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ CONFIG_INTEGER(ShouldInjectFault, W("InjectFault"), 0)
135135
CONFIG_INTEGER(StressCOMCall, W("StressCOMCall"), 0)
136136
CONFIG_INTEGER(TailcallStress, W("TailcallStress"), 0)
137137
CONFIG_INTEGER(TreesBeforeAfterMorph, W("JitDumpBeforeAfterMorph"), 0) // If 1, display each tree before/after morphing
138+
138139
CONFIG_METHODSET(JitBreak, W("JitBreak")) // Stops in the importer when compiling a specified method
139140
CONFIG_METHODSET(JitDebugBreak, W("JitDebugBreak"))
140141
CONFIG_METHODSET(JitDisasm, W("JitDisasm")) // Dumps disassembly for specified method
@@ -275,6 +276,14 @@ CONFIG_INTEGER(EnableArm64Sve, W("EnableArm64Sve"), 1)
275276

276277
// clang-format on
277278

279+
#ifdef FEATURE_SIMD
280+
CONFIG_INTEGER(JitDisableSimdVN, W("JitDisableSimdVN"), 0) // Default 0, ValueNumbering of SIMD nodes and HW Intrinsic
281+
// nodes enabled
282+
// If 1, then disable ValueNumbering of SIMD nodes
283+
// If 2, then disable ValueNumbering of HW Intrinsic nodes
284+
// If 3, disable both SIMD and HW Intrinsic nodes
285+
#endif // FEATURE_SIMD
286+
278287
///
279288
/// JIT
280289
///

0 commit comments

Comments
 (0)