[llvm] [SandboxVectorizer] Define SeedBundle: a set of instructions to be vectorized [retry] (PR #111073)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 3 17:11:19 PDT 2024
================
@@ -0,0 +1,62 @@
+//===- SeedCollection.cpp -0000000----------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/Analysis/LoopAccessAnalysis.h"
+#include "llvm/Analysis/ValueTracking.h"
+#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/Type.h"
+#include "llvm/SandboxIR/Instruction.h"
+#include "llvm/SandboxIR/Utils.h"
+#include "llvm/Support/Debug.h"
+#include <span>
+
+using namespace llvm;
+namespace llvm::sandboxir {
+
+MutableArrayRef<SeedBundle::SeedList>
+SeedBundle::getSlice(unsigned StartIdx, unsigned MaxVecRegBits,
+ bool ForcePowerOf2) {
+ // Use uint32_t here for compatibility with IsPowerOf2_32
+
+ // BitCount tracks the size of the working slice. From that we can tell
+ // when the working slice's size is a power-of-two and when it exceeds
+ // the legal size in MaxVecBits.
+ uint32_t BitCount = 0;
+ uint32_t NumElements = 0;
+ // Can't start a slice with a used instruction.
+ assert(!isUsed(StartIdx) && "Expected unused at StartIdx");
+ for (auto S : make_range(Seeds.begin() + StartIdx, Seeds.end())) {
+ uint32_t InstBits = Utils::getNumBits(S);
+ // Stop if this instruction is used, or if adding it puts the slice over
+ // the limit.
+ if (isUsed(StartIdx + NumElements) || BitCount + InstBits > MaxVecRegBits)
+ break;
+ NumElements++;
+ BitCount += Utils::getNumBits(S);
+ }
+ // Most slices will already be power-of-two-sized. But this one isn't, remove
+ // instructions until it is. This could be tracked in the loop above but the
+ // logic is harder to follow. TODO: Move if performance is unacceptable.
+ if (ForcePowerOf2) {
+ while (!isPowerOf2_32(BitCount) && NumElements > 1) {
----------------
vporpo wrote:
We could avoid iterating until we get a power of 2 with the help of a function that gives you the floor power-of-2 value.
https://github.com/llvm/llvm-project/pull/111073
More information about the llvm-commits
mailing list