[llvm] [TargetLowering] Only freeze LHS and RHS if they are used multiple times (PR #156193)

via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 30 10:45:38 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-x86

Author: AZero13 (AZero13)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/156193.diff


2 Files Affected:

- (modified) llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp (+8-3) 
- (modified) llvm/test/CodeGen/X86/abdu-neg.ll (+27-27) 


``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 402a012e8e555..2fb719d01a5f1 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -9740,8 +9740,8 @@ SDValue TargetLowering::expandABS(SDNode *N, SelectionDAG &DAG,
 SDValue TargetLowering::expandABD(SDNode *N, SelectionDAG &DAG) const {
   SDLoc dl(N);
   EVT VT = N->getValueType(0);
-  SDValue LHS = DAG.getFreeze(N->getOperand(0));
-  SDValue RHS = DAG.getFreeze(N->getOperand(1));
+  SDValue LHS = N->getOperand(0);
+  SDValue RHS = N->getOperand(1);
   bool IsSigned = N->getOpcode() == ISD::ABDS;
 
   // abds(lhs, rhs) -> sub(smax(lhs,rhs), smin(lhs,rhs))
@@ -9749,16 +9749,21 @@ SDValue TargetLowering::expandABD(SDNode *N, SelectionDAG &DAG) const {
   unsigned MaxOpc = IsSigned ? ISD::SMAX : ISD::UMAX;
   unsigned MinOpc = IsSigned ? ISD::SMIN : ISD::UMIN;
   if (isOperationLegal(MaxOpc, VT) && isOperationLegal(MinOpc, VT)) {
+    LHS = DAG.getFreeze(LHS);
+    RHS = DAG.getFreeze(RHS);
     SDValue Max = DAG.getNode(MaxOpc, dl, VT, LHS, RHS);
     SDValue Min = DAG.getNode(MinOpc, dl, VT, LHS, RHS);
     return DAG.getNode(ISD::SUB, dl, VT, Max, Min);
   }
 
   // abdu(lhs, rhs) -> or(usubsat(lhs,rhs), usubsat(rhs,lhs))
-  if (!IsSigned && isOperationLegal(ISD::USUBSAT, VT))
+  if (!IsSigned && isOperationLegal(ISD::USUBSAT, VT)) {
+    LHS = DAG.getFreeze(LHS);
+    RHS = DAG.getFreeze(RHS);
     return DAG.getNode(ISD::OR, dl, VT,
                        DAG.getNode(ISD::USUBSAT, dl, VT, LHS, RHS),
                        DAG.getNode(ISD::USUBSAT, dl, VT, RHS, LHS));
+  }
 
   // If the subtract doesn't overflow then just use abs(sub())
   // NOTE: don't use frozen operands for value tracking.
diff --git a/llvm/test/CodeGen/X86/abdu-neg.ll b/llvm/test/CodeGen/X86/abdu-neg.ll
index b7c34070f1af6..b6483c3acc77c 100644
--- a/llvm/test/CodeGen/X86/abdu-neg.ll
+++ b/llvm/test/CodeGen/X86/abdu-neg.ll
@@ -363,10 +363,10 @@ define i128 @abd_ext_i128(i128 %a, i128 %b) nounwind {
 ; X86-NEXT:    subl $16, %esp
 ; X86-NEXT:    movl 32(%ebp), %esi
 ; X86-NEXT:    movl 36(%ebp), %eax
-; X86-NEXT:    movl 24(%ebp), %ecx
+; X86-NEXT:    movl 24(%ebp), %edx
 ; X86-NEXT:    movl 28(%ebp), %edi
-; X86-NEXT:    xorl %edx, %edx
-; X86-NEXT:    subl 40(%ebp), %ecx
+; X86-NEXT:    xorl %ecx, %ecx
+; X86-NEXT:    subl 40(%ebp), %edx
 ; X86-NEXT:    sbbl 44(%ebp), %edi
 ; X86-NEXT:    sbbl 48(%ebp), %esi
 ; X86-NEXT:    sbbl 52(%ebp), %eax
@@ -375,22 +375,22 @@ define i128 @abd_ext_i128(i128 %a, i128 %b) nounwind {
 ; X86-NEXT:    xorl %ebx, %eax
 ; X86-NEXT:    xorl %ebx, %esi
 ; X86-NEXT:    xorl %ebx, %edi
-; X86-NEXT:    xorl %ebx, %ecx
-; X86-NEXT:    subl %ebx, %ecx
+; X86-NEXT:    xorl %ebx, %edx
+; X86-NEXT:    subl %ebx, %edx
 ; X86-NEXT:    sbbl %ebx, %edi
 ; X86-NEXT:    sbbl %ebx, %esi
 ; X86-NEXT:    sbbl %ebx, %eax
-; X86-NEXT:    negl %ecx
+; X86-NEXT:    negl %edx
 ; X86-NEXT:    movl $0, %ebx
 ; X86-NEXT:    sbbl %edi, %ebx
 ; X86-NEXT:    movl $0, %edi
 ; X86-NEXT:    sbbl %esi, %edi
-; X86-NEXT:    sbbl %eax, %edx
+; X86-NEXT:    sbbl %eax, %ecx
 ; X86-NEXT:    movl 8(%ebp), %eax
-; X86-NEXT:    movl %ecx, (%eax)
+; X86-NEXT:    movl %edx, (%eax)
 ; X86-NEXT:    movl %ebx, 4(%eax)
 ; X86-NEXT:    movl %edi, 8(%eax)
-; X86-NEXT:    movl %edx, 12(%eax)
+; X86-NEXT:    movl %ecx, 12(%eax)
 ; X86-NEXT:    leal -12(%ebp), %esp
 ; X86-NEXT:    popl %esi
 ; X86-NEXT:    popl %edi
@@ -435,10 +435,10 @@ define i128 @abd_ext_i128_undef(i128 %a, i128 %b) nounwind {
 ; X86-NEXT:    subl $16, %esp
 ; X86-NEXT:    movl 32(%ebp), %esi
 ; X86-NEXT:    movl 36(%ebp), %eax
-; X86-NEXT:    movl 24(%ebp), %ecx
+; X86-NEXT:    movl 24(%ebp), %edx
 ; X86-NEXT:    movl 28(%ebp), %edi
-; X86-NEXT:    xorl %edx, %edx
-; X86-NEXT:    subl 40(%ebp), %ecx
+; X86-NEXT:    xorl %ecx, %ecx
+; X86-NEXT:    subl 40(%ebp), %edx
 ; X86-NEXT:    sbbl 44(%ebp), %edi
 ; X86-NEXT:    sbbl 48(%ebp), %esi
 ; X86-NEXT:    sbbl 52(%ebp), %eax
@@ -447,22 +447,22 @@ define i128 @abd_ext_i128_undef(i128 %a, i128 %b) nounwind {
 ; X86-NEXT:    xorl %ebx, %eax
 ; X86-NEXT:    xorl %ebx, %esi
 ; X86-NEXT:    xorl %ebx, %edi
-; X86-NEXT:    xorl %ebx, %ecx
-; X86-NEXT:    subl %ebx, %ecx
+; X86-NEXT:    xorl %ebx, %edx
+; X86-NEXT:    subl %ebx, %edx
 ; X86-NEXT:    sbbl %ebx, %edi
 ; X86-NEXT:    sbbl %ebx, %esi
 ; X86-NEXT:    sbbl %ebx, %eax
-; X86-NEXT:    negl %ecx
+; X86-NEXT:    negl %edx
 ; X86-NEXT:    movl $0, %ebx
 ; X86-NEXT:    sbbl %edi, %ebx
 ; X86-NEXT:    movl $0, %edi
 ; X86-NEXT:    sbbl %esi, %edi
-; X86-NEXT:    sbbl %eax, %edx
+; X86-NEXT:    sbbl %eax, %ecx
 ; X86-NEXT:    movl 8(%ebp), %eax
-; X86-NEXT:    movl %ecx, (%eax)
+; X86-NEXT:    movl %edx, (%eax)
 ; X86-NEXT:    movl %ebx, 4(%eax)
 ; X86-NEXT:    movl %edi, 8(%eax)
-; X86-NEXT:    movl %edx, 12(%eax)
+; X86-NEXT:    movl %ecx, 12(%eax)
 ; X86-NEXT:    leal -12(%ebp), %esp
 ; X86-NEXT:    popl %esi
 ; X86-NEXT:    popl %edi
@@ -847,10 +847,10 @@ define i128 @abd_cmp_i128(i128 %a, i128 %b) nounwind {
 ; X86-NEXT:    subl $16, %esp
 ; X86-NEXT:    movl 32(%ebp), %esi
 ; X86-NEXT:    movl 36(%ebp), %eax
-; X86-NEXT:    movl 24(%ebp), %ecx
+; X86-NEXT:    movl 24(%ebp), %edx
 ; X86-NEXT:    movl 28(%ebp), %edi
-; X86-NEXT:    xorl %edx, %edx
-; X86-NEXT:    subl 40(%ebp), %ecx
+; X86-NEXT:    xorl %ecx, %ecx
+; X86-NEXT:    subl 40(%ebp), %edx
 ; X86-NEXT:    sbbl 44(%ebp), %edi
 ; X86-NEXT:    sbbl 48(%ebp), %esi
 ; X86-NEXT:    sbbl 52(%ebp), %eax
@@ -859,22 +859,22 @@ define i128 @abd_cmp_i128(i128 %a, i128 %b) nounwind {
 ; X86-NEXT:    xorl %ebx, %eax
 ; X86-NEXT:    xorl %ebx, %esi
 ; X86-NEXT:    xorl %ebx, %edi
-; X86-NEXT:    xorl %ebx, %ecx
-; X86-NEXT:    subl %ebx, %ecx
+; X86-NEXT:    xorl %ebx, %edx
+; X86-NEXT:    subl %ebx, %edx
 ; X86-NEXT:    sbbl %ebx, %edi
 ; X86-NEXT:    sbbl %ebx, %esi
 ; X86-NEXT:    sbbl %ebx, %eax
-; X86-NEXT:    negl %ecx
+; X86-NEXT:    negl %edx
 ; X86-NEXT:    movl $0, %ebx
 ; X86-NEXT:    sbbl %edi, %ebx
 ; X86-NEXT:    movl $0, %edi
 ; X86-NEXT:    sbbl %esi, %edi
-; X86-NEXT:    sbbl %eax, %edx
+; X86-NEXT:    sbbl %eax, %ecx
 ; X86-NEXT:    movl 8(%ebp), %eax
-; X86-NEXT:    movl %ecx, (%eax)
+; X86-NEXT:    movl %edx, (%eax)
 ; X86-NEXT:    movl %ebx, 4(%eax)
 ; X86-NEXT:    movl %edi, 8(%eax)
-; X86-NEXT:    movl %edx, 12(%eax)
+; X86-NEXT:    movl %ecx, 12(%eax)
 ; X86-NEXT:    leal -12(%ebp), %esp
 ; X86-NEXT:    popl %esi
 ; X86-NEXT:    popl %edi

``````````

</details>


https://github.com/llvm/llvm-project/pull/156193


More information about the llvm-commits mailing list