From 95b631181a610dc8c94a699975a6e6b43709e5a2 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Fri, 26 May 2023 10:35:25 -0700 Subject: [PATCH] [SLP]Fix getSpillCost functions. There are several issues in the current implementation. The instructions are not properly ordered, if they are placed in different basic blocks, need to reverse the order of blocks. Also, need to exclude non-vectorizable nodes and check for CallBase, not CallInst, otherwise invoke calls are not handled correctly. --- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 6 ++++-- llvm/test/Transforms/SLPVectorizer/AArch64/landing_pad.ll | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index c379c6d..551aa0d 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -8094,6 +8094,8 @@ InstructionCost BoUpSLP::getSpillCost() const { // are grouped together. Using dominance ensures a deterministic order. SmallVector OrderedScalars; for (const auto &TEPtr : VectorizableTree) { + if (TEPtr->State != TreeEntry::Vectorize) + continue; Instruction *Inst = dyn_cast(TEPtr->Scalars[0]); if (!Inst) continue; @@ -8107,7 +8109,7 @@ InstructionCost BoUpSLP::getSpillCost() const { assert((NodeA == NodeB) == (NodeA->getDFSNumIn() == NodeB->getDFSNumIn()) && "Different nodes should have different DFS numbers"); if (NodeA != NodeB) - return NodeA->getDFSNumIn() < NodeB->getDFSNumIn(); + return NodeA->getDFSNumIn() > NodeB->getDFSNumIn(); return B->comesBefore(A); }); @@ -8166,7 +8168,7 @@ InstructionCost BoUpSLP::getSpillCost() const { }; // Debug information does not impact spill cost. - if (isa(&*PrevInstIt) && !NoCallIntrinsic(&*PrevInstIt) && + if (isa(&*PrevInstIt) && !NoCallIntrinsic(&*PrevInstIt) && &*PrevInstIt != PrevInst) NumCalls++; diff --git a/llvm/test/Transforms/SLPVectorizer/AArch64/landing_pad.ll b/llvm/test/Transforms/SLPVectorizer/AArch64/landing_pad.ll index be5389b..8e32a14 100644 --- a/llvm/test/Transforms/SLPVectorizer/AArch64/landing_pad.ll +++ b/llvm/test/Transforms/SLPVectorizer/AArch64/landing_pad.ll @@ -28,7 +28,7 @@ ; YAML-NEXT: Function: foo ; YAML-NEXT: Args: ; YAML-NEXT: - String: 'SLP vectorized with cost ' -; YAML-NEXT: - Cost: '-3' +; YAML-NEXT: - Cost: '1' ; YAML-NEXT: - String: ' and with tree size ' ; YAML-NEXT: - TreeSize: '9' -- 2.7.4