[llvm] [LoopUnroll] Structural cost savings analysis for full loop unrolling (PR #114579)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 20 04:58:37 PST 2024
================
@@ -337,8 +336,239 @@ struct PragmaInfo {
const bool PragmaEnableUnroll;
};
+/// Helper type to estimate per-iteration cost savings coming from fully
+/// unrolling a loop.
+///
+/// The analysis maintains a set of "known instructions" inside the loop (i.e.,
+/// instructions whose result will be statically known after loop unrolling)
+/// that we assume will be entirely removable if the loop is fully unrolled.
+/// These instructions' cost can be deducted from the unrolled cost when
+/// comparing against a threshold.
+struct FullUnrollCostSavings {
+ FullUnrollCostSavings(const Loop *L) : L(L) {}
+
+ /// Returns whether the instruction is known.
+ inline bool isKnown(const Instruction *I) const {
+ return KnownVals.contains(I);
+ }
+
+ /// If the value is an instruction, returns whether that instruction is known,
+ /// false otherwise.
+ bool isKnown(const Value *V) const {
+ if (const Instruction *I = dyn_cast<Instruction>(V))
+ return isKnown(I);
+ return false;
+ }
+
+ /// Adds an instruction to the known set and re-evaluates unknown instructions
+ /// in the loop to determine whether their result can now be known.
+ void addToKnown(const Instruction *I) {
+ if (!KnownVals.insert(I).second)
+ return;
+
+ // Every time we assume knowledge of an additional instruction result, we
+ // potentially need to revisit instructions that were previously seen as
+ // unoptimizable.
+ Evaluated.clear();
+
+ addUsersToExploreSet(I);
+ while (ToEvaluate.size()) {
+ const Instruction *I = ToEvaluate.back();
+ ToEvaluate.pop_back();
----------------
arsenm wrote:
SmallVector has pop_back_val
https://github.com/llvm/llvm-project/pull/114579
More information about the llvm-commits
mailing list