forked from OSchip/llvm-project
[DAGCombine] Extend combineCarryDiamond()
In combineCarryDiamond() use getAsCarry() to find more candidates for being a carry flag. Reviewed By: RKSimon Differential Revision: https://reviews.llvm.org/D118362
This commit is contained in:
parent
302ca279cb
commit
afdaa86b77
|
@ -3137,9 +3137,14 @@ static SDValue combineADDCARRYDiamond(DAGCombiner &Combiner, SelectionDAG &DAG,
|
||||||
// Our goal is to identify A, B, and CarryIn and produce ADDCARRY/SUBCARRY with
|
// Our goal is to identify A, B, and CarryIn and produce ADDCARRY/SUBCARRY with
|
||||||
// a single path for carry/borrow out propagation:
|
// a single path for carry/borrow out propagation:
|
||||||
static SDValue combineCarryDiamond(SelectionDAG &DAG, const TargetLowering &TLI,
|
static SDValue combineCarryDiamond(SelectionDAG &DAG, const TargetLowering &TLI,
|
||||||
SDValue Carry0, SDValue Carry1, SDNode *N) {
|
SDValue N0, SDValue N1, SDNode *N) {
|
||||||
if (Carry0.getResNo() != 1 || Carry1.getResNo() != 1)
|
SDValue Carry0 = getAsCarry(TLI, N0);
|
||||||
|
if (!Carry0)
|
||||||
return SDValue();
|
return SDValue();
|
||||||
|
SDValue Carry1 = getAsCarry(TLI, N1);
|
||||||
|
if (!Carry1)
|
||||||
|
return SDValue();
|
||||||
|
|
||||||
unsigned Opcode = Carry0.getOpcode();
|
unsigned Opcode = Carry0.getOpcode();
|
||||||
if (Opcode != Carry1.getOpcode())
|
if (Opcode != Carry1.getOpcode())
|
||||||
return SDValue();
|
return SDValue();
|
||||||
|
|
|
@ -451,12 +451,9 @@ define { i64, i64, i1 } @addcarry_hidden_2x64(i64 %x0, i64 %x1, i64 %y0, i64 %y1
|
||||||
; CHECK-LABEL: addcarry_hidden_2x64:
|
; CHECK-LABEL: addcarry_hidden_2x64:
|
||||||
; CHECK: # %bb.0:
|
; CHECK: # %bb.0:
|
||||||
; CHECK-NEXT: movq %rdi, %rax
|
; CHECK-NEXT: movq %rdi, %rax
|
||||||
; CHECK-NEXT: addq %rcx, %rsi
|
|
||||||
; CHECK-NEXT: setb %dil
|
|
||||||
; CHECK-NEXT: addq %rdx, %rax
|
; CHECK-NEXT: addq %rdx, %rax
|
||||||
; CHECK-NEXT: adcq $0, %rsi
|
; CHECK-NEXT: adcq %rcx, %rsi
|
||||||
; CHECK-NEXT: setb %cl
|
; CHECK-NEXT: setb %cl
|
||||||
; CHECK-NEXT: orb %dil, %cl
|
|
||||||
; CHECK-NEXT: movq %rsi, %rdx
|
; CHECK-NEXT: movq %rsi, %rdx
|
||||||
; CHECK-NEXT: retq
|
; CHECK-NEXT: retq
|
||||||
%t0 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %x0, i64 %y0)
|
%t0 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %x0, i64 %y0)
|
||||||
|
|
Loading…
Reference in New Issue