[llvm] [FuncSpec] Update function specialization to handle phi-chains (PR #71442)
Momchil Velikov via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 8 10:29:50 PST 2023
================
@@ -262,30 +267,124 @@ Cost InstCostVisitor::estimateBranchInst(BranchInst &I) {
return estimateBasicBlocks(WorkList);
}
+// This function is determining if a PHINode is part of a strongly
+// connected component - that is a chain or graph of PHINodes that all
+// link to each other. That means, if the original input to the chain
+// is a constant, all the other values are also that constant.
+//
+// For example:
+//
+// L1:
+// %a = load %0
+//
+// L4:
+// %c = phi [%a, %L1], [%d, %L2]
+//
+// L2:
+// %d = phi [%e, L3] [%c, L4]
+// L3:
+// %e = phi [%c, L4],[%f, L5]
+// L5:
+// %f = phi [%j, L6], [%h, L7]
+// L6:
+// %j = phi [%h:L7, %j, L6]
+// L7:
+// %h = phi [%g:L6, %c:L4]
+//
+// This is only showing the labels and PHINodes, not the branches that
+// choose the different paths.
+// If some input is not part of the graph, then it's not a strongly
+// connected component.
+//
+// A depth limit is used to avoid extreme recurusion.
+// A max number of incoming phi values ensures that expensive searches
+// are avoided.
+void InstCostVisitor::discoverStronglyConnectedComponent(PHINode *PN,
----------------
momchil-velikov wrote:
Perhaps you can to rephrase that, because that looks exactly the reverse reasoning. `visitPHINode` should succeed (== return a non-null pointer) when it can be deduced it has a constant value, but that's not equivalent to the PHI node being a part of (a non-trivial) SCC. It's not even necessary.
https://github.com/llvm/llvm-project/pull/71442
More information about the llvm-commits
mailing list