[llvm] StructurizeCFG: Optimize phi insertion during ssa reconstruction (PR #101301)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 31 03:25:08 PDT 2024
================
@@ -710,10 +714,107 @@ void StructurizeCFG::findUndefBlocks(
}
}
+// Return true 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 a incoming value). And return the union of the incoming values
+// through \p Merged.
+bool StructurizeCFG::isCompatible(const BBValueVector &IncomingA,
+ const BBValueVector &IncomingB,
+ BBValueVector &Merged) {
+ MapVector<BasicBlock *, Value *> UnionSet;
+ for (auto &V : IncomingA)
+ UnionSet.insert(V);
+
+ for (auto &V : IncomingB) {
+ if (UnionSet.contains(V.first) && UnionSet[V.first] != V.second)
+ return false;
+ // Either IncomingA does not have this value or IncomingA has the same
+ // value.
+ UnionSet.insert(V);
+ }
+
+ Merged.clear();
+ Merged.append(UnionSet.takeVector());
+ return true;
+}
+
/// Add the real PHI value as soon as everything is set up
void StructurizeCFG::setPhiValues() {
SmallVector<PHINode *, 8> InsertedPhis;
SSAUpdater Updater(&InsertedPhis);
+
+ DenseMap<PHINode *, std::shared_ptr<BBValueVector>> MergedPHIMap;
----------------
arsenm wrote:
Whatever it is, there is a solution that does not involve shared_ptr. Don't use shared_ptr
https://github.com/llvm/llvm-project/pull/101301
More information about the llvm-commits
mailing list