diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2024-09-08 11:04:34 +0100 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2024-09-08 12:24:28 +0100 |
| commit | 058964d3dacdc1321dcf2fdf82bebd3a37fcbc9c (patch) | |
| tree | 67baf447436a43f5a8cca5fb48f7491b421037e7 /llvm/lib | |
| parent | 78fa41524b6f6e2696ff21ec50e760311ac939a3 (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.cpp | 50 |
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; |
