Skip to content

Commit 058964d

Browse files
committed
[X86] LowerSELECTWithCmpZero - move "select (X != 0), -1, Y --> 0 - X; or (sbb), Y" fold
Move fold into LowerSELECTWithCmpZero so it can be used with (AND X,1) ==/!= 0 select cases
1 parent 78fa415 commit 058964d

File tree

2 files changed

+34
-35
lines changed

2 files changed

+34
-35
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24139,6 +24139,32 @@ static SDValue LowerSELECTWithCmpZero(SDValue CmpVal, SDValue LHS, SDValue RHS,
2413924139
}
2414024140
}
2414124141

24142+
if ((X86CC == X86::COND_E || X86CC == X86::COND_NE) &&
24143+
(isAllOnesConstant(LHS) || isAllOnesConstant(RHS))) {
24144+
SDValue Y = isAllOnesConstant(RHS) ? LHS : RHS;
24145+
SDVTList CmpVTs = DAG.getVTList(CmpVT, MVT::i32);
24146+
24147+
// 'X - 1' sets the carry flag if X == 0.
24148+
// '0 - X' sets the carry flag if X != 0.
24149+
// Convert the carry flag to a -1/0 mask with sbb:
24150+
// select (X != 0), -1, Y --> 0 - X; or (sbb), Y
24151+
// select (X == 0), Y, -1 --> 0 - X; or (sbb), Y
24152+
// select (X != 0), Y, -1 --> X - 1; or (sbb), Y
24153+
// select (X == 0), -1, Y --> X - 1; or (sbb), Y
24154+
SDValue Sub;
24155+
if (isAllOnesConstant(LHS) == (X86CC == X86::COND_NE)) {
24156+
SDValue Zero = DAG.getConstant(0, DL, CmpVT);
24157+
Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, Zero, CmpVal);
24158+
} else {
24159+
SDValue One = DAG.getConstant(1, DL, CmpVT);
24160+
Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, CmpVal, One);
24161+
}
24162+
SDValue SBB = DAG.getNode(X86ISD::SETCC_CARRY, DL, VT,
24163+
DAG.getTargetConstant(X86::COND_B, DL, MVT::i8),
24164+
Sub.getValue(1));
24165+
return DAG.getNode(ISD::OR, DL, VT, SBB, Y);
24166+
}
24167+
2414224168
return SDValue();
2414324169
}
2414424170

@@ -24262,30 +24288,6 @@ SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
2426224288
((CondCode == X86::COND_NE && MatchFFSMinus1(Op1, Op2)) ||
2426324289
(CondCode == X86::COND_E && MatchFFSMinus1(Op2, Op1)))) {
2426424290
// Keep Cmp.
24265-
} else if ((isAllOnesConstant(Op1) || isAllOnesConstant(Op2)) &&
24266-
(CondCode == X86::COND_E || CondCode == X86::COND_NE)) {
24267-
SDValue Y = isAllOnesConstant(Op2) ? Op1 : Op2;
24268-
SDVTList CmpVTs = DAG.getVTList(CmpOp0.getValueType(), MVT::i32);
24269-
24270-
// 'X - 1' sets the carry flag if X == 0.
24271-
// '0 - X' sets the carry flag if X != 0.
24272-
// Convert the carry flag to a -1/0 mask with sbb:
24273-
// select (X != 0), -1, Y --> 0 - X; or (sbb), Y
24274-
// select (X == 0), Y, -1 --> 0 - X; or (sbb), Y
24275-
// select (X != 0), Y, -1 --> X - 1; or (sbb), Y
24276-
// select (X == 0), -1, Y --> X - 1; or (sbb), Y
24277-
SDValue Sub;
24278-
if (isAllOnesConstant(Op1) == (CondCode == X86::COND_NE)) {
24279-
SDValue Zero = DAG.getConstant(0, DL, CmpOp0.getValueType());
24280-
Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, Zero, CmpOp0);
24281-
} else {
24282-
SDValue One = DAG.getConstant(1, DL, CmpOp0.getValueType());
24283-
Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, CmpOp0, One);
24284-
}
24285-
SDValue SBB = DAG.getNode(X86ISD::SETCC_CARRY, DL, VT,
24286-
DAG.getTargetConstant(X86::COND_B, DL, MVT::i8),
24287-
Sub.getValue(1));
24288-
return DAG.getNode(ISD::OR, DL, VT, SBB, Y);
2428924291
} else if (SDValue R = LowerSELECTWithCmpZero(CmpOp0, Op1, Op2, CondCode,
2429024292
DL, DAG, Subtarget)) {
2429124293
return R;

llvm/test/CodeGen/X86/cmov-promotion.ll

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -251,19 +251,16 @@ define i64 @cmov_spromotion_16_to_64(i1 %c) {
251251
;
252252
; NO_CMOV-LABEL: cmov_spromotion_16_to_64:
253253
; NO_CMOV: # %bb.0:
254-
; NO_CMOV-NEXT: xorl %edx, %edx
255-
; NO_CMOV-NEXT: testb $1, {{[0-9]+}}(%esp)
254+
; NO_CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
255+
; NO_CMOV-NEXT: andb $1, %cl
256256
; NO_CMOV-NEXT: movl $12414, %eax # imm = 0x307E
257-
; NO_CMOV-NEXT: je .LBB10_1
258-
; NO_CMOV-NEXT: # %bb.2:
259-
; NO_CMOV-NEXT: je .LBB10_3
260-
; NO_CMOV-NEXT: .LBB10_4:
261-
; NO_CMOV-NEXT: retl
262-
; NO_CMOV-NEXT: .LBB10_1:
257+
; NO_CMOV-NEXT: jne .LBB10_2
258+
; NO_CMOV-NEXT: # %bb.1:
263259
; NO_CMOV-NEXT: movl $-22429, %eax # imm = 0xA863
264-
; NO_CMOV-NEXT: jne .LBB10_4
265-
; NO_CMOV-NEXT: .LBB10_3:
266-
; NO_CMOV-NEXT: movl $-1, %edx
260+
; NO_CMOV-NEXT: .LBB10_2:
261+
; NO_CMOV-NEXT: xorl %edx, %edx
262+
; NO_CMOV-NEXT: cmpb $1, %cl
263+
; NO_CMOV-NEXT: sbbl %edx, %edx
267264
; NO_CMOV-NEXT: retl
268265
%t0 = select i1 %c, i16 12414, i16 43107
269266
%ret = sext i16 %t0 to i64

0 commit comments

Comments
 (0)