================ @@ -1331,14 +1356,37 @@ static VPActiveLaneMaskPHIRecipe *addVPLaneMaskPhiAndUpdateExitBranch( "index.part.next"); // Create the active lane mask instruction in the VPlan preheader. - auto *EntryALM = + VPValue *Mask = Builder.createNaryOp(VPInstruction::ActiveLaneMask, {EntryIncrement, TC}, DL, "active.lane.mask.entry"); // Now create the ActiveLaneMaskPhi recipe in the main loop using the // preheader ActiveLaneMask instruction. - auto *LaneMaskPhi = new VPActiveLaneMaskPHIRecipe(EntryALM, DebugLoc()); + auto *LaneMaskPhi = new VPActiveLaneMaskPHIRecipe(Mask, DebugLoc()); LaneMaskPhi->insertAfter(CanonicalIVPHI); + VPValue *LaneMask = LaneMaskPhi; + if (AliasMask) { + // Increment phi by correct amount. + Builder.setInsertPoint(CanonicalIVIncrement); + + VPValue *IncrementBy = Builder.createNaryOp(VPInstruction::PopCount, + {AliasMask}, DL, "popcount"); + Type *IVType = CanonicalIVPHI->getScalarType(); + + if (IVType->getScalarSizeInBits() < 64) { + auto *Cast = + new VPScalarCastRecipe(Instruction::Trunc, IncrementBy, IVType); + Cast->insertAfter(IncrementBy->getDefiningRecipe()); + IncrementBy = Cast; + } + CanonicalIVIncrement->setOperand(1, IncrementBy); + + // And the alias mask so the iteration only processes non-aliasing lanes + Builder.setInsertPoint(CanonicalIVPHI->getParent(), + CanonicalIVPHI->getParent()->getFirstNonPhi()); + LaneMask = Builder.createNaryOp(Instruction::BinaryOps::And, + {LaneMaskPhi, AliasMask}, DL); ---------------- SamTebbs33 wrote:
We don't, and there's actually a case in the test suite that hangs because the mask is all-false. I'll start looking into a solution for that. https://github.com/llvm/llvm-project/pull/100579 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits