[llvm] [IndVars] Fix strict weak ordering violation (PR #108947)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 17 04:01:40 PDT 2024
================
@@ -1788,28 +1788,37 @@ bool IndVarSimplify::predicateLoopExits(Loop *L, SCEVExpander &Rewriter) {
return false;
};
+ // Make sure all exits dominate the latch. This means there is a linear chain
+ // of exits. We check this before sorting so we have a total order.
+ BasicBlock *Latch = L->getLoopLatch();
+ for (BasicBlock *ExitingBB : ExitingBlocks)
+ if (!DT->dominates(ExitingBB, Latch))
+ return false;
+
// If we have any exits which can't be predicated themselves, than we can't
// predicate any exit which isn't guaranteed to execute before it. Consider
// two exits (a) and (b) which would both exit on the same iteration. If we
// can predicate (b), but not (a), and (a) preceeds (b) along some path, then
// we could convert a loop from exiting through (a) to one exiting through
// (b). Note that this problem exists only for exits with the same exit
// count, and we could be more aggressive when exit counts are known inequal.
- llvm::sort(ExitingBlocks,
- [&](BasicBlock *A, BasicBlock *B) {
- // std::sort sorts in ascending order, so we want the inverse of
- // the normal dominance relation, plus a tie breaker for blocks
- // unordered by dominance.
- if (DT->properlyDominates(A, B)) return true;
- if (DT->properlyDominates(B, A)) return false;
- return A->getName() < B->getName();
- });
- // Check to see if our exit blocks are a total order (i.e. a linear chain of
- // exits before the backedge). If they aren't, reasoning about reachability
- // is complicated and we choose not to for now.
- for (unsigned i = 1; i < ExitingBlocks.size(); i++)
- if (!DT->dominates(ExitingBlocks[i-1], ExitingBlocks[i]))
+ llvm::sort(ExitingBlocks, [&](BasicBlock *A, BasicBlock *B) {
+ // std::sort sorts in ascending order, so we want the inverse of
----------------
fhahn wrote:
```suggestion
// llvm::sort sorts in ascending order, so we want the inverse of
```
?
https://github.com/llvm/llvm-project/pull/108947
More information about the llvm-commits
mailing list