================ @@ -982,6 +1037,94 @@ 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<VPBlockBase *, VPBlockBase *> Old2NewVPBlocks; + DenseMap<VPValue *, VPValue *> Old2NewVPValues; + + auto *NewPlan = new VPlan(); ---------------- ayalz wrote:
Perhaps blocks should be clones first, then values cloned and remapped. I.e., ``` auto *NewPreheader = getPreheader().clone(); // Currently a disconnected VPBB. auto [NewEntry, _ ] = cloneSESE(getEntry()); auto *NewPlan = new VPlan(NewPreheader, NewEntry); ``` https://github.com/llvm/llvm-project/pull/73158 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits