@@ -16581,24 +16581,24 @@ SDValue SITargetLowering::performSetCCCombine(SDNode *N,
16581
16581
16582
16582
// Eliminate setcc by using carryout from add/sub instruction
16583
16583
16584
- // X = ADD i64 Y , Z Xlo = UADDO i32 Ylo , Zlo
16585
- // setcc X ult Y -> XHi = UADDO_CARRY i32 Yhi , Zhi
16584
+ // LHS = ADD i64 RHS , Z LHSlo = UADDO i32 RHSlo , Zlo
16585
+ // setcc LHS ult RHS -> LHSHi = UADDO_CARRY i32 RHShi , Zhi
16586
16586
// similarly for subtraction
16587
16587
16588
- // X = ADD i64 Y, 1 Xlo = UADDO i32 Ylo, 1
16589
- // setcc X eq 0 -> XHi = UADDO_CARRY i32 Yhi, 0
16588
+ // LHS = ADD i64 Y, 1 LHSlo = UADDO i32 Ylo, 1
16589
+ // setcc LHS eq 0 -> LHSHi = UADDO_CARRY i32 Yhi, 0
16590
16590
16591
16591
// Don't split a 64-bit add/sub into two 32-bit add/sub instructions for
16592
16592
// non-divergent operations. This can result in lo/hi 32-bit operations
16593
16593
// being done in SGPR and VGPR with additional operations being needed
16594
16594
// to move operands and/or generate the intermediate carry.
16595
16595
if (VT == MVT::i64 && N->isDivergent() &&
16596
- ((((LHS.getOpcode() == ISD::ADD && CC == ISD::SETULT) ||
16597
- (LHS.getOpcode() == ISD::SUB && CC == ISD::SETUGT)) &&
16598
- LHS.getOperand(0) == RHS) ||
16599
- (LHS.getOpcode() == ISD::ADD && CC == ISD::SETEQ && CRHS &&
16600
- CRHS->isZero() && dyn_cast<ConstantSDNode>(LHS.getOperand(1) ) &&
16601
- dyn_cast<ConstantSDNode> (LHS.getOperand(1))->isOne( )))) {
16596
+ ((CC == ISD::SETULT &&
16597
+ sd_match (LHS, m_Add(m_Specific(RHS), m_Value()))) ||
16598
+ (CC == ISD::SETUGT &&
16599
+ sd_match (LHS, m_Sub(m_Specific(RHS), m_Value()))) ||
16600
+ (CC == ISD::SETEQ && CRHS && CRHS->isZero( ) &&
16601
+ sd_match (LHS, m_Add(m_Value(), m_One()) )))) {
16602
16602
EVT TargetType = MVT::i32;
16603
16603
EVT CarryVT = MVT::i1;
16604
16604
bool IsAdd = LHS.getOpcode() == ISD::ADD;
0 commit comments