From a8e701023950ed892c1a8bb6a5e9075ec7eec772 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Mon, 18 May 2026 10:17:30 -0700 Subject: [PATCH 1/2] Only track a single target preference --- src/coreclr/jit/lsrabuild.cpp | 19 ++++++++++++++++--- src/coreclr/jit/lsraxarch.cpp | 7 ------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/coreclr/jit/lsrabuild.cpp b/src/coreclr/jit/lsrabuild.cpp index 3ff89b315e0c63..03fbed04b20532 100644 --- a/src/coreclr/jit/lsrabuild.cpp +++ b/src/coreclr/jit/lsrabuild.cpp @@ -3083,9 +3083,22 @@ RefPosition* LinearScan::BuildDef(GenTree* tree, SingleTypeRegSet dstCandidates, } #ifndef TARGET_ARM - setTgtPref(interval, tgtPrefUse); - setTgtPref(interval, tgtPrefUse2); - setTgtPref(interval, tgtPrefUse3); + // Some paths can have multiple operands as the tgtPref + // but we only want to track one of them and to preference + // the first use as that improves CQ the most. + + if (tgtPrefUse != nullptr) + { + setTgtPref(interval, tgtPrefUse); + } + else if (tgtPrefUse2 != nullptr) + { + setTgtPref(interval, tgtPrefUse2); + } + else if (tgtPrefUse3 != nullptr) + { + setTgtPref(interval, tgtPrefUse3); + } #endif // !TARGET_ARM #if FEATURE_PARTIAL_SIMD_CALLEE_SAVE diff --git a/src/coreclr/jit/lsraxarch.cpp b/src/coreclr/jit/lsraxarch.cpp index 02aee985e6ef71..c9cd8962c28904 100644 --- a/src/coreclr/jit/lsraxarch.cpp +++ b/src/coreclr/jit/lsraxarch.cpp @@ -967,13 +967,6 @@ int LinearScan::BuildSelect(GenTreeOp* select) srcCount++; } - if ((tgtPrefUse != nullptr) && (tgtPrefUse2 != nullptr)) - { - // CQ analysis shows that it's best to always prefer only the 'true' - // val here. - tgtPrefUse2 = nullptr; - } - // Codegen will emit something like: // // mov dstReg, falseVal From f6c251ed7f2576256e0a550d6cd138c175faf006 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Mon, 18 May 2026 15:15:43 -0700 Subject: [PATCH 2/2] Check allowing tgtPrefUse2 for BuildSelect --- src/coreclr/jit/lsrabuild.cpp | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/coreclr/jit/lsrabuild.cpp b/src/coreclr/jit/lsrabuild.cpp index 03fbed04b20532..3ff89b315e0c63 100644 --- a/src/coreclr/jit/lsrabuild.cpp +++ b/src/coreclr/jit/lsrabuild.cpp @@ -3083,22 +3083,9 @@ RefPosition* LinearScan::BuildDef(GenTree* tree, SingleTypeRegSet dstCandidates, } #ifndef TARGET_ARM - // Some paths can have multiple operands as the tgtPref - // but we only want to track one of them and to preference - // the first use as that improves CQ the most. - - if (tgtPrefUse != nullptr) - { - setTgtPref(interval, tgtPrefUse); - } - else if (tgtPrefUse2 != nullptr) - { - setTgtPref(interval, tgtPrefUse2); - } - else if (tgtPrefUse3 != nullptr) - { - setTgtPref(interval, tgtPrefUse3); - } + setTgtPref(interval, tgtPrefUse); + setTgtPref(interval, tgtPrefUse2); + setTgtPref(interval, tgtPrefUse3); #endif // !TARGET_ARM #if FEATURE_PARTIAL_SIMD_CALLEE_SAVE