LLVM 23.0.0git
SeedCollection.cpp
Go to the documentation of this file.
1//===- SeedCollection.cpp - Seed collection pass --------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
16
17namespace llvm {
18
20 OverrideVecRegBits("sbvec-vec-reg-bits", cl::init(0), cl::Hidden,
21 cl::desc("Override the vector register size in bits, "
22 "which is otherwise found by querying TTI."));
23static cl::opt<bool>
24 AllowNonPow2("sbvec-allow-non-pow2", cl::init(false), cl::Hidden,
25 cl::desc("Allow non-power-of-2 vectorization."));
26
27#define LoadSeedsDef "loads"
28#define StoreSeedsDef "stores"
30 "sbvec-collect-seeds", cl::init(StoreSeedsDef), cl::Hidden,
31 cl::desc("Collect these seeds. Use empty for none or a comma-separated "
32 "list of '" StoreSeedsDef "' and '" LoadSeedsDef "'."));
33
34namespace sandboxir {
35
37 : FunctionPass("seed-collection"),
38 RPM("rpm", Pipeline, SandboxVectorizerPassBuilder::createRegionPass) {
39 if (!AuxArg.empty()) {
40 if (AuxArg != DiffTypesArgStr) {
41 std::string ErrStr;
42 raw_string_ostream ErrSS(ErrStr);
43 ErrSS << "SeedCollection only supports '" << DiffTypesArgStr
44 << "' aux argument!\n";
45 reportFatalUsageError(ErrStr.c_str());
46 }
47 AllowDiffTypes = true;
48 }
49}
50
52 bool Change = false;
53 const auto &DL = F.getParent()->getDataLayout();
54 bool CollectStores = CollectSeeds.find(StoreSeedsDef) != std::string::npos;
55 bool CollectLoads = CollectSeeds.find(LoadSeedsDef) != std::string::npos;
56
57 // TODO: Start from innermost BBs first
58 for (auto &BB : F) {
59 SeedCollector SC(&BB, A.getScalarEvolution(), CollectStores, CollectLoads,
60 AllowDiffTypes);
61 for (SeedBundle &Seeds : SC.getStoreSeeds()) {
62 unsigned ElmBits =
64 Seeds[Seeds.getFirstUnusedElementIdx()])),
65 DL);
66 unsigned AS = getLoadStoreAddressSpace(Seeds[0]);
67 unsigned VecRegBits = OverrideVecRegBits != 0
69 : A.getTTI().getLoadStoreVecRegBitWidth(AS);
70
71 auto DivideBy2 = [](unsigned Num) {
72 auto Floor = VecUtils::getFloorPowerOf2(Num);
73 if (Floor == Num)
74 return Floor / 2;
75 return Floor;
76 };
77 // Try to create the largest vector supported by the target. If it fails
78 // reduce the vector size by half.
79 for (unsigned SliceElms = std::min(VecRegBits / ElmBits,
80 Seeds.getNumUnusedBits() / ElmBits);
81 SliceElms >= 2u; SliceElms = DivideBy2(SliceElms)) {
82 if (Seeds.allUsed())
83 break;
84 // Keep trying offsets after FirstUnusedElementIdx, until we vectorize
85 // the slice. This could be quite expensive, so we enforce a limit.
86 for (unsigned Offset = Seeds.getFirstUnusedElementIdx(),
87 OE = Seeds.size();
88 Offset + 1 < OE; Offset += 1) {
89 // Seeds are getting used as we vectorize, so skip them.
90 if (Seeds.isUsed(Offset))
91 continue;
92 if (Seeds.allUsed())
93 break;
94
95 auto SeedSlice =
96 Seeds.getSlice(Offset, SliceElms * ElmBits, !AllowNonPow2);
97 if (SeedSlice.empty())
98 continue;
99
100 assert(SeedSlice.size() >= 2 && "Should have been rejected!");
101
102 // Create a region containing the seed slice.
103 auto &Ctx = F.getContext();
104 Region Rgn(Ctx, A.getTTI());
105 Rgn.setAux(SeedSlice);
106 // Run the region pass pipeline.
107 Change |= RPM.runOnRegion(Rgn, A);
108 Rgn.clearAux();
109 }
110 }
111 }
112 }
113 return Change;
114}
115} // namespace sandboxir
116} // namespace llvm
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define F(x, y, z)
Definition MD5.cpp:54
#define StoreSeedsDef
#define LoadSeedsDef
This pass exposes codegen information to IR-level passes.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
FunctionPass(StringRef Name)
Name can't contain any spaces or start with '-'.
Definition Pass.h:78
The main job of the Region is to point to new instructions generated by vectorization passes.
Definition Region.h:96
LLVM_ABI void clearAux()
Clears all auxiliary data.
Definition Region.cpp:107
A set of candidate Instructions for vectorizing together.
SeedCollection(StringRef Pipeline, StringRef AuxArg)
bool runOnFunction(Function &F, const Analyses &A) final
\Returns true if it modifies F.
iterator_range< SeedContainer::iterator > getStoreSeeds()
static unsigned getNumBits(Type *Ty, const DataLayout &DL)
\Returns the number of bits of Ty.
Definition Utils.h:66
static Type * getExpectedType(const Value *V)
\Returns the expected type of Value V.
Definition Utils.h:32
static Type * getElementType(Type *Ty)
Returns Ty if scalar or its element type if vector.
Definition VecUtils.h:52
static LLVM_ABI unsigned getFloorPowerOf2(unsigned Num)
\Returns the first integer power of 2 that is <= Num.
Definition VecUtils.cpp:13
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:557
unsigned getLoadStoreAddressSpace(const Value *I)
A helper function that returns the address space of the pointer operand of load or store instruction.
static cl::opt< unsigned > OverrideVecRegBits("sbvec-vec-reg-bits", cl::init(0), cl::Hidden, cl::desc("Override the vector register size in bits, " "which is otherwise found by querying TTI."))
static cl::opt< bool > AllowNonPow2("sbvec-allow-non-pow2", cl::init(false), cl::Hidden, cl::desc("Allow non-power-of-2 vectorization."))
cl::opt< std::string > CollectSeeds("sbvec-collect-seeds", cl::init(StoreSeedsDef), cl::Hidden, cl::desc("Collect these seeds. Use empty for none or a comma-separated " "list of '" StoreSeedsDef "' and '" LoadSeedsDef "'."))