forked from OSchip/llvm-project
[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:
parent
864236d1c1
commit
aa83bdd198
|
@ -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)) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue