bool LoopReroll::DAGRootTracker::collectUsedInstructions(SmallInstructionSet &PossibleRedSet) {
  // Populate the MapVector with all instructions in the block, in order first,
  // so we can iterate over the contents later in perfect order.
  for (auto &I : *L->getHeader()) {
    Uses[&I].resize(IL_End);
  }

  SmallInstructionSet Exclude;
  Exclude.insert(Roots.begin(), Roots.end());
  Exclude.insert(LoopIncs.begin(), LoopIncs.end());

  DenseSet<Instruction*> VBase;
  collectInLoopUserSet(IV, Exclude, PossibleRedSet, VBase);
  for (auto *I : VBase) {
    Uses[I].set(0);
  }

  unsigned Idx = 1;
  for (auto *Root : Roots) {
    DenseSet<Instruction*> V;
    collectInLoopUserSet(Root, Exclude, PossibleRedSet, V);

    // While we're here, check the use sets are the same size.
    if (V.size() != VBase.size()) {
      DEBUG(dbgs() << "LRR: Aborting - use sets are different sizes\n");
      return false;
    }

    for (auto *I : V) {
      Uses[I].set(Idx);
    }
    ++Idx;
  }

  // Make sure the loop increments are also accounted for.
  Exclude.clear();
  Exclude.insert(Roots.begin(), Roots.end());

  DenseSet<Instruction*> V;
  collectInLoopUserSet(LoopIncs, Exclude, PossibleRedSet, V);
  for (auto *I : V) {
    Uses[I].set(IL_LoopIncIdx);
  }
  if (IV != RealIV)
    Uses[RealIV].set(IL_LoopIncIdx);

  return true;

}