[llvm] [X86] abs i8 - perform as abs i32 if we have access to CMOV (PR #95101)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 11 05:11:02 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-x86
Author: Simon Pilgrim (RKSimon)
<details>
<summary>Changes</summary>
Requires a minor tweak to combineSubABS to handle post truncation patterns.
---
Full diff: https://github.com/llvm/llvm-project/pull/95101.diff
6 Files Affected:
- (modified) llvm/lib/Target/X86/X86ISelLowering.cpp (+18-4)
- (modified) llvm/test/CodeGen/X86/abds.ll (+20-20)
- (modified) llvm/test/CodeGen/X86/abs.ll (+121-135)
- (modified) llvm/test/CodeGen/X86/iabs.ll (+21-13)
- (modified) llvm/test/CodeGen/X86/icmp-abs-C.ll (+9-9)
- (modified) llvm/test/CodeGen/X86/neg-abs.ll (+10-8)
``````````diff
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 2ed79385272fa..8426825dd118c 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -225,6 +225,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
// Integer absolute.
if (Subtarget.canUseCMOV()) {
+ setOperationAction(ISD::ABS , MVT::i8 , Custom);
setOperationAction(ISD::ABS , MVT::i16 , Custom);
setOperationAction(ISD::ABS , MVT::i32 , Custom);
if (Subtarget.is64Bit())
@@ -28211,9 +28212,14 @@ static SDValue LowerABS(SDValue Op, const X86Subtarget &Subtarget,
MVT VT = Op.getSimpleValueType();
SDLoc DL(Op);
+ // Since X86 does not have CMOV for 8-bit integer, promote to 32-bit.
+ if (VT == MVT::i8)
+ return DAG.getNode(ISD::TRUNCATE, DL, VT,
+ DAG.getNode(ISD::ABS, DL, MVT::i32,
+ DAG.getNode(ISD::SIGN_EXTEND, DL, MVT::i32,
+ Op.getOperand(0))));
+
if (VT == MVT::i16 || VT == MVT::i32 || VT == MVT::i64) {
- // Since X86 does not have CMOV for 8-bit integer, we don't convert
- // 8-bit integer abs to NEG and CMOV.
SDValue N0 = Op.getOperand(0);
SDValue Neg = DAG.getNode(X86ISD::SUB, DL, DAG.getVTList(VT, MVT::i32),
DAG.getConstant(0, DL, VT), N0);
@@ -55559,6 +55565,10 @@ static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
static SDValue combineSubABS(SDNode *N, SelectionDAG &DAG) {
SDValue N0 = N->getOperand(0);
SDValue N1 = N->getOperand(1);
+ EVT OriginalVT = N->getValueType(0);
+
+ if (N1.getOpcode() == ISD::TRUNCATE)
+ N1 = N1.getOperand(0);
if (N1.getOpcode() != X86ISD::CMOV || !N1.hasOneUse())
return SDValue();
@@ -55586,11 +55596,15 @@ static SDValue combineSubABS(SDNode *N, SelectionDAG &DAG) {
// Build a new CMOV with the operands swapped.
SDLoc DL(N);
- MVT VT = N->getSimpleValueType(0);
+ MVT VT = N1.getSimpleValueType();
SDValue Cmov = DAG.getNode(X86ISD::CMOV, DL, VT, TrueOp, FalseOp,
N1.getOperand(2), Cond);
+
+ if (OriginalVT != VT)
+ Cmov = DAG.getNode(ISD::TRUNCATE, DL, OriginalVT, Cmov);
+
// Convert sub to add.
- return DAG.getNode(ISD::ADD, DL, VT, N0, Cmov);
+ return DAG.getNode(ISD::ADD, DL, OriginalVT, N0, Cmov);
}
static SDValue combineSubSetcc(SDNode *N, SelectionDAG &DAG) {
diff --git a/llvm/test/CodeGen/X86/abds.ll b/llvm/test/CodeGen/X86/abds.ll
index a80339427984a..a39b9bc3483c1 100644
--- a/llvm/test/CodeGen/X86/abds.ll
+++ b/llvm/test/CodeGen/X86/abds.ll
@@ -640,20 +640,20 @@ define i8 @abd_subnsw_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: subb {{[0-9]+}}(%esp), %al
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: sarb $7, %cl
-; X86-NEXT: xorb %cl, %al
-; X86-NEXT: subb %cl, %al
+; X86-NEXT: movsbl %al, %ecx
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: negl %eax
+; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_subnsw_i8:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: subb %sil, %al
-; X64-NEXT: movl %eax, %ecx
-; X64-NEXT: sarb $7, %cl
-; X64-NEXT: xorb %cl, %al
-; X64-NEXT: subb %cl, %al
+; X64-NEXT: subb %sil, %dil
+; X64-NEXT: movsbl %dil, %ecx
+; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: negl %eax
+; X64-NEXT: cmovsl %ecx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%sub = sub nsw i8 %a, %b
@@ -666,20 +666,20 @@ define i8 @abd_subnsw_i8_undef(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: subb {{[0-9]+}}(%esp), %al
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: sarb $7, %cl
-; X86-NEXT: xorb %cl, %al
-; X86-NEXT: subb %cl, %al
+; X86-NEXT: movsbl %al, %ecx
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: negl %eax
+; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_subnsw_i8_undef:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: subb %sil, %al
-; X64-NEXT: movl %eax, %ecx
-; X64-NEXT: sarb $7, %cl
-; X64-NEXT: xorb %cl, %al
-; X64-NEXT: subb %cl, %al
+; X64-NEXT: subb %sil, %dil
+; X64-NEXT: movsbl %dil, %ecx
+; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: negl %eax
+; X64-NEXT: cmovsl %ecx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%sub = sub nsw i8 %a, %b
diff --git a/llvm/test/CodeGen/X86/abs.ll b/llvm/test/CodeGen/X86/abs.ll
index dde877c5bb61e..b8f25f619d4a7 100644
--- a/llvm/test/CodeGen/X86/abs.ll
+++ b/llvm/test/CodeGen/X86/abs.ll
@@ -25,21 +25,20 @@ declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1)
define i8 @test_i8(i8 %a) nounwind {
; X64-LABEL: test_i8:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: movl %eax, %ecx
-; X64-NEXT: sarb $7, %cl
-; X64-NEXT: xorb %cl, %al
-; X64-NEXT: subb %cl, %al
+; X64-NEXT: movsbl %dil, %ecx
+; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: negl %eax
+; X64-NEXT: cmovsl %ecx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
;
; X86-LABEL: test_i8:
; X86: # %bb.0:
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: sarb $7, %cl
-; X86-NEXT: xorb %cl, %al
-; X86-NEXT: subb %cl, %al
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: negl %eax
+; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
%r = call i8 @llvm.abs.i8(i8 %a, i1 false)
ret i8 %r
@@ -485,127 +484,120 @@ define <16 x i8> @test_v16i8(<16 x i8> %a) nounwind {
;
; X86-LABEL: test_v16i8:
; X86: # %bb.0:
+; X86-NEXT: pushl %ebp
; X86-NEXT: pushl %ebx
-; X86-NEXT: subl $12, %esp
-; X86-NEXT: movb {{[0-9]+}}(%esp), %bh
-; X86-NEXT: movb {{[0-9]+}}(%esp), %bl
-; X86-NEXT: movb {{[0-9]+}}(%esp), %dh
-; X86-NEXT: movb {{[0-9]+}}(%esp), %ch
-; X86-NEXT: movb {{[0-9]+}}(%esp), %ah
-; X86-NEXT: movb {{[0-9]+}}(%esp), %dl
-; X86-NEXT: movb {{[0-9]+}}(%esp), %cl
-; X86-NEXT: movb %cl, %al
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %cl
-; X86-NEXT: subb %al, %cl
-; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: movb %dl, %al
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %dl
-; X86-NEXT: subb %al, %dl
-; X86-NEXT: movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: movb %ah, %al
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %ah
-; X86-NEXT: subb %al, %ah
-; X86-NEXT: movb %ah, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: movb %ch, %al
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %ch
-; X86-NEXT: subb %al, %ch
-; X86-NEXT: movb %ch, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: movb %dh, %al
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %dh
-; X86-NEXT: subb %al, %dh
-; X86-NEXT: movb %dh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: movl %ebx, %eax
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %bl
-; X86-NEXT: subb %al, %bl
-; X86-NEXT: movb %bl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: movb %bh, %al
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %bh
-; X86-NEXT: subb %al, %bh
-; X86-NEXT: movb %bh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %cl
-; X86-NEXT: subb %al, %cl
-; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %cl
-; X86-NEXT: subb %al, %cl
-; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %cl
-; X86-NEXT: subb %al, %cl
-; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: movb {{[0-9]+}}(%esp), %bh
-; X86-NEXT: movb %bh, %al
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %bh
-; X86-NEXT: subb %al, %bh
-; X86-NEXT: movb {{[0-9]+}}(%esp), %bl
-; X86-NEXT: movl %ebx, %eax
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %bl
-; X86-NEXT: subb %al, %bl
-; X86-NEXT: movb {{[0-9]+}}(%esp), %dh
-; X86-NEXT: movb %dh, %al
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %dh
-; X86-NEXT: subb %al, %dh
-; X86-NEXT: movb {{[0-9]+}}(%esp), %ch
-; X86-NEXT: movb %ch, %al
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %ch
-; X86-NEXT: subb %al, %ch
-; X86-NEXT: movb {{[0-9]+}}(%esp), %dl
-; X86-NEXT: movl %edx, %eax
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %dl
-; X86-NEXT: subb %al, %dl
-; X86-NEXT: movb {{[0-9]+}}(%esp), %cl
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: sarb $7, %al
-; X86-NEXT: xorb %al, %cl
-; X86-NEXT: subb %al, %cl
+; X86-NEXT: pushl %edi
+; X86-NEXT: pushl %esi
+; X86-NEXT: subl $40, %esp
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %esi
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %edi
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ebx
+; X86-NEXT: movl %ebx, %ebp
+; X86-NEXT: negl %ebp
+; X86-NEXT: cmovsl %ebx, %ebp
+; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %edi, %ebx
+; X86-NEXT: negl %ebx
+; X86-NEXT: cmovsl %edi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %esi, %edi
+; X86-NEXT: negl %edi
+; X86-NEXT: cmovsl %esi, %edi
+; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %edx, %esi
+; X86-NEXT: negl %esi
+; X86-NEXT: cmovsl %edx, %esi
+; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: negl %edx
+; X86-NEXT: cmovsl %ecx, %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: negl %ecx
+; X86-NEXT: cmovsl %eax, %ecx
+; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: negl %ecx
+; X86-NEXT: cmovsl %eax, %ecx
+; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: negl %ecx
+; X86-NEXT: cmovsl %eax, %ecx
+; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: negl %ecx
+; X86-NEXT: cmovsl %eax, %ecx
+; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: negl %ecx
+; X86-NEXT: cmovsl %eax, %ecx
+; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %ebp
+; X86-NEXT: negl %ebp
+; X86-NEXT: cmovsl %eax, %ebp
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %edi
+; X86-NEXT: negl %edi
+; X86-NEXT: cmovsl %eax, %edi
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %esi
+; X86-NEXT: negl %esi
+; X86-NEXT: cmovsl %eax, %esi
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %ebx
+; X86-NEXT: negl %ebx
+; X86-NEXT: cmovsl %eax, %ebx
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %edx
+; X86-NEXT: negl %edx
+; X86-NEXT: cmovsl %eax, %edx
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: negl %ecx
+; X86-NEXT: cmovsl %eax, %ecx
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movb %cl, 15(%eax)
; X86-NEXT: movb %dl, 14(%eax)
-; X86-NEXT: movb %ch, 13(%eax)
-; X86-NEXT: movb %dh, 12(%eax)
-; X86-NEXT: movb %bl, 11(%eax)
-; X86-NEXT: movb %bh, 10(%eax)
-; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload
+; X86-NEXT: movb %bl, 13(%eax)
+; X86-NEXT: movl %esi, %ecx
+; X86-NEXT: movb %cl, 12(%eax)
+; X86-NEXT: movl %edi, %ecx
+; X86-NEXT: movb %cl, 11(%eax)
+; X86-NEXT: movl %ebp, %ecx
+; X86-NEXT: movb %cl, 10(%eax)
+; X86-NEXT: movl (%esp), %ecx # 4-byte Reload
; X86-NEXT: movb %cl, 9(%eax)
-; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
; X86-NEXT: movb %cl, 8(%eax)
-; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
; X86-NEXT: movb %cl, 7(%eax)
-; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
; X86-NEXT: movb %cl, 6(%eax)
-; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
; X86-NEXT: movb %cl, 5(%eax)
-; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
; X86-NEXT: movb %cl, 4(%eax)
-; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
; X86-NEXT: movb %cl, 3(%eax)
-; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
; X86-NEXT: movb %cl, 2(%eax)
-; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
; X86-NEXT: movb %cl, 1(%eax)
-; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
; X86-NEXT: movb %cl, (%eax)
-; X86-NEXT: addl $12, %esp
+; X86-NEXT: addl $40, %esp
+; X86-NEXT: popl %esi
+; X86-NEXT: popl %edi
; X86-NEXT: popl %ebx
+; X86-NEXT: popl %ebp
; X86-NEXT: retl $4
%r = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %a, i1 false)
ret <16 x i8> %r
@@ -713,32 +705,26 @@ define i128 @test_sextinreg_i128(i128 %a) nounwind {
define i8 @test_minsigned_i8(i8 %a0, i8 %a1) nounwind {
; X64-LABEL: test_minsigned_i8:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: sarb $7, %al
-; X64-NEXT: movl %edi, %ecx
-; X64-NEXT: xorb %al, %cl
-; X64-NEXT: subb %al, %cl
-; X64-NEXT: cmpb $-128, %dil
-; X64-NEXT: movzbl %cl, %eax
+; X64-NEXT: movsbl %dil, %ecx
+; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: negl %eax
+; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: cmpb $-128, %cl
; X64-NEXT: cmovel %esi, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
;
; X86-LABEL: test_minsigned_i8:
; X86: # %bb.0:
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: cmpb $-128, %al
-; X86-NEXT: jne .LBB17_1
-; X86-NEXT: # %bb.2:
+; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: negl %eax
+; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: cmpb $-128, %cl
+; X86-NEXT: jne .LBB17_2
+; X86-NEXT: # %bb.1:
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: # kill: def $al killed $al killed $eax
-; X86-NEXT: retl
-; X86-NEXT: .LBB17_1:
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: sarb $7, %cl
-; X86-NEXT: xorb %cl, %al
-; X86-NEXT: subb %cl, %al
-; X86-NEXT: movzbl %al, %eax
+; X86-NEXT: .LBB17_2:
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
%lim = icmp eq i8 %a0, -128
diff --git a/llvm/test/CodeGen/X86/iabs.ll b/llvm/test/CodeGen/X86/iabs.ll
index 55c318e87a5a0..5da2fc4aabf78 100644
--- a/llvm/test/CodeGen/X86/iabs.ll
+++ b/llvm/test/CodeGen/X86/iabs.ll
@@ -10,22 +10,30 @@
;; ret
; rdar://10695237
define i8 @test_i8(i8 %a) nounwind {
-; X86-LABEL: test_i8:
-; X86: # %bb.0:
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: sarb $7, %cl
-; X86-NEXT: xorb %cl, %al
-; X86-NEXT: subb %cl, %al
-; X86-NEXT: retl
+; X86-NO-CMOV-LABEL: test_i8:
+; X86-NO-CMOV: # %bb.0:
+; X86-NO-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax
+; X86-NO-CMOV-NEXT: movl %eax, %ecx
+; X86-NO-CMOV-NEXT: sarb $7, %cl
+; X86-NO-CMOV-NEXT: xorb %cl, %al
+; X86-NO-CMOV-NEXT: subb %cl, %al
+; X86-NO-CMOV-NEXT: retl
+;
+; X86-CMOV-LABEL: test_i8:
+; X86-CMOV: # %bb.0:
+; X86-CMOV-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
+; X86-CMOV-NEXT: movl %ecx, %eax
+; X86-CMOV-NEXT: negl %eax
+; X86-CMOV-NEXT: cmovsl %ecx, %eax
+; X86-CMOV-NEXT: # kill: def $al killed $al killed $eax
+; X86-CMOV-NEXT: retl
;
; X64-LABEL: test_i8:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: movl %eax, %ecx
-; X64-NEXT: sarb $7, %cl
-; X64-NEXT: xorb %cl, %al
-; X64-NEXT: subb %cl, %al
+; X64-NEXT: movsbl %dil, %ecx
+; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: negl %eax
+; X64-NEXT: cmovsl %ecx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%tmp1neg = sub i8 0, %a
diff --git a/llvm/test/CodeGen/X86/icmp-abs-C.ll b/llvm/test/CodeGen/X86/icmp-abs-C.ll
index 53b70fa38958b..9ac6d8704015e 100644
--- a/llvm/test/CodeGen/X86/icmp-abs-C.ll
+++ b/llvm/test/CodeGen/X86/icmp-abs-C.ll
@@ -132,17 +132,17 @@ define i8 @ne_and_with_dom_abs_non_pow2(i8 %x) nounwind {
;
; X64-LABEL: ne_and_with_dom_abs_non_pow2:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: sarb $7, %al
-; X64-NEXT: xorb %al, %dil
-; X64-NEXT: subb %al, %dil
-; X64-NEXT: movl %edi, %ecx
-; X64-NEXT: xorb $12, %cl
+; X64-NEXT: movsbl %dil, %eax
+; X64-NEXT: movl %eax, %ecx
+; X64-NEXT: negl %ecx
+; X64-NEXT: cmovsl %eax, %ecx
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: xorb $12, %dl
; X64-NEXT: xorl %eax, %eax
-; X64-NEXT: cmpb $121, %dil
+; X64-NEXT: cmpb $121, %cl
; X64-NEXT: setne %al
-; X64-NEXT: cmpb $24, %cl
-; X64-NEXT: movzbl %cl, %ecx
+; X64-NEXT: cmpb $24, %dl
+; X64-NEXT: movzbl %dl, %ecx
; X64-NEXT: cmovael %ecx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
diff --git a/llvm/test/CodeGen/X86/neg-abs.ll b/llvm/test/CodeGen/X86/neg-abs.ll
index 961205c50d976..dc62b75366661 100644
--- a/llvm/test/CodeGen/X86/neg-abs.ll
+++ b/llvm/test/CodeGen/X86/neg-abs.ll
@@ -21,10 +21,11 @@ define i8 @neg_abs_i8(i8 %x) nounwind {
;
; X64-LABEL: neg_abs_i8:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: sarb $7, %al
-; X64-NEXT: xorb %al, %dil
-; X64-NEXT: subb %dil, %al
+; X64-NEXT: movsbl %dil, %ecx
+; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: negl %eax
+; X64-NEXT: cmovnsl %ecx, %eax
+; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%abs = tail call i8 @llvm.abs.i8(i8 %x, i1 true)
%neg = sub nsw i8 0, %abs
@@ -164,11 +165,12 @@ define i8 @sub_abs_i8(i8 %x, i8 %y) nounwind {
;
; X64-LABEL: sub_abs_i8:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: sarb $7, %al
-; X64-NEXT: xorb %al, %dil
-; X64-NEXT: subb %dil, %al
+; X64-NEXT: movsbl %dil, %ecx
+; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: negl %eax
+; X64-NEXT: cmovnsl %ecx, %eax
; X64-NEXT: addb %sil, %al
+; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%abs = tail call i8 @llvm.abs.i8(i8 %x, i1 false)
%neg = sub nsw i8 %y, %abs
``````````
</details>
https://github.com/llvm/llvm-project/pull/95101
More information about the llvm-commits
mailing list