[llvm] [VPlan] Fix broadcasted values using loop region during execution (PR #142594)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 11 06:19:55 PDT 2025
================
@@ -290,18 +290,22 @@ Value *VPTransformState::get(const VPValue *Def, bool NeedsScalar) {
return Data.VPV2Vector[Def];
auto GetBroadcastInstrs = [this, Def](Value *V) {
+ VPBasicBlock *PreheaderVPBB = nullptr;
+ if (auto *Header = vputils::getFirstLoopHeader(*Plan, VPDT))
----------------
david-arm wrote:
Looking at the definition of `getFirstLoopHeader`:
```
VPBasicBlock *vputils::getFirstLoopHeader(VPlan &Plan, VPDominatorTree &VPDT) {
auto DepthFirst = vp_depth_first_shallow(Plan.getEntry());
auto I = find_if(DepthFirst, [&VPDT](VPBlockBase *VPB) {
return VPBlockUtils::isHeader(VPB, VPDT);
});
return I == DepthFirst.end() ? nullptr : cast<VPBasicBlock>(*I);
}
```
and `isHeader`:
```
bool VPBlockUtils::isHeader(const VPBlockBase *VPB,
const VPDominatorTree &VPDT) {
auto *VPBB = dyn_cast<VPBasicBlock>(VPB);
if (!VPBB)
return false;
// If VPBB is in a region R, VPBB is a loop header if R is a loop region with
// VPBB as its entry, i.e., free of predecessors.
if (auto *R = VPBB->getParent())
return !R->isReplicator() && VPBB->getNumPredecessors() == 0;
// A header dominates its second predecessor (the latch), with the other
// predecessor being the preheader
return VPB->getPredecessors().size() == 2 &&
VPDT.dominates(VPB, VPB->getPredecessors()[1]);
}
```
It suggests a case where `getFirstLoopHeader` returns a `Header` without any predecessors:
```
// If VPBB is in a region R, VPBB is a loop header if R is a loop region with
// VPBB as its entry, i.e., free of predecessors.
```
Does this mean the code on the line below is unsafe because there are no predecessors?
https://github.com/llvm/llvm-project/pull/142594
More information about the llvm-commits
mailing list