[llvm] [VectorUtils] Improve computeMinimumValueSizes (NFC) (PR #137692)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 28 12:11:34 PDT 2025
https://github.com/artagnon created https://github.com/llvm/llvm-project/pull/137692
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.
>From d139a47765dd33614f86a3ac456b999710f5de08 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Mon, 28 Apr 2025 20:03:28 +0100
Subject: [PATCH] [VectorUtils] Improve computeMinimumValueSizes (NFC)
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.
---
llvm/lib/Analysis/VectorUtils.cpp | 24 ++++++++++--------------
1 file changed, 10 insertions(+), 14 deletions(-)
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())
More information about the llvm-commits
mailing list