[DAGCombiner][X86] Fold (sub (subcarry X, 0, Carry), Y) -> (subcarry X, Y, Carry)

Fixes PR57576.

Differential Revision: https://reviews.llvm.org/D133471
This commit is contained in:
Craig Topper 2022-09-08 22:56:46 -07:00
parent 864236d1c1
commit aa83bdd198
2 changed files with 7 additions and 2 deletions

View File

@ -3753,6 +3753,12 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
return DAG.getNode(ISD::ADD, DL, VT, N1, N0);
}
// (sub (subcarry X, 0, Carry), Y) -> (subcarry X, Y, Carry)
if (N0.getOpcode() == ISD::SUBCARRY && isNullConstant(N0.getOperand(1)) &&
N0.getResNo() == 0 && N0.hasOneUse())
return DAG.getNode(ISD::SUBCARRY, DL, N0->getVTList(),
N0.getOperand(0), N1, N0.getOperand(2));
if (TLI.isOperationLegalOrCustom(ISD::ADDCARRY, VT)) {
// (sub Carry, X) -> (addcarry (sub 0, X), 0, Carry)
if (SDValue Carry = getAsCarry(TLI, N0)) {

View File

@ -6,8 +6,7 @@ define { i64, i64 } @sub(i64 noundef %0, i64 noundef %1, i64 noundef %2, i64 nou
; CHECK: # %bb.0:
; CHECK-NEXT: movq %rdi, %rax
; CHECK-NEXT: subq %rdx, %rax
; CHECK-NEXT: sbbq $0, %rsi
; CHECK-NEXT: subq %rcx, %rsi
; CHECK-NEXT: sbbq %rcx, %rsi
; CHECK-NEXT: movq %rsi, %rdx
; CHECK-NEXT: retq
%5 = zext i64 %1 to i128