================ @@ -982,6 +1037,92 @@ void VPlan::updateDominatorTree(DominatorTree *DT, BasicBlock *LoopHeaderBB, assert(DT->verify(DominatorTree::VerificationLevel::Fast)); } +static void remapOperands(VPBlockBase *Entry, VPBlockBase *NewEntry, + DenseMap<VPValue *, VPValue *> &Old2NewVPValues) { + // Update the operands of all cloned recipes starting at NewEntry. This + // traverses all reachable blocks. This is done in two steps, to handle cycles + // in PHI recipes. + ReversePostOrderTraversal<VPBlockDeepTraversalWrapper<VPBlockBase *>> + OldDeepRPOT(Entry); + ReversePostOrderTraversal<VPBlockDeepTraversalWrapper<VPBlockBase *>> + NewDeepRPOT(NewEntry); + // First, collect all mappings from old to new VPValues defined by cloned + // recipes. + for (const auto &[OldBB, NewBB] : + zip(VPBlockUtils::blocksOnly<VPBasicBlock>(OldDeepRPOT), + VPBlockUtils::blocksOnly<VPBasicBlock>(NewDeepRPOT))) { + assert(OldBB->getRecipeList().size() == NewBB->getRecipeList().size() && + "blocks must have the same number of recipes"); + + for (const auto &[OldR, NewR] : zip(*OldBB, *NewBB)) { + assert(OldR.getNumOperands() == NewR.getNumOperands() && + "recipes must have the same number of operands"); + assert(OldR.getNumDefinedValues() == NewR.getNumDefinedValues() && + "recipes must define the same number of operands"); + for (const auto &[OldV, NewV] : + zip(OldR.definedValues(), NewR.definedValues())) + Old2NewVPValues[OldV] = NewV; + } + } + + // Update all operands to use cloned VPValues. + for (VPBasicBlock *NewBB : + VPBlockUtils::blocksOnly<VPBasicBlock>(NewDeepRPOT)) { + for (VPRecipeBase &NewR : *NewBB) + for (unsigned I = 0, E = NewR.getNumOperands(); I != E; ++I) { + VPValue *NewOp = Old2NewVPValues.lookup(NewR.getOperand(I)); + NewR.setOperand(I, NewOp); + } + } +} + +VPlan *VPlan::clone() { + DenseMap<VPValue *, VPValue *> Old2NewVPValues; ---------------- ayalz wrote:
nit: can define below when starting to deal with values. https://github.com/llvm/llvm-project/pull/73158 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits