[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