Skip to content

Commit 3f5ff99

Browse files
committed
Address review feedback
1 parent e8b01e9 commit 3f5ff99

File tree

4 files changed

+57
-39
lines changed

4 files changed

+57
-39
lines changed

llvm/include/llvm/SandboxIR/PassManager.h

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,20 @@ class Value;
3232
/// Base class.
3333
template <typename ParentPass, typename ContainedPass>
3434
class PassManager : public ParentPass {
35+
public:
36+
// CreatePassFunc(StringRef PassName, StringRef PassArgs).
37+
using CreatePassFunc =
38+
std::function<std::unique_ptr<ContainedPass>(StringRef, StringRef)>;
39+
3540
protected:
3641
/// The list of passes that this pass manager will run.
3742
SmallVector<std::unique_ptr<ContainedPass>> Passes;
3843

3944
PassManager(StringRef Name) : ParentPass(Name) {}
45+
PassManager(StringRef Name, StringRef Pipeline, CreatePassFunc CreatePass)
46+
: ParentPass(Name) {
47+
setPassPipeline(Pipeline, CreatePass);
48+
}
4049
PassManager(const PassManager &) = delete;
4150
PassManager(PassManager &&) = default;
4251
virtual ~PassManager() = default;
@@ -49,9 +58,6 @@ class PassManager : public ParentPass {
4958
Passes.push_back(std::move(Pass));
5059
}
5160

52-
using CreatePassFunc =
53-
std::function<std::unique_ptr<ContainedPass>(StringRef, StringRef)>;
54-
5561
/// Parses \p Pipeline as a comma-separated sequence of pass names and sets
5662
/// the pass pipeline, using \p CreatePass to instantiate passes by name.
5763
///
@@ -86,18 +92,6 @@ class PassManager : public ParentPass {
8692
std::string PipelineStr = std::string(Pipeline) + EndToken;
8793
Pipeline = StringRef(PipelineStr);
8894

89-
enum {
90-
ScanName, // reading a pass name
91-
ScanArgs, // reading a list of args
92-
ArgsEnded, // read the last '>' in an args list, must read delimiter next
93-
} State;
94-
State = ScanName;
95-
int PassBeginIdx = 0;
96-
int ArgsBeginIdx;
97-
StringRef PassName;
98-
StringRef PassArgs;
99-
int NestedArgs = 0;
100-
10195
auto AddPass = [this, CreatePass](StringRef PassName, StringRef PassArgs) {
10296
if (PassName.empty()) {
10397
errs() << "Found empty pass name.\n";
@@ -112,15 +106,25 @@ class PassManager : public ParentPass {
112106
}
113107
addPass(std::move(Pass));
114108
};
109+
110+
enum class State {
111+
ScanName, // reading a pass name
112+
ScanArgs, // reading a list of args
113+
ArgsEnded, // read the last '>' in an args list, must read delimiter next
114+
} CurrentState = State::ScanName;
115+
int PassBeginIdx = 0;
116+
int ArgsBeginIdx;
117+
StringRef PassName;
118+
int NestedArgs = 0;
115119
for (auto [Idx, C] : enumerate(Pipeline)) {
116-
switch (State) {
117-
case ScanName:
120+
switch (CurrentState) {
121+
case State::ScanName:
118122
if (C == BeginArgsToken) {
119123
// Save pass name for later and begin scanning args.
120124
PassName = Pipeline.slice(PassBeginIdx, Idx);
121125
ArgsBeginIdx = Idx + 1;
122126
++NestedArgs;
123-
State = ScanArgs;
127+
CurrentState = State::ScanArgs;
124128
break;
125129
}
126130
if (C == EndArgsToken) {
@@ -134,7 +138,7 @@ class PassManager : public ParentPass {
134138
PassBeginIdx = Idx + 1;
135139
}
136140
break;
137-
case ScanArgs:
141+
case State::ScanArgs:
138142
// While scanning args, we only care about making sure nesting of angle
139143
// brackets is correct.
140144
if (C == BeginArgsToken) {
@@ -145,11 +149,10 @@ class PassManager : public ParentPass {
145149
--NestedArgs;
146150
if (NestedArgs == 0) {
147151
// Done scanning args.
148-
PassArgs = Pipeline.slice(ArgsBeginIdx, Idx);
149-
AddPass(PassName, PassArgs);
150-
State = ArgsEnded;
152+
AddPass(PassName, Pipeline.slice(ArgsBeginIdx, Idx));
153+
CurrentState = State::ArgsEnded;
151154
} else if (NestedArgs < 0) {
152-
errs() << "Unbalanced '>' in pass pipeline.\n";
155+
errs() << "Unexpected '>' in pass pipeline.\n";
153156
exit(1);
154157
}
155158
break;
@@ -161,12 +164,12 @@ class PassManager : public ParentPass {
161164
exit(1);
162165
}
163166
break;
164-
case ArgsEnded:
167+
case State::ArgsEnded:
165168
// Once we're done scanning args, only a delimiter is valid. This avoids
166169
// accepting strings like "foo<args><more-args>" or "foo<args>bar".
167170
if (C == EndToken || C == PassDelimToken) {
168171
PassBeginIdx = Idx + 1;
169-
State = ScanName;
172+
CurrentState = State::ScanName;
170173
} else {
171174
errs() << "Expected delimiter or end-of-string after pass "
172175
"arguments.\n";
@@ -202,12 +205,18 @@ class FunctionPassManager final
202205
: public PassManager<FunctionPass, FunctionPass> {
203206
public:
204207
FunctionPassManager(StringRef Name) : PassManager(Name) {}
208+
FunctionPassManager(StringRef Name, StringRef Pipeline,
209+
CreatePassFunc CreatePass)
210+
: PassManager(Name, Pipeline, CreatePass) {}
205211
bool runOnFunction(Function &F) final;
206212
};
207213

208214
class RegionPassManager final : public PassManager<RegionPass, RegionPass> {
209215
public:
210216
RegionPassManager(StringRef Name) : PassManager(Name) {}
217+
RegionPassManager(StringRef Name, StringRef Pipeline,
218+
CreatePassFunc CreatePass)
219+
: PassManager(Name, Pipeline, CreatePass) {}
211220
bool runOnRegion(Region &R) final;
212221
};
213222

llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616
namespace llvm::sandboxir {
1717

1818
BottomUpVec::BottomUpVec(StringRef Pipeline)
19-
: FunctionPass("bottom-up-vec"), RPM("rpm") {
20-
RPM.setPassPipeline(Pipeline, SandboxVectorizerPassBuilder::createRegionPass);
21-
}
19+
: FunctionPass("bottom-up-vec"),
20+
RPM("rpm", Pipeline, SandboxVectorizerPassBuilder::createRegionPass) {}
2221

2322
// TODO: This is a temporary function that returns some seeds.
2423
// Replace this with SeedCollector's function when it lands.

llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/RegionsFromMetadata.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@
1414
namespace llvm::sandboxir {
1515

1616
RegionsFromMetadata::RegionsFromMetadata(StringRef Pipeline)
17-
: FunctionPass("regions-from-metadata"), RPM("rpm") {
18-
RPM.setPassPipeline(Pipeline, SandboxVectorizerPassBuilder::createRegionPass);
19-
}
17+
: FunctionPass("regions-from-metadata"),
18+
RPM("rpm", Pipeline, SandboxVectorizerPassBuilder::createRegionPass) {}
2019

2120
bool RegionsFromMetadata::runOnFunction(Function &F) {
2221
SmallVector<std::unique_ptr<sandboxir::Region>> Regions =

llvm/unittests/SandboxIR/PassTest.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -319,16 +319,27 @@ define void @f() {
319319
".*not registered.*");
320320
EXPECT_DEATH(FPM2.setPassPipeline(",", CreatePass), ".*empty pass name.*");
321321
EXPECT_DEATH(FPM2.setPassPipeline("<>", CreatePass), ".*empty pass name.*");
322+
EXPECT_DEATH(FPM2.setPassPipeline("<>foo", CreatePass),
323+
".*empty pass name.*");
322324
EXPECT_DEATH(FPM2.setPassPipeline("foo,<>", CreatePass),
323325
".*empty pass name.*");
324326

325327
// Mismatched argument brackets.
326-
EXPECT_DEATH(FPM2.setPassPipeline("foo<", CreatePass), ".*");
327-
EXPECT_DEATH(FPM2.setPassPipeline("foo>", CreatePass), ".*");
328-
EXPECT_DEATH(FPM2.setPassPipeline("foo<bar<>", CreatePass), ".*");
329-
EXPECT_DEATH(FPM2.setPassPipeline("foo<bar<>>>", CreatePass), ".*");
330-
EXPECT_DEATH(FPM2.setPassPipeline(">foo", CreatePass), ".*");
331-
EXPECT_DEATH(FPM2.setPassPipeline("<>foo", CreatePass), ".*");
332-
EXPECT_DEATH(FPM2.setPassPipeline("foo<args><more-args>", CreatePass), ".*");
333-
EXPECT_DEATH(FPM2.setPassPipeline("foo<args>bar", CreatePass), ".*");
328+
EXPECT_DEATH(FPM2.setPassPipeline("foo<", CreatePass), ".*Missing '>'.*");
329+
EXPECT_DEATH(FPM2.setPassPipeline("foo<bar", CreatePass), ".*Missing '>'.*");
330+
EXPECT_DEATH(FPM2.setPassPipeline("foo<bar<>", CreatePass),
331+
".*Missing '>'.*");
332+
EXPECT_DEATH(FPM2.setPassPipeline("foo>", CreatePass), ".*Unexpected '>'.*");
333+
EXPECT_DEATH(FPM2.setPassPipeline(">foo", CreatePass), ".*Unexpected '>'.*");
334+
// Extra garbage between args and next delimiter/end-of-string.
335+
EXPECT_DEATH(FPM2.setPassPipeline("foo<bar<>>>", CreatePass),
336+
".*Expected delimiter.*");
337+
EXPECT_DEATH(FPM2.setPassPipeline("bar<>foo", CreatePass),
338+
".*Expected delimiter.*");
339+
EXPECT_DEATH(FPM2.setPassPipeline("bar<>foo,baz", CreatePass),
340+
".*Expected delimiter.*");
341+
EXPECT_DEATH(FPM2.setPassPipeline("foo<args><more-args>", CreatePass),
342+
".*Expected delimiter.*");
343+
EXPECT_DEATH(FPM2.setPassPipeline("foo<args>bar", CreatePass),
344+
".*Expected delimiter.*");
334345
}

0 commit comments

Comments
 (0)