[llvm] [SimplifyCFG] Speculatively execute empty BBs with multiple predecessors (PR #120905)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Sun Dec 22 23:51:46 PST 2024
================
@@ -3506,6 +3506,96 @@ bool SimplifyCFGOpt::speculativelyExecuteBB(BranchInst *BI,
return true;
}
+/// Speculate a conditional basic block flattening the CFG.
+/// Compared to speculativelyExecuteBB, it allows \p ThenBB to have multiple
+/// predecessors other than the current BB. An illustration of this transform is
+/// turning this IR:
+/// \code
+/// BB:
+/// %cmp = icmp ult %x, %y
+/// br i1 %cmp, label %EndBB, label %ThenBB
+/// ThenBB:
+/// br label BB2
+/// EndBB:
+/// %phi = phi i1 [ true, %ThenBB ], [ false, %BB ], [ false, %OtherBB ]
+/// ...
+/// \endcode
+///
+/// Into this IR:
+/// \code
+/// BB:
+/// %cmp = icmp ult %x, %y
+/// %sel = select i1 %cmp, i1 true, i1 false
+/// br label %EndBB
+/// ThenBB:
+/// br label BB2
+/// EndBB:
+/// %phi = phi i1 [ %sel, %ThenBB ], [ false, %BB ], [ false, %OtherBB ]
+/// ...
+/// \endcode
+/// \returns true if the branch edge is removed.
+static bool speculativelyExecuteEmptyBB(BranchInst *BI, bool Invert,
+ DomTreeUpdater *DTU,
+ const TargetTransformInfo &TTI) {
+ BasicBlock *BB = BI->getParent();
+ BasicBlock *ThenBB = BI->getSuccessor(Invert);
+ BasicBlock *EndBB = BI->getSuccessor(!Invert);
+
+ BranchInst *SuccBI = dyn_cast<BranchInst>(ThenBB->getTerminator());
+ if (!SuccBI || !SuccBI->isUnconditional() || SuccBI->getSuccessor(0) != EndBB)
+ return false;
+ if (&ThenBB->front() != SuccBI)
+ return false;
+ if (!isProfitableToSpeculate(BI, Invert, TTI))
+ return false;
+
+ InstructionCost Budget =
+ PHINodeFoldingThreshold * TargetTransformInfo::TCC_Basic;
+ InstructionCost Cost = 0;
+ unsigned SpeculatedInstructions = 0;
+ if (!validateAndCostRequiredSelects(BB, ThenBB, EndBB, SpeculatedInstructions,
----------------
dtcxzyw wrote:
Looks like it doesn't help :( https://llvm-compile-time-tracker.com/compare.php?from=9423961f259f49007dc9cdea7344094a6fdf1afb&to=b2d0fe1be968cc2c3d78bd087c6530af8ff0f772&stat=instructions:u
https://github.com/llvm/llvm-project/pull/120905
More information about the llvm-commits
mailing list