[llvm] [LV] Vectorize early exit loops with multiple exits. (PR #174864)
Brian Cain via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 13 18:49:56 PST 2026
androm3da wrote:
I'm moving my comment from the commit over here to the PR, gives better context I think.
I see this failure from libstdc++ with `_GLIBCXX_DEBUG` enabled and I suspect it came from the commit from this PR.
```
In function:
void std::sort(_RandomAccessIterator, _RandomAccessIterator, _Compare)
[_RandomAccessIterator = EarlyExitInfo *, _Compare = (lambda at
/local/mnt/workspace/bcain-20260213_180548/llvm-project/llvm/lib/Transforms/Vectorize/VPlanTrans
forms.c
pp:4082:21)]
Error: comparison doesn't meet irreflexive requirements, assert(!(a < a)).
Objects involved in the operation:
instance "functor" @ 0x7ffc58648430 {
}
iterator::value_type "ordered type" {
}
```
Here's a possible fix to make the comparator pass the irreflexive requirement?
```
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -4080,7 +4080,8 @@ void VPlanTransforms::handleUncountableEarlyExits(VPlan &Plan,
assert(!Exits.empty() && "must have at least one early exit");
// Sort exits by dominance to get the correct program order.
llvm::sort(Exits, [&VPDT](const EarlyExitInfo &A, const EarlyExitInfo &B) {
- return VPDT.dominates(A.EarlyExitingVPBB, B.EarlyExitingVPBB);
+ return A.EarlyExitingVPBB != B.EarlyExitingVPBB &&
+ VPDT.dominates(A.EarlyExitingVPBB, B.EarlyExitingVPBB);
});
```
... I'll follow up w/a reproducer when my batch run is over ~tonight or tomorrow.
https://github.com/llvm/llvm-project/pull/174864
More information about the llvm-commits
mailing list