[llvm] [FuncSpec] Update function specialization to handle phi-chains (PR #71442)

Mats Petersson via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 10 06:08:46 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,
----------------
Leporacanthicus wrote:

This now returns a bool to indicate if we searched the whole thing or aborted early. If we aborted, bail out in the caller.

https://github.com/llvm/llvm-project/pull/71442


More information about the llvm-commits mailing list