Index: llvm/trunk/tools/llvm-exegesis/lib/Latency.h =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/Latency.h +++ llvm/trunk/tools/llvm-exegesis/lib/Latency.h @@ -30,8 +30,6 @@ generateCodeTemplate(unsigned Opcode) const override; private: - llvm::Error isInfeasible(const llvm::MCInstrDesc &MCInstrDesc) const; - llvm::Expected generateTwoInstructionPrototype(const Instruction &Instr) const; }; Index: llvm/trunk/tools/llvm-exegesis/lib/Latency.cpp =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/Latency.cpp +++ llvm/trunk/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( - "Infeasible : has unknown operands"); - if (llvm::any_of(MCInstrDesc.operands(), hasMemoryOperand)) - return llvm::make_error( - "Infeasible : has memory operands"); - return llvm::Error::success(); -} - llvm::Expected LatencySnippetGenerator::generateTwoInstructionPrototype( const Instruction &Instr) const { @@ -53,11 +33,9 @@ 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 @@ llvm::Expected 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( + "Infeasible : has memory operands"); if (auto CT = generateSelfAliasingCodeTemplate(Instr)) return CT; else Index: llvm/trunk/tools/llvm-exegesis/lib/Uops.h =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/Uops.h +++ llvm/trunk/tools/llvm-exegesis/lib/Uops.h @@ -31,8 +31,6 @@ 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 Index: llvm/trunk/tools/llvm-exegesis/lib/Uops.cpp =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/Uops.cpp +++ llvm/trunk/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( - "Infeasible : has unknown operands"); - return llvm::Error::success(); -} - static llvm::SmallVector getVariablesWithTiedOperands(const Instruction &Instr) { llvm::SmallVector Result; @@ -109,6 +97,7 @@ } UopsBenchmarkRunner::~UopsBenchmarkRunner() = default; + UopsSnippetGenerator::~UopsSnippetGenerator() = default; void UopsSnippetGenerator::instantiateMemoryOperands( @@ -137,10 +126,10 @@ llvm::Expected 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( + "Infeasible : has unknown operands"); const auto &ET = State.getExegesisTarget(); CodeTemplate CT;