[llvm] StructurizeCFG: Optimize phi insertion during ssa reconstruction (PR #101301)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 6 01:47:28 PDT 2024
================
@@ -710,39 +716,133 @@ void StructurizeCFG::findUndefBlocks(
}
}
+// If two phi nodes have compatible incoming values (for each
+// incoming block, either they have the same incoming value or only one phi
+// node has an incoming value), let them share the merged incoming values. The
+// merge process is guided by the equivalence information from \p PhiClasses.
+// The function will possibly update the incoming values of leader phi in
+// DeletedPhis.
+void StructurizeCFG::mergeIfCompatible(
+ EquivalenceClasses<PHINode *> &PhiClasses, PHINode *A, PHINode *B) {
+ auto ItA = PhiClasses.findLeader(PhiClasses.insert(A));
+ auto ItB = PhiClasses.findLeader(PhiClasses.insert(B));
+ // They are already in the same class, no work needed.
+ if (ItA == ItB)
+ return;
+
+ PHINode *LeaderA = *ItA;
+ PHINode *LeaderB = *ItB;
+ BBValueVector &IncomingA = DeletedPhis[LeaderA->getParent()][LeaderA];
+ BBValueVector &IncomingB = DeletedPhis[LeaderB->getParent()][LeaderB];
+
+ DenseMap<BasicBlock *, Value *> Mergeable(IncomingA.begin(), IncomingA.end());
+ for (auto [BB, V] : IncomingB) {
+ auto BBIt = Mergeable.find(BB);
+ if (BBIt != Mergeable.end() && BBIt->second != V)
+ return;
+ // Either IncomingA does not have this value or IncomingA has the same
+ // value.
+ Mergeable.insert({BB, V});
+ }
+
+ // Update the incoming value of leaderA.
+ IncomingA.assign(Mergeable.begin(), Mergeable.end());
+ PhiClasses.unionSets(ItA, ItB);
+
+ return;
----------------
arsenm wrote:
Don't need return
https://github.com/llvm/llvm-project/pull/101301
More information about the llvm-commits
mailing list