[llvm] [VPlan] Hoist loads with invariant addresses using noalias metadata. (PR #166247)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 22 05:50:14 PST 2025
================
@@ -3914,6 +3920,54 @@ void VPlanTransforms::materializeBroadcasts(VPlan &Plan) {
}
}
+void VPlanTransforms::hoistInvariantLoads(VPlan &Plan) {
+ VPRegionBlock *LoopRegion = Plan.getVectorLoopRegion();
+
+ // Collect candidate loads with invariant addresses and noalias scopes
+ // metadata and memory-writing recipes with noalias metadata.
+ SmallVector<std::pair<VPRecipeBase *, MemoryLocation>> CandidateLoads;
+ SmallVector<MemoryLocation> Stores;
+ for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
+ vp_depth_first_shallow(LoopRegion->getEntry()))) {
+ for (VPRecipeBase &R : *VPBB) {
+ // Only handle single-scalar replicated loads with invariant addresses.
+ if (auto *RepR = dyn_cast<VPReplicateRecipe>(&R)) {
+ if (RepR->isPredicated() || !RepR->isSingleScalar() ||
+ RepR->getOpcode() != Instruction::Load)
+ continue;
+
+ VPValue *Addr = RepR->getOperand(0);
+ if (Addr->isDefinedOutsideLoopRegions()) {
+ MemoryLocation Loc = *vputils::getMemoryLocation(*RepR);
+ if (!Loc.AATags.Scope)
+ continue;
+ CandidateLoads.push_back({RepR, Loc});
+ }
+ }
+ if (R.mayWriteToMemory()) {
+ auto Loc = vputils::getMemoryLocation(R);
+ if (!Loc || !Loc->AATags.Scope || !Loc->AATags.NoAlias)
+ return;
+ Stores.push_back(*Loc);
+ }
+ }
+ }
+
+ VPBasicBlock *Preheader = Plan.getVectorPreheader();
+ for (auto &[LoadRecipe, LoadLoc] : CandidateLoads) {
+ // Hoist the load to the preheader if it doesn't alias with any stores
+ // according to the noalias metadata. Other loads should have been hoisted
+ // by other passes
----------------
ayalz wrote:
```suggestion
// by other passes.
```
https://github.com/llvm/llvm-project/pull/166247
More information about the llvm-commits
mailing list