@@ -725,7 +725,7 @@ NVPTXTargetLowering::NVPTXTargetLowering(const NVPTXTargetMachine &TM,
725725 // We have some custom DAG combine patterns for these nodes
726726 setTargetDAGCombine ({ISD::ADD, ISD::AND, ISD::EXTRACT_VECTOR_ELT, ISD::FADD,
727727 ISD::LOAD, ISD::MUL, ISD::SHL, ISD::SREM, ISD::UREM,
728- ISD::VSELECT});
728+ ISD::VSELECT, ISD::SELECT });
729729
730730 // setcc for f16x2 and bf16x2 needs special handling to prevent
731731 // legalizer's attempt to scalarize it due to v2i1 not being legal.
@@ -5999,6 +5999,32 @@ static SDValue PerformLOADCombine(SDNode *N,
59995999 DL);
60006000}
60016001
6002+ // This transformations was once reliably performed by instcombine, but thanks
6003+ // to poison semantics they are no longer safe for LLVM IR, perform them here
6004+ // instead.
6005+ static SDValue PerformSELECTCombine (SDNode *N,
6006+ TargetLowering::DAGCombinerInfo &DCI) {
6007+ return SDValue ();
6008+ if (!(N->getValueType (0 ) == MVT::i1))
6009+ return SDValue ();
6010+
6011+ unsigned Opcode = N->getOpcode ();
6012+ SDValue SecondOperand;
6013+ if (auto Const = dyn_cast<ConstantSDNode>(N->getOperand (2 )); Const && Const->isZero ()) {
6014+ // (select cond, x, false) -> (and cond, x)
6015+ Opcode = ISD::AND;
6016+ SecondOperand = N->getOperand (1 );
6017+ } else if (auto Const = dyn_cast<ConstantSDNode>(N->getOperand (1 )); Const && Const->isOne ()) {
6018+ // (select cond, true, x) -> (or cond, x)
6019+ Opcode = ISD::OR;
6020+ SecondOperand = N->getOperand (2 );
6021+ } else {
6022+ return SDValue ();
6023+ }
6024+
6025+ return DCI.DAG .getNode (Opcode, SDLoc (N), MVT::i1, N->getOperand (0 ), SecondOperand);
6026+ }
6027+
60026028SDValue NVPTXTargetLowering::PerformDAGCombine (SDNode *N,
60036029 DAGCombinerInfo &DCI) const {
60046030 CodeGenOptLevel OptLevel = getTargetMachine ().getOptLevel ();
@@ -6021,6 +6047,8 @@ SDValue NVPTXTargetLowering::PerformDAGCombine(SDNode *N,
60216047 return PerformSETCCCombine (N, DCI, STI.getSmVersion ());
60226048 case ISD::LOAD:
60236049 return PerformLOADCombine (N, DCI);
6050+ case ISD::SELECT:
6051+ return PerformSELECTCombine (N, DCI);
60246052 case NVPTXISD::StoreRetval:
60256053 case NVPTXISD::StoreRetvalV2:
60266054 case NVPTXISD::StoreRetvalV4:
0 commit comments