From df2b898db807319e3c157df70a72b2d85b7f3801 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Wed, 13 Jun 2018 13:53:56 +0000 Subject: [PATCH] [llvm-exegesis] Fix failing assert when creating Snippet for LAHF. Reviewers: courbet Subscribers: tschuett, llvm-commits Differential Revision: https://reviews.llvm.org/D48123 llvm-svn: 334599 --- tools/llvm-exegesis/lib/MCInstrDescView.cpp | 16 ++++++++++------ .../llvm-exegesis/X86/SnippetGeneratorTest.cpp | 13 ++++++++++++- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/tools/llvm-exegesis/lib/MCInstrDescView.cpp b/tools/llvm-exegesis/lib/MCInstrDescView.cpp index c57696979d5..110053829a6 100644 --- a/tools/llvm-exegesis/lib/MCInstrDescView.cpp +++ b/tools/llvm-exegesis/lib/MCInstrDescView.cpp @@ -208,13 +208,17 @@ static void randomize(const Variable &Var, llvm::MCOperand &AssignedValue) { static void setRegisterOperandValue(const RegisterOperandAssignment &ROV, InstructionInstance &II) { assert(ROV.Op); - assert(ROV.Op->IsExplicit); - auto &AssignedValue = II.getValueFor(*ROV.Op); - if (AssignedValue.isValid()) { - assert(AssignedValue.isReg() && AssignedValue.getReg() == ROV.Reg); - return; + if (ROV.Op->IsExplicit) { + auto &AssignedValue = II.getValueFor(*ROV.Op); + if (AssignedValue.isValid()) { + assert(AssignedValue.isReg() && AssignedValue.getReg() == ROV.Reg); + return; + } + AssignedValue = llvm::MCOperand::createReg(ROV.Reg); + } else { + assert(ROV.Op->ImplicitReg != nullptr); + assert(ROV.Reg == *ROV.Op->ImplicitReg); } - AssignedValue = llvm::MCOperand::createReg(ROV.Reg); } size_t randomBit(const llvm::BitVector &Vector) { diff --git a/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp b/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp index 0e4a3fb8f17..d020d4cf309 100644 --- a/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp +++ b/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp @@ -103,11 +103,22 @@ TEST_F(LatencySnippetGeneratorTest, DependencyThroughOtherOpcode) { const unsigned Opcode = llvm::X86::CMP64rr; auto Conf = checkAndGetConfiguration(Opcode); - EXPECT_THAT(Conf.Info, testing::HasSubstr("cycle through CMOVLE16rr")); + EXPECT_THAT(Conf.Info, testing::HasSubstr("cycle through")); ASSERT_THAT(Conf.Snippet, testing::SizeIs(2)); + const llvm::MCInst Instr = Conf.Snippet[0]; + EXPECT_THAT(Instr.getOpcode(), Opcode); // TODO: check that the two instructions alias each other. } +TEST_F(LatencySnippetGeneratorTest, LAHF) { + const unsigned Opcode = llvm::X86::LAHF; + auto Conf = checkAndGetConfiguration(Opcode); + EXPECT_THAT(Conf.Info, testing::HasSubstr("cycle through")); + ASSERT_THAT(Conf.Snippet, testing::SizeIs(2)); + const llvm::MCInst Instr = Conf.Snippet[0]; + EXPECT_THAT(Instr.getOpcode(), Opcode); +} + class UopsSnippetGeneratorTest : public X86SnippetGeneratorTest { protected: UopsSnippetGeneratorTest() : Runner(State) {}