[LV] Clean up uniform induction variable analysis (NFC)
llvm-svn: 281368
This commit is contained in:
		
							parent
							
								
									88f5ed9430
								
							
						
					
					
						commit
						81335bec96
					
				| 
						 | 
					@ -5434,29 +5434,37 @@ void LoopVectorizationLegality::collectLoopUniforms() {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // For an instruction to be added into Worklist above, all its users inside
 | 
					  // For an instruction to be added into Worklist above, all its users inside
 | 
				
			||||||
  // the current loop should be already added into Worklist. This condition
 | 
					  // the loop should also be in Worklist. However, this condition cannot be
 | 
				
			||||||
  // cannot be true for phi instructions which is always in a dependence loop.
 | 
					  // true for phi nodes that form a cyclic dependence. We must process phi
 | 
				
			||||||
  // Because any instruction in the dependence cycle always depends on others
 | 
					  // nodes separately. An induction variable will remain uniform if all users
 | 
				
			||||||
  // in the cycle to be added into Worklist first, the result is no ones in
 | 
					  // of the induction variable and induction variable update remain uniform.
 | 
				
			||||||
  // the cycle will be added into Worklist in the end.
 | 
					  for (auto &Induction : Inductions) {
 | 
				
			||||||
  // That is why we process PHI separately.
 | 
					    auto *Ind = Induction.first;
 | 
				
			||||||
  for (auto &Induction : *getInductionVars()) {
 | 
					    auto *IndUpdate = cast<Instruction>(Ind->getIncomingValueForBlock(Latch));
 | 
				
			||||||
    auto *PN = Induction.first;
 | 
					
 | 
				
			||||||
    auto *UpdateV = PN->getIncomingValueForBlock(TheLoop->getLoopLatch());
 | 
					    // Determine if all users of the induction variable are uniform after
 | 
				
			||||||
    if (all_of(PN->users(),
 | 
					    // vectorization.
 | 
				
			||||||
               [&](User *U) -> bool {
 | 
					    auto UniformInd = all_of(Ind->users(), [&](User *U) -> bool {
 | 
				
			||||||
                 return U == UpdateV || isOutOfScope(U) ||
 | 
					      auto *I = cast<Instruction>(U);
 | 
				
			||||||
                        Worklist.count(cast<Instruction>(U));
 | 
					      return I == IndUpdate || !TheLoop->contains(I) || Worklist.count(I);
 | 
				
			||||||
               }) &&
 | 
					    });
 | 
				
			||||||
        all_of(UpdateV->users(), [&](User *U) -> bool {
 | 
					    if (!UniformInd)
 | 
				
			||||||
          return U == PN || isOutOfScope(U) ||
 | 
					      continue;
 | 
				
			||||||
                 Worklist.count(cast<Instruction>(U));
 | 
					
 | 
				
			||||||
        })) {
 | 
					    // Determine if all users of the induction variable update instruction are
 | 
				
			||||||
      Worklist.insert(cast<Instruction>(PN));
 | 
					    // uniform after vectorization.
 | 
				
			||||||
      Worklist.insert(cast<Instruction>(UpdateV));
 | 
					    auto UniformIndUpdate = all_of(IndUpdate->users(), [&](User *U) -> bool {
 | 
				
			||||||
      DEBUG(dbgs() << "LV: Found uniform instruction: " << *PN << "\n");
 | 
					      auto *I = cast<Instruction>(U);
 | 
				
			||||||
      DEBUG(dbgs() << "LV: Found uniform instruction: " << *UpdateV << "\n");
 | 
					      return I == Ind || !TheLoop->contains(I) || Worklist.count(I);
 | 
				
			||||||
    }
 | 
					    });
 | 
				
			||||||
 | 
					    if (!UniformIndUpdate)
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // The induction variable and its update instruction will remain uniform.
 | 
				
			||||||
 | 
					    Worklist.insert(Ind);
 | 
				
			||||||
 | 
					    Worklist.insert(IndUpdate);
 | 
				
			||||||
 | 
					    DEBUG(dbgs() << "LV: Found uniform instruction: " << *Ind << "\n");
 | 
				
			||||||
 | 
					    DEBUG(dbgs() << "LV: Found uniform instruction: " << *IndUpdate << "\n");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Uniforms.insert(Worklist.begin(), Worklist.end());
 | 
					  Uniforms.insert(Worklist.begin(), Worklist.end());
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue