JIT: ensure AVX512 ternary operands aren't used twice (#91883)
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Mon, 11 Sep 2023 23:27:35 +0000 (17:27 -0600)
committerGitHub <noreply@github.com>
Mon, 11 Sep 2023 23:27:35 +0000 (17:27 -0600)
Don't spill unused zeros early; we might decide to use them later.

Fixes #91796.

Co-authored-by: Andy Ayers <andya@microsoft.com>
src/coreclr/jit/hwintrinsicxarch.cpp

index 488f65b..0659999 100644 (file)
@@ -3602,17 +3602,19 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic        intrinsic,
                     op2 = impSIMDPopStack();
                     op1 = impSIMDPopStack();
 
-                    if (unusedVal1)
+                    // Consume operands we won't use, in case they have side effects.
+                    //
+                    if (unusedVal1 && !(*val1)->IsVectorZero())
                     {
                         impAppendTree(gtUnusedValNode(*val1), CHECK_SPILL_ALL, impCurStmtDI);
                     }
 
-                    if (unusedVal2)
+                    if (unusedVal2 && !(*val2)->IsVectorZero())
                     {
                         impAppendTree(gtUnusedValNode(*val2), CHECK_SPILL_ALL, impCurStmtDI);
                     }
 
-                    if (unusedVal3)
+                    if (unusedVal3 && !(*val3)->IsVectorZero())
                     {
                         impAppendTree(gtUnusedValNode(*val3), CHECK_SPILL_ALL, impCurStmtDI);
                     }