[llvm] [AMDGPU][PromoteAlloca] Whole-function alloca promotion to vector (PR #84735)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 13 23:51:57 PDT 2024
================
@@ -225,6 +249,55 @@ FunctionPass *llvm::createAMDGPUPromoteAllocaToVector() {
return new AMDGPUPromoteAllocaToVector();
}
+static void collectAllocaUses(AllocaInst &Alloca,
+ SmallVectorImpl<Use *> &Uses) {
+ SmallVector<Instruction *, 4> WorkList({&Alloca});
+ while (!WorkList.empty()) {
+ auto *Cur = WorkList.pop_back_val();
+ for (auto &U : Cur->uses()) {
+ Uses.push_back(&U);
+
+ if (isa<GetElementPtrInst>(U.getUser()) || isa<BitCastInst>(U.getUser()))
+ WorkList.push_back(cast<Instruction>(U.getUser()));
+ }
+ }
+}
+
+void AMDGPUPromoteAllocaImpl::sortAllocasToPromote(
+ SmallVectorImpl<AllocaInst *> &Allocas) {
+ DenseMap<AllocaInst *, unsigned> Scores;
+
+ LLVM_DEBUG(dbgs() << "Before sorting allocas:\n"; for (auto *A
+ : Allocas) dbgs()
+ << " " << *A << "\n";);
+
+ for (auto *Alloca : Allocas) {
+ LLVM_DEBUG(dbgs() << "Scoring: " << *Alloca << "\n");
+ unsigned &Score = Scores[Alloca];
+ // Increment score by one for each user + a bonus for users within loops.
+ SmallVector<Use *, 8> Uses;
+ collectAllocaUses(*Alloca, Uses);
+ for (auto *U : Uses) {
+ Instruction *Inst = cast<Instruction>(U->getUser());
+ if (isa<GetElementPtrInst>(Inst) || isa<BitCastInst>(Inst))
+ continue;
+ unsigned UserScore =
+ 1 + (LoopUserWeight * LI.getLoopDepth(Inst->getParent()));
+ LLVM_DEBUG(dbgs() << " [+" << UserScore << "]:\t" << *Inst << "\n");
+ Score += UserScore;
+ }
+ LLVM_DEBUG(dbgs() << " => Final Score:" << Score << "\n");
+ }
+
+ stable_sort(Allocas, [&](AllocaInst *A, AllocaInst *B) {
+ return Scores.at(A) > Scores.at(B);
+ });
+
+ LLVM_DEBUG(dbgs() << "After sorting allocas:\n"; for (auto *A
+ : Allocas) dbgs()
+ << " " << *A << "\n";);
----------------
arsenm wrote:
```suggestion
LLVM_DEBUG(
dbgs() << "After sorting allocas:\n";
for (auto *A : Allocas)
dbgs() << " " << *A << '\n';
);
```
https://github.com/llvm/llvm-project/pull/84735
More information about the llvm-commits
mailing list