summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp
diff options
context:
space:
mode:
authorGuillaume Chatelet <gchatelet@google.com>2018-10-15 09:09:19 +0000
committerGuillaume Chatelet <gchatelet@google.com>2018-10-15 09:09:19 +0000
commit296a862cbeb34eeacd340a130962256d99bd06bc (patch)
treeba622b1ea13e32716f115f9f52d62493ec242c9b /llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp
parent064944352e6433e24cd2fd55148583d43a99904b (diff)
downloadbcm5719-llvm-296a862cbeb34eeacd340a130962256d99bd06bc.tar.gz
bcm5719-llvm-296a862cbeb34eeacd340a130962256d99bd06bc.zip
[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
Diffstat (limited to 'llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp')
-rw-r--r--llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp67
1 files changed, 39 insertions, 28 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp
index f7a76d88ccf..9b577fd65a9 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 @@ SnippetGenerator::~SnippetGenerator() = default;
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 @@ std::vector<RegisterValue> SnippetGenerator::computeRegisterInitialValues(
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 @@ llvm::Expected<CodeTemplate> SnippetGenerator::generateSelfAliasingCodeTemplate(
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() {
OpenPOWER on IntegriCloud