diff options
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/Latency.cpp | 34 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/Latency.h | 2 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/Uops.cpp | 21 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/Uops.h | 2 |
4 files changed, 11 insertions, 48 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/Latency.cpp b/llvm/tools/llvm-exegesis/lib/Latency.cpp index 08155ee1855..4173cf3f9a1 100644 --- a/llvm/tools/llvm-exegesis/lib/Latency.cpp +++ b/llvm/tools/llvm-exegesis/lib/Latency.cpp @@ -20,28 +20,8 @@ namespace exegesis { -static bool hasUnknownOperand(const llvm::MCOperandInfo &OpInfo) { - return OpInfo.OperandType == llvm::MCOI::OPERAND_UNKNOWN; -} - -// FIXME: Handle memory, see PR36905. -static bool hasMemoryOperand(const llvm::MCOperandInfo &OpInfo) { - return OpInfo.OperandType == llvm::MCOI::OPERAND_MEMORY; -} - LatencySnippetGenerator::~LatencySnippetGenerator() = default; -llvm::Error LatencySnippetGenerator::isInfeasible( - const llvm::MCInstrDesc &MCInstrDesc) const { - if (llvm::any_of(MCInstrDesc.operands(), hasUnknownOperand)) - return llvm::make_error<BenchmarkFailure>( - "Infeasible : has unknown operands"); - if (llvm::any_of(MCInstrDesc.operands(), hasMemoryOperand)) - return llvm::make_error<BenchmarkFailure>( - "Infeasible : has memory operands"); - return llvm::Error::success(); -} - llvm::Expected<CodeTemplate> LatencySnippetGenerator::generateTwoInstructionPrototype( const Instruction &Instr) const { @@ -53,11 +33,9 @@ LatencySnippetGenerator::generateTwoInstructionPrototype( if (OtherOpcode == Instr.Description->Opcode) continue; const auto &OtherInstrDesc = State.getInstrInfo().get(OtherOpcode); - if (auto E = isInfeasible(OtherInstrDesc)) { - llvm::consumeError(std::move(E)); - continue; - } const Instruction OtherInstr(OtherInstrDesc, RATC); + if (OtherInstr.hasMemoryOperands()) + continue; const AliasingConfigurations Forward(Instr, OtherInstr); const AliasingConfigurations Back(OtherInstr, Instr); if (Forward.empty() || Back.empty()) @@ -81,10 +59,10 @@ LatencySnippetGenerator::generateTwoInstructionPrototype( llvm::Expected<CodeTemplate> LatencySnippetGenerator::generateCodeTemplate(unsigned Opcode) const { - const auto &InstrDesc = State.getInstrInfo().get(Opcode); - if (auto E = isInfeasible(InstrDesc)) - return std::move(E); - const Instruction Instr(InstrDesc, RATC); + const Instruction Instr(State.getInstrInfo().get(Opcode), RATC); + if (Instr.hasMemoryOperands()) + return llvm::make_error<BenchmarkFailure>( + "Infeasible : has memory operands"); if (auto CT = generateSelfAliasingCodeTemplate(Instr)) return CT; else diff --git a/llvm/tools/llvm-exegesis/lib/Latency.h b/llvm/tools/llvm-exegesis/lib/Latency.h index 3a72d026d9f..37feb62e3dc 100644 --- a/llvm/tools/llvm-exegesis/lib/Latency.h +++ b/llvm/tools/llvm-exegesis/lib/Latency.h @@ -30,8 +30,6 @@ public: generateCodeTemplate(unsigned Opcode) const override; private: - llvm::Error isInfeasible(const llvm::MCInstrDesc &MCInstrDesc) const; - llvm::Expected<CodeTemplate> generateTwoInstructionPrototype(const Instruction &Instr) const; }; diff --git a/llvm/tools/llvm-exegesis/lib/Uops.cpp b/llvm/tools/llvm-exegesis/lib/Uops.cpp index 5bb44e33af3..d291ff7664e 100644 --- a/llvm/tools/llvm-exegesis/lib/Uops.cpp +++ b/llvm/tools/llvm-exegesis/lib/Uops.cpp @@ -81,18 +81,6 @@ namespace exegesis { -static bool hasUnknownOperand(const llvm::MCOperandInfo &OpInfo) { - return OpInfo.OperandType == llvm::MCOI::OPERAND_UNKNOWN; -} - -llvm::Error -UopsSnippetGenerator::isInfeasible(const llvm::MCInstrDesc &MCInstrDesc) const { - if (llvm::any_of(MCInstrDesc.operands(), hasUnknownOperand)) - return llvm::make_error<BenchmarkFailure>( - "Infeasible : has unknown operands"); - return llvm::Error::success(); -} - static llvm::SmallVector<const Variable *, 8> getVariablesWithTiedOperands(const Instruction &Instr) { llvm::SmallVector<const Variable *, 8> Result; @@ -109,6 +97,7 @@ static void remove(llvm::BitVector &a, const llvm::BitVector &b) { } UopsBenchmarkRunner::~UopsBenchmarkRunner() = default; + UopsSnippetGenerator::~UopsSnippetGenerator() = default; void UopsSnippetGenerator::instantiateMemoryOperands( @@ -137,10 +126,10 @@ void UopsSnippetGenerator::instantiateMemoryOperands( llvm::Expected<CodeTemplate> UopsSnippetGenerator::generateCodeTemplate(unsigned Opcode) const { - const auto &InstrDesc = State.getInstrInfo().get(Opcode); - if (auto E = isInfeasible(InstrDesc)) - return std::move(E); - const Instruction Instr(InstrDesc, RATC); + const Instruction Instr(State.getInstrInfo().get(Opcode), RATC); + if (Instr.hasMemoryOperands()) + return llvm::make_error<BenchmarkFailure>( + "Infeasible : has unknown operands"); const auto &ET = State.getExegesisTarget(); CodeTemplate CT; diff --git a/llvm/tools/llvm-exegesis/lib/Uops.h b/llvm/tools/llvm-exegesis/lib/Uops.h index 31523f5a9a4..33d0d8b1596 100644 --- a/llvm/tools/llvm-exegesis/lib/Uops.h +++ b/llvm/tools/llvm-exegesis/lib/Uops.h @@ -31,8 +31,6 @@ public: static constexpr const size_t kMinNumDifferentAddresses = 6; private: - llvm::Error isInfeasible(const llvm::MCInstrDesc &MCInstrDesc) const; - // Instantiates memory operands within a snippet. // To make computations as parallel as possible, we generate independant // memory locations for instructions that load and store. If there are less |