Skip to content

Commit 2ad1089

Browse files
authored
[X86] Match SETCC_CARRY in addition of SUB when trying to reconstruct LEA (#126551)
As per title. This is not a huge deal at the moment, but becomes one when matching node in topological order in the DAGCombiner, and is generally more stable than the existing.
1 parent 7eadc19 commit 2ad1089

11 files changed

+228
-238
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52011,22 +52011,32 @@ static SDValue combineOr(SDNode *N, SelectionDAG &DAG,
5201152011
if (SDValue R = combineLogicBlendIntoPBLENDV(N, dl, DAG, Subtarget))
5201252012
return R;
5201352013

52014-
// (0 - SetCC) | C -> (zext (not SetCC)) * (C + 1) - 1 if we can get a LEA out of it.
52015-
if ((VT == MVT::i32 || VT == MVT::i64) &&
52016-
N0.getOpcode() == ISD::SUB && N0.hasOneUse() &&
52017-
isNullConstant(N0.getOperand(0))) {
52018-
SDValue Cond = N0.getOperand(1);
52019-
if (Cond.getOpcode() == ISD::ZERO_EXTEND && Cond.hasOneUse())
52020-
Cond = Cond.getOperand(0);
52021-
52022-
if (Cond.getOpcode() == X86ISD::SETCC && Cond.hasOneUse()) {
52023-
if (auto *CN = dyn_cast<ConstantSDNode>(N1)) {
52024-
uint64_t Val = CN->getZExtValue();
52025-
if (Val == 1 || Val == 2 || Val == 3 || Val == 4 || Val == 7 || Val == 8) {
52026-
X86::CondCode CCode = (X86::CondCode)Cond.getConstantOperandVal(0);
52027-
CCode = X86::GetOppositeBranchCondition(CCode);
52028-
SDValue NotCond = getSETCC(CCode, Cond.getOperand(1), SDLoc(Cond), DAG);
52014+
// Combine `(x86isd::setcc_carry) | C` and `(0 - SetCC) | C`
52015+
// into `(zext (not SetCC)) * (C + 1) - 1` if we can get a LEA out of it.
52016+
if ((VT == MVT::i32 || VT == MVT::i64) && N0.hasOneUse()) {
52017+
if (auto *CN = dyn_cast<ConstantSDNode>(N1)) {
52018+
uint64_t Val = CN->getZExtValue();
52019+
if (Val == 1 || Val == 2 || Val == 3 || Val == 4 || Val == 7 ||
52020+
Val == 8) {
52021+
SDValue NotCond;
52022+
if (N0.getOpcode() == X86ISD::SETCC_CARRY &&
52023+
N0.getOperand(1).hasOneUse()) {
52024+
X86::CondCode OldCC = (X86::CondCode)N0.getConstantOperandVal(0);
52025+
X86::CondCode NewCC = X86::GetOppositeBranchCondition(OldCC);
52026+
NotCond = getSETCC(NewCC, N0.getOperand(1), SDLoc(N0), DAG);
52027+
} else if (N0.getOpcode() == ISD::SUB &&
52028+
isNullConstant(N0.getOperand(0))) {
52029+
SDValue Cond = N0.getOperand(1);
52030+
if (Cond.getOpcode() == ISD::ZERO_EXTEND && Cond.hasOneUse())
52031+
Cond = Cond.getOperand(0);
52032+
if (Cond.getOpcode() == X86ISD::SETCC && Cond.hasOneUse()) {
52033+
X86::CondCode OldCC = (X86::CondCode)Cond.getConstantOperandVal(0);
52034+
X86::CondCode NewCC = X86::GetOppositeBranchCondition(OldCC);
52035+
NotCond = getSETCC(NewCC, Cond.getOperand(1), SDLoc(Cond), DAG);
52036+
}
52037+
}
5202952038

52039+
if (NotCond) {
5203052040
SDValue R = DAG.getZExtOrTrunc(NotCond, dl, VT);
5203152041
R = DAG.getNode(ISD::MUL, dl, VT, R, DAG.getConstant(Val + 1, dl, VT));
5203252042
R = DAG.getNode(ISD::SUB, dl, VT, R, DAG.getConstant(1, dl, VT));

llvm/test/CodeGen/X86/memcmp-more-load-pairs-x32.ll

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,9 @@ define i32 @length3(ptr %X, ptr %Y) nounwind {
159159
; X86-NEXT: popl %esi
160160
; X86-NEXT: retl
161161
; X86-NEXT: .LBB9_3: # %res_block
162-
; X86-NEXT: xorl %eax, %eax
163-
; X86-NEXT: cmpw %si, %dx
164-
; X86-NEXT: sbbl %eax, %eax
165-
; X86-NEXT: orl $1, %eax
162+
; X86-NEXT: setae %al
163+
; X86-NEXT: movzbl %al, %eax
164+
; X86-NEXT: leal -1(%eax,%eax), %eax
166165
; X86-NEXT: popl %esi
167166
; X86-NEXT: retl
168167
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind
@@ -284,10 +283,9 @@ define i32 @length5(ptr %X, ptr %Y) nounwind {
284283
; X86-NEXT: popl %esi
285284
; X86-NEXT: retl
286285
; X86-NEXT: .LBB16_3: # %res_block
287-
; X86-NEXT: xorl %eax, %eax
288-
; X86-NEXT: cmpl %esi, %edx
289-
; X86-NEXT: sbbl %eax, %eax
290-
; X86-NEXT: orl $1, %eax
286+
; X86-NEXT: setae %al
287+
; X86-NEXT: movzbl %al, %eax
288+
; X86-NEXT: leal -1(%eax,%eax), %eax
291289
; X86-NEXT: popl %esi
292290
; X86-NEXT: retl
293291
%m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind
@@ -330,10 +328,9 @@ define i1 @length5_lt(ptr %X, ptr %Y) nounwind {
330328
; X86-NEXT: subl %ecx, %eax
331329
; X86-NEXT: jmp .LBB18_2
332330
; X86-NEXT: .LBB18_3: # %res_block
333-
; X86-NEXT: xorl %eax, %eax
334-
; X86-NEXT: cmpl %esi, %edx
335-
; X86-NEXT: sbbl %eax, %eax
336-
; X86-NEXT: orl $1, %eax
331+
; X86-NEXT: setae %al
332+
; X86-NEXT: movzbl %al, %eax
333+
; X86-NEXT: leal -1(%eax,%eax), %eax
337334
; X86-NEXT: .LBB18_2: # %endblock
338335
; X86-NEXT: shrl $31, %eax
339336
; X86-NEXT: # kill: def $al killed $al killed $eax
@@ -367,8 +364,8 @@ define i32 @length7(ptr %X, ptr %Y) nounwind {
367364
; X86-NEXT: .LBB19_2: # %res_block
368365
; X86-NEXT: xorl %eax, %eax
369366
; X86-NEXT: cmpl %edx, %ecx
370-
; X86-NEXT: sbbl %eax, %eax
371-
; X86-NEXT: orl $1, %eax
367+
; X86-NEXT: setae %al
368+
; X86-NEXT: leal -1(%eax,%eax), %eax
372369
; X86-NEXT: .LBB19_3: # %endblock
373370
; X86-NEXT: popl %esi
374371
; X86-NEXT: retl
@@ -416,8 +413,8 @@ define i1 @length7_lt(ptr %X, ptr %Y) nounwind {
416413
; X86-NEXT: .LBB21_2: # %res_block
417414
; X86-NEXT: xorl %eax, %eax
418415
; X86-NEXT: cmpl %edx, %ecx
419-
; X86-NEXT: sbbl %eax, %eax
420-
; X86-NEXT: orl $1, %eax
416+
; X86-NEXT: setae %al
417+
; X86-NEXT: leal -1(%eax,%eax), %eax
421418
; X86-NEXT: .LBB21_3: # %endblock
422419
; X86-NEXT: shrl $31, %eax
423420
; X86-NEXT: # kill: def $al killed $al killed $eax
@@ -451,8 +448,8 @@ define i32 @length8(ptr %X, ptr %Y) nounwind {
451448
; X86-NEXT: .LBB22_2: # %res_block
452449
; X86-NEXT: xorl %eax, %eax
453450
; X86-NEXT: cmpl %edx, %ecx
454-
; X86-NEXT: sbbl %eax, %eax
455-
; X86-NEXT: orl $1, %eax
451+
; X86-NEXT: setae %al
452+
; X86-NEXT: leal -1(%eax,%eax), %eax
456453
; X86-NEXT: .LBB22_3: # %endblock
457454
; X86-NEXT: popl %esi
458455
; X86-NEXT: retl
@@ -613,8 +610,8 @@ define i32 @length12(ptr %X, ptr %Y) nounwind {
613610
; X86-NEXT: .LBB29_3: # %res_block
614611
; X86-NEXT: xorl %eax, %eax
615612
; X86-NEXT: cmpl %edx, %ecx
616-
; X86-NEXT: sbbl %eax, %eax
617-
; X86-NEXT: orl $1, %eax
613+
; X86-NEXT: setae %al
614+
; X86-NEXT: leal -1(%eax,%eax), %eax
618615
; X86-NEXT: .LBB29_4: # %endblock
619616
; X86-NEXT: popl %esi
620617
; X86-NEXT: retl
@@ -738,8 +735,8 @@ define i32 @length16(ptr %X, ptr %Y) nounwind {
738735
; X86-NEXT: .LBB33_4: # %res_block
739736
; X86-NEXT: xorl %eax, %eax
740737
; X86-NEXT: cmpl %edx, %ecx
741-
; X86-NEXT: sbbl %eax, %eax
742-
; X86-NEXT: orl $1, %eax
738+
; X86-NEXT: setae %al
739+
; X86-NEXT: leal -1(%eax,%eax), %eax
743740
; X86-NEXT: .LBB33_5: # %endblock
744741
; X86-NEXT: popl %esi
745742
; X86-NEXT: retl
@@ -852,8 +849,8 @@ define i1 @length16_lt(ptr %x, ptr %y) nounwind {
852849
; X86-NEXT: .LBB35_4: # %res_block
853850
; X86-NEXT: xorl %eax, %eax
854851
; X86-NEXT: cmpl %edx, %ecx
855-
; X86-NEXT: sbbl %eax, %eax
856-
; X86-NEXT: orl $1, %eax
852+
; X86-NEXT: setae %al
853+
; X86-NEXT: leal -1(%eax,%eax), %eax
857854
; X86-NEXT: .LBB35_5: # %endblock
858855
; X86-NEXT: shrl $31, %eax
859856
; X86-NEXT: # kill: def $al killed $al killed $eax
@@ -901,8 +898,8 @@ define i1 @length16_gt(ptr %x, ptr %y) nounwind {
901898
; X86-NEXT: .LBB36_4: # %res_block
902899
; X86-NEXT: xorl %edx, %edx
903900
; X86-NEXT: cmpl %ecx, %eax
904-
; X86-NEXT: sbbl %edx, %edx
905-
; X86-NEXT: orl $1, %edx
901+
; X86-NEXT: setae %dl
902+
; X86-NEXT: leal -1(%edx,%edx), %edx
906903
; X86-NEXT: .LBB36_5: # %endblock
907904
; X86-NEXT: testl %edx, %edx
908905
; X86-NEXT: setg %al

0 commit comments

Comments
 (0)