[llvm-exegesis][NFC] Return many CodeTemplates instead of one.
Summary: This is part one of the change where I simply changed the signature of the functions. More work need to be done to actually produce more than one CodeTemplate per instruction.
Reviewers: courbet
Subscribers: tschuett, llvm-commits
Differential Revision: https://reviews.llvm.org/D53209
llvm-svn: 344493
diff --git a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp
index f7a76d8..9b577fd 100644
--- a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp
+++ b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp
@@ -22,6 +22,12 @@
namespace exegesis {
+std::vector<CodeTemplate> getSingleton(CodeTemplate &CT) {
+ std::vector<CodeTemplate> Result;
+ Result.push_back(std::move(CT));
+ return Result;
+}
+
SnippetGeneratorFailure::SnippetGeneratorFailure(const llvm::Twine &S)
: llvm::StringError(S, llvm::inconvertibleErrorCode()) {}
@@ -31,26 +37,28 @@
llvm::Expected<std::vector<BenchmarkCode>>
SnippetGenerator::generateConfigurations(const Instruction &Instr) const {
- if (auto E = generateCodeTemplate(Instr)) {
- CodeTemplate &CT = E.get();
+ if (auto E = generateCodeTemplates(Instr)) {
const auto &RATC = State.getRATC();
- const llvm::BitVector &ForbiddenRegs =
- CT.ScratchSpacePointerInReg
- ? RATC.getRegister(CT.ScratchSpacePointerInReg).aliasedBits()
- : RATC.emptyRegisters();
std::vector<BenchmarkCode> Output;
- // TODO: Generate as many BenchmarkCode as needed.
- {
- BenchmarkCode BC;
- BC.Info = CT.Info;
- for (InstructionTemplate &IT : CT.Instructions) {
- randomizeUnsetVariables(ForbiddenRegs, IT);
- BC.Instructions.push_back(IT.build());
+ for (CodeTemplate &CT : E.get()) {
+ const llvm::BitVector &ForbiddenRegs =
+ CT.ScratchSpacePointerInReg
+ ? RATC.getRegister(CT.ScratchSpacePointerInReg).aliasedBits()
+ : RATC.emptyRegisters();
+ // TODO: Generate as many BenchmarkCode as needed.
+ {
+ BenchmarkCode BC;
+ BC.Info = CT.Info;
+ for (InstructionTemplate &IT : CT.Instructions) {
+ randomizeUnsetVariables(ForbiddenRegs, IT);
+ BC.Instructions.push_back(IT.build());
+ }
+ if (CT.ScratchSpacePointerInReg)
+ BC.LiveIns.push_back(CT.ScratchSpacePointerInReg);
+ BC.RegisterInitialValues =
+ computeRegisterInitialValues(CT.Instructions);
+ Output.push_back(std::move(BC));
}
- if (CT.ScratchSpacePointerInReg)
- BC.LiveIns.push_back(CT.ScratchSpacePointerInReg);
- BC.RegisterInitialValues = computeRegisterInitialValues(CT.Instructions);
- Output.push_back(std::move(BC));
}
return Output;
} else
@@ -99,13 +107,14 @@
return RIV;
}
-llvm::Expected<CodeTemplate> SnippetGenerator::generateSelfAliasingCodeTemplate(
- const Instruction &Instr) const {
+llvm::Expected<std::vector<CodeTemplate>>
+generateSelfAliasingCodeTemplates(const Instruction &Instr) {
const AliasingConfigurations SelfAliasing(Instr, Instr);
- if (SelfAliasing.empty()) {
+ if (SelfAliasing.empty())
return llvm::make_error<SnippetGeneratorFailure>("empty self aliasing");
- }
- CodeTemplate CT;
+ std::vector<CodeTemplate> Result;
+ Result.emplace_back();
+ CodeTemplate &CT = Result.back();
InstructionTemplate IT(Instr);
if (SelfAliasing.hasImplicitAliasing()) {
CT.Info = "implicit Self cycles, picking random values.";
@@ -116,16 +125,18 @@
setRandomAliasing(SelfAliasing, IT, IT);
}
CT.Instructions.push_back(std::move(IT));
- return std::move(CT);
+ return Result;
}
-llvm::Expected<CodeTemplate>
-SnippetGenerator::generateUnconstrainedCodeTemplate(const Instruction &Instr,
- llvm::StringRef Msg) const {
- CodeTemplate CT;
+llvm::Expected<std::vector<CodeTemplate>>
+generateUnconstrainedCodeTemplates(const Instruction &Instr,
+ llvm::StringRef Msg) {
+ std::vector<CodeTemplate> Result;
+ Result.emplace_back();
+ CodeTemplate &CT = Result.back();
CT.Info = llvm::formatv("{0}, repeating an unconstrained assignment", Msg);
CT.Instructions.emplace_back(Instr);
- return std::move(CT);
+ return Result;
}
std::mt19937 &randomGenerator() {