[llvm] [VectorUtils] Improve computeMinimumValueSizes (NFC) (PR #137692)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 28 12:12:10 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: Ramkumar Ramachandra (artagnon)
<details>
<summary>Changes</summary>
The Worklist used by computeMinimumValueSizes is wastefully a Value-vector, when the top of the loop attempts to cast the popped value to an Instruction anyway. Improve the algorithm by cutting this wasteful work, refining the type of Worklist, Visited, and Roots from Value-vectors to Instruction-vectors.
---
Full diff: https://github.com/llvm/llvm-project/pull/137692.diff
1 Files Affected:
- (modified) llvm/lib/Analysis/VectorUtils.cpp (+10-14)
``````````diff
diff --git a/llvm/lib/Analysis/VectorUtils.cpp b/llvm/lib/Analysis/VectorUtils.cpp
index 6448c372f5d5d..02f93d3fd1b4c 100644
--- a/llvm/lib/Analysis/VectorUtils.cpp
+++ b/llvm/lib/Analysis/VectorUtils.cpp
@@ -750,9 +750,9 @@ llvm::computeMinimumValueSizes(ArrayRef<BasicBlock *> Blocks, DemandedBits &DB,
// to ensure no extra casts would need to be inserted, so every DAG
// of connected values must have the same minimum bitwidth.
EquivalenceClasses<Value *> ECs;
- SmallVector<Value *, 16> Worklist;
- SmallPtrSet<Value *, 4> Roots;
- SmallPtrSet<Value *, 16> Visited;
+ SmallVector<Instruction *, 16> Worklist;
+ SmallPtrSet<Instruction *, 4> Roots;
+ SmallPtrSet<Instruction *, 16> Visited;
DenseMap<Value *, uint64_t> DBits;
SmallPtrSet<Instruction *, 4> InstructionSet;
MapVector<Instruction *, uint64_t> MinBWs;
@@ -786,17 +786,12 @@ llvm::computeMinimumValueSizes(ArrayRef<BasicBlock *> Blocks, DemandedBits &DB,
// Now proceed breadth-first, unioning values together.
while (!Worklist.empty()) {
- Value *Val = Worklist.pop_back_val();
- Value *Leader = ECs.getOrInsertLeaderValue(Val);
+ Instruction *I = Worklist.pop_back_val();
+ Value *Leader = ECs.getOrInsertLeaderValue(I);
- if (!Visited.insert(Val).second)
+ if (!Visited.insert(I).second)
continue;
- // Non-instructions terminate a chain successfully.
- if (!isa<Instruction>(Val))
- continue;
- Instruction *I = cast<Instruction>(Val);
-
// If we encounter a type that is larger than 64 bits, we can't represent
// it so bail out.
if (DB.getDemandedBits(I).getBitWidth() > 64)
@@ -831,9 +826,10 @@ llvm::computeMinimumValueSizes(ArrayRef<BasicBlock *> Blocks, DemandedBits &DB,
// All bits demanded, no point continuing.
continue;
- for (Value *O : cast<User>(I)->operands()) {
+ for (Value *O : I->operands()) {
ECs.unionSets(Leader, O);
- Worklist.push_back(O);
+ if (auto *OI = dyn_cast<Instruction>(O))
+ Worklist.push_back(OI);
}
}
@@ -874,7 +870,7 @@ llvm::computeMinimumValueSizes(ArrayRef<BasicBlock *> Blocks, DemandedBits &DB,
if (!MI)
continue;
Type *Ty = M->getType();
- if (Roots.count(M))
+ if (Roots.count(MI))
Ty = MI->getOperand(0)->getType();
if (MinBW >= Ty->getScalarSizeInBits())
``````````
</details>
https://github.com/llvm/llvm-project/pull/137692
More information about the llvm-commits
mailing list