[llvm] [PredicateInfo] Clean up DFS sorting (NFC) (PR #144943)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 19 11:52:48 PDT 2025
================
@@ -116,28 +103,34 @@ struct ValueDFS_Compare {
bool operator()(const ValueDFS &A, const ValueDFS &B) const {
if (&A == &B)
return false;
- // The only case we can't directly compare them is when they in the same
- // block, and both have localnum == middle. In that case, we have to use
- // comesbefore to see what the real ordering is, because they are in the
- // same basic block.
+ assert(!A.Def && !B.Def && "Should not have Def during comparison");
- assert((A.DFSIn != B.DFSIn || A.DFSOut == B.DFSOut) &&
+ // Order by block first.
+ if (A.DFSIn != B.DFSIn)
+ return A.DFSIn < B.DFSIn;
+ assert(A.DFSOut == B.DFSOut &&
"Equal DFS-in numbers imply equal out numbers");
- bool SameBlock = A.DFSIn == B.DFSIn;
+
+ // Then order by first/middle/last.
+ if (A.LocalNum != B.LocalNum)
+ return A.LocalNum < B.LocalNum;
// We want to put the def that will get used for a given set of phi uses,
// before those phi uses.
// So we sort by edge, then by def.
// Note that only phi nodes uses and defs can come last.
- if (SameBlock && A.LocalNum == LN_Last && B.LocalNum == LN_Last)
+ if (A.LocalNum == LN_Last)
return comparePHIRelated(A, B);
- bool isADef = A.Def;
- bool isBDef = B.Def;
- if (!SameBlock || A.LocalNum != LN_Middle || B.LocalNum != LN_Middle)
- return std::tie(A.DFSIn, A.LocalNum, isADef) <
- std::tie(B.DFSIn, B.LocalNum, isBDef);
- return localComesBefore(A, B);
+ // Use block-local ordering for instructions in the middle.
+ if (A.LocalNum == LN_Middle)
+ return localComesBefore(A, B);
+
+ // The order of PredicateInfo definitions at the start of the block does not
+ // matter.
+ assert(A.LocalNum == LN_First);
+ assert(A.PInfo && B.PInfo && "Must be predicate info def");
+ return false;
----------------
nikic wrote:
This was not obvious in the old implementation, but we don't define an order for defs at LN_First -- this relies on the fact that we use stable_sort.
https://github.com/llvm/llvm-project/pull/144943
More information about the llvm-commits
mailing list