@@ -18444,9 +18444,13 @@ unsigned GenTreeVecCon::ElementCount(unsigned simdSize, var_types simdBaseType)
1844418444 return simdSize / genTypeSize(simdBaseType);
1844518445}
1844618446
18447- bool Compiler::IsValidForShuffle(GenTree* indices, unsigned simdSize, var_types simdBaseType) const
18447+ bool Compiler::IsValidForShuffle(GenTree* indices, unsigned simdSize, var_types simdBaseType, bool* canBecomeValid ) const
1844818448{
1844918449#if defined(TARGET_XARCH)
18450+ if (canBecomeValid)
18451+ {
18452+ *canBecomeValid = false;
18453+ }
1845018454 size_t elementSize = genTypeSize(simdBaseType);
1845118455 size_t elementCount = simdSize / elementSize;
1845218456
@@ -18480,11 +18484,20 @@ bool Compiler::IsValidForShuffle(GenTree* indices, unsigned simdSize, var_types
1848018484 if (!indices->IsCnsVec() && !compOpportunisticallyDependsOn(InstructionSet_SSSE3))
1848118485 {
1848218486 // the variable implementation for Vector128 Shuffle always needs SSSE3
18487+ // however, this can become valid later if it becomes constant
18488+ if (canBecomeValid)
18489+ {
18490+ *canBecomeValid = true;
18491+ }
1848318492 return false;
1848418493 }
1848518494 }
1848618495#endif // TARGET_XARCH
1848718496
18497+ if (canBecomeValid)
18498+ {
18499+ *canBecomeValid = true;
18500+ }
1848818501 return true;
1848918502}
1849018503
@@ -25501,14 +25514,14 @@ GenTree* Compiler::gtNewSimdShuffleNodeVariable(
2550125514 else if (elementSize == 8 && simdSize == 16 && compOpportunisticallyDependsOn(InstructionSet_AVX512F_VL))
2550225515 {
2550325516 GenTree* op1Copy = fgMakeMultiUse(&op1); // just use op1 again for the other variable
25504- retNode = gtNewSimdHWIntrinsicNode(type, op1, op2, op1Copy, NI_AVX512F_VL_PermuteVar2x64x2, simdBaseJitType,
25505- simdSize);
25517+ retNode
25518+ = gtNewSimdHWIntrinsicNode(type, op1, op2, op1Copy, NI_AVX512F_VL_PermuteVar2x64x2, simdBaseJitType,
25519+ simdSize);
2550625520 }
2550725521 else if (elementSize == 8 && simdSize == 16 && compOpportunisticallyDependsOn(InstructionSet_AVX10v1))
2550825522 {
2550925523 GenTree* op1Copy = fgMakeMultiUse(&op1); // just use op1 again for the other variable
25510- retNode = gtNewSimdHWIntrinsicNode(type, op1, op2, op1Copy, NI_AVX10v1_PermuteVar2x64x2, simdBaseJitType,
25511- simdSize);
25524+ retNode = gtNewSimdHWIntrinsicNode(type, op1, op2, op1Copy, NI_AVX10v1_PermuteVar2x64x2, simdBaseJitType, simdSize);
2551225525 }
2551325526 else
2551425527 {
0 commit comments