@@ -40,6 +40,8 @@ bool RecurrenceDescriptor::isIntegerRecurrenceKind(RecurKind Kind) {
4040  switch  (Kind) {
4141  default :
4242    break ;
43+   case  RecurKind::AddChainWithSubs:
44+   case  RecurKind::Sub:
4345  case  RecurKind::Add:
4446  case  RecurKind::Mul:
4547  case  RecurKind::Or:
@@ -897,8 +899,11 @@ RecurrenceDescriptor::InstDesc RecurrenceDescriptor::isRecurrenceInstr(
897899  case  Instruction::PHI:
898900    return  InstDesc (I, Prev.getRecKind (), Prev.getExactFPMathInst ());
899901  case  Instruction::Sub:
902+     return  InstDesc (
903+         Kind == RecurKind::Sub || Kind == RecurKind::AddChainWithSubs, I);
900904  case  Instruction::Add:
901-     return  InstDesc (Kind == RecurKind::Add, I);
905+     return  InstDesc (
906+         Kind == RecurKind::Add || Kind == RecurKind::AddChainWithSubs, I);
902907  case  Instruction::Mul:
903908    return  InstDesc (Kind == RecurKind::Mul, I);
904909  case  Instruction::And:
@@ -917,7 +922,8 @@ RecurrenceDescriptor::InstDesc RecurrenceDescriptor::isRecurrenceInstr(
917922                    I->hasAllowReassoc () ? nullptr  : I);
918923  case  Instruction::Select:
919924    if  (Kind == RecurKind::FAdd || Kind == RecurKind::FMul ||
920-         Kind == RecurKind::Add || Kind == RecurKind::Mul)
925+         Kind == RecurKind::Add || Kind == RecurKind::Mul ||
926+         Kind == RecurKind::Sub || Kind == RecurKind::AddChainWithSubs)
921927      return  isConditionalRdxPattern (I);
922928    if  (isFindIVRecurrenceKind (Kind) && SE)
923929      return  isFindIVPattern (Kind, L, OrigPhi, I, *SE);
@@ -1003,6 +1009,17 @@ bool RecurrenceDescriptor::isReductionPHI(PHINode *Phi, Loop *TheLoop,
10031009    LLVM_DEBUG (dbgs () << " Found an ADD reduction PHI." " \n " 
10041010    return  true ;
10051011  }
1012+   if  (AddReductionVar (Phi, RecurKind::Sub, TheLoop, FMF, RedDes, DB, AC, DT,
1013+                       SE)) {
1014+     LLVM_DEBUG (dbgs () << " Found a SUB reduction PHI." " \n " 
1015+     return  true ;
1016+   }
1017+   if  (AddReductionVar (Phi, RecurKind::AddChainWithSubs, TheLoop, FMF, RedDes,
1018+                       DB, AC, DT, SE)) {
1019+     LLVM_DEBUG (dbgs () << " Found a chained ADD-SUB reduction PHI." 
1020+                       << " \n " 
1021+     return  true ;
1022+   }
10061023  if  (AddReductionVar (Phi, RecurKind::Mul, TheLoop, FMF, RedDes, DB, AC, DT,
10071024                      SE)) {
10081025    LLVM_DEBUG (dbgs () << " Found a MUL reduction PHI." " \n " 
@@ -1201,6 +1218,9 @@ bool RecurrenceDescriptor::isFixedOrderRecurrence(PHINode *Phi, Loop *TheLoop,
12011218
12021219unsigned  RecurrenceDescriptor::getOpcode (RecurKind Kind) {
12031220  switch  (Kind) {
1221+   case  RecurKind::Sub:
1222+     return  Instruction::Sub;
1223+   case  RecurKind::AddChainWithSubs:
12041224  case  RecurKind::Add:
12051225    return  Instruction::Add;
12061226  case  RecurKind::Mul:
@@ -1288,6 +1308,10 @@ RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
12881308    if  (isFMulAddIntrinsic (Cur))
12891309      return  true ;
12901310
1311+     if  (Cur->getOpcode () == Instruction::Sub &&
1312+         Kind == RecurKind::AddChainWithSubs)
1313+       return  true ;
1314+ 
12911315    return  Cur->getOpcode () == getOpcode ();
12921316  };
12931317
0 commit comments