summaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2024-09-08 11:04:34 +0100
committerSimon Pilgrim <llvm-dev@redking.me.uk>2024-09-08 12:24:28 +0100
commit058964d3dacdc1321dcf2fdf82bebd3a37fcbc9c (patch)
tree67baf447436a43f5a8cca5fb48f7491b421037e7 /llvm/lib
parent78fa41524b6f6e2696ff21ec50e760311ac939a3 (diff)
[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
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp50
1 files changed, 26 insertions, 24 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index b8a6f10cab62..b9a6eb26fc9f 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -24139,6 +24139,32 @@ static SDValue LowerSELECTWithCmpZero(SDValue CmpVal, SDValue LHS, SDValue RHS,
}
}
+ if ((X86CC == X86::COND_E || X86CC == X86::COND_NE) &&
+ (isAllOnesConstant(LHS) || isAllOnesConstant(RHS))) {
+ SDValue Y = isAllOnesConstant(RHS) ? LHS : RHS;
+ SDVTList CmpVTs = DAG.getVTList(CmpVT, MVT::i32);
+
+ // 'X - 1' sets the carry flag if X == 0.
+ // '0 - X' sets the carry flag if X != 0.
+ // Convert the carry flag to a -1/0 mask with sbb:
+ // select (X != 0), -1, Y --> 0 - X; or (sbb), Y
+ // select (X == 0), Y, -1 --> 0 - X; or (sbb), Y
+ // select (X != 0), Y, -1 --> X - 1; or (sbb), Y
+ // select (X == 0), -1, Y --> X - 1; or (sbb), Y
+ SDValue Sub;
+ if (isAllOnesConstant(LHS) == (X86CC == X86::COND_NE)) {
+ SDValue Zero = DAG.getConstant(0, DL, CmpVT);
+ Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, Zero, CmpVal);
+ } else {
+ SDValue One = DAG.getConstant(1, DL, CmpVT);
+ Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, CmpVal, One);
+ }
+ SDValue SBB = DAG.getNode(X86ISD::SETCC_CARRY, DL, VT,
+ DAG.getTargetConstant(X86::COND_B, DL, MVT::i8),
+ Sub.getValue(1));
+ return DAG.getNode(ISD::OR, DL, VT, SBB, Y);
+ }
+
return SDValue();
}
@@ -24262,30 +24288,6 @@ SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
((CondCode == X86::COND_NE && MatchFFSMinus1(Op1, Op2)) ||
(CondCode == X86::COND_E && MatchFFSMinus1(Op2, Op1)))) {
// Keep Cmp.
- } else if ((isAllOnesConstant(Op1) || isAllOnesConstant(Op2)) &&
- (CondCode == X86::COND_E || CondCode == X86::COND_NE)) {
- SDValue Y = isAllOnesConstant(Op2) ? Op1 : Op2;
- SDVTList CmpVTs = DAG.getVTList(CmpOp0.getValueType(), MVT::i32);
-
- // 'X - 1' sets the carry flag if X == 0.
- // '0 - X' sets the carry flag if X != 0.
- // Convert the carry flag to a -1/0 mask with sbb:
- // select (X != 0), -1, Y --> 0 - X; or (sbb), Y
- // select (X == 0), Y, -1 --> 0 - X; or (sbb), Y
- // select (X != 0), Y, -1 --> X - 1; or (sbb), Y
- // select (X == 0), -1, Y --> X - 1; or (sbb), Y
- SDValue Sub;
- if (isAllOnesConstant(Op1) == (CondCode == X86::COND_NE)) {
- SDValue Zero = DAG.getConstant(0, DL, CmpOp0.getValueType());
- Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, Zero, CmpOp0);
- } else {
- SDValue One = DAG.getConstant(1, DL, CmpOp0.getValueType());
- Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, CmpOp0, One);
- }
- SDValue SBB = DAG.getNode(X86ISD::SETCC_CARRY, DL, VT,
- DAG.getTargetConstant(X86::COND_B, DL, MVT::i8),
- Sub.getValue(1));
- return DAG.getNode(ISD::OR, DL, VT, SBB, Y);
} else if (SDValue R = LowerSELECTWithCmpZero(CmpOp0, Op1, Op2, CondCode,
DL, DAG, Subtarget)) {
return R;