From a82235843b102202766115e10003c9465a8b83ae Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Mon, 8 Apr 2019 10:11:00 +0000 Subject: [PATCH] [llvm-exegesis][X86] Randomize CMOVcc/SETcc OPERAND_COND_CODE CondCodes Reviewers: courbet, gchatelet Reviewed By: gchatelet Subscribers: tschuett, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60066 llvm-svn: 357898 --- llvm/test/tools/llvm-exegesis/X86/latency-CMOV32rr.s | 2 +- llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp | 11 ++++++----- llvm/tools/llvm-exegesis/lib/SnippetGenerator.h | 3 +++ llvm/tools/llvm-exegesis/lib/X86/Target.cpp | 5 +++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/llvm/test/tools/llvm-exegesis/X86/latency-CMOV32rr.s b/llvm/test/tools/llvm-exegesis/X86/latency-CMOV32rr.s index d983c2b..8eec5c0c 100644 --- a/llvm/test/tools/llvm-exegesis/X86/latency-CMOV32rr.s +++ b/llvm/test/tools/llvm-exegesis/X86/latency-CMOV32rr.s @@ -4,6 +4,6 @@ CHECK: --- CHECK-NEXT: mode: latency CHECK-NEXT: key: CHECK-NEXT: instructions: -CHECK-NEXT: CMOV32rr +CHECK-NEXT: 'CMOV32rr {{.*}} i_0x{{[0-9a-f]}}' CHECK-NEXT: config: '' CHECK-LAST: ... diff --git a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp index 8cbde9f..d5c790d 100644 --- a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp +++ b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp @@ -146,15 +146,16 @@ std::mt19937 &randomGenerator() { return RandomGenerator; } -static size_t randomIndex(size_t Size) { - assert(Size > 0); - std::uniform_int_distribution<> Distribution(0, Size - 1); +size_t randomIndex(size_t Max) { + std::uniform_int_distribution<> Distribution(0, Max); return Distribution(randomGenerator()); } template static auto randomElement(const C &Container) -> decltype(Container[0]) { - return Container[randomIndex(Container.size())]; + assert(!Container.empty() && + "Can't pick a random element from an empty container)"); + return Container[randomIndex(Container.size() - 1)]; } static void setRegisterOperandValue(const RegisterOperandAssignment &ROV, @@ -176,7 +177,7 @@ static void setRegisterOperandValue(const RegisterOperandAssignment &ROV, size_t randomBit(const llvm::BitVector &Vector) { assert(Vector.any()); auto Itr = Vector.set_bits_begin(); - for (size_t I = randomIndex(Vector.count()); I != 0; --I) + for (size_t I = randomIndex(Vector.count() - 1); I != 0; --I) ++Itr; return *Itr; } diff --git a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.h b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.h index 289fa02..ef44bd9 100644 --- a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.h +++ b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.h @@ -77,6 +77,9 @@ private: // unit tests. std::mt19937 &randomGenerator(); +// Picks a random unsigned integer from 0 to Max (inclusive). +size_t randomIndex(size_t Max); + // Picks a random bit among the bits set in Vector and returns its index. // Precondition: Vector must have at least one bit set. size_t randomBit(const llvm::BitVector &Vector); diff --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp index 01e3589..21d424a 100644 --- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp @@ -8,6 +8,7 @@ #include "../Target.h" #include "../Latency.h" +#include "../SnippetGenerator.h" #include "../Uops.h" #include "MCTargetDesc/X86BaseInfo.h" #include "MCTargetDesc/X86MCTargetDesc.h" @@ -498,8 +499,8 @@ void ExegesisX86Target::randomizeMCOperand( const Operand &Op = Instr.getPrimaryOperand(Var); switch (Op.getExplicitOperandInfo().OperandType) { case llvm::X86::OperandType::OPERAND_COND_CODE: - // FIXME: explore all CC variants. - AssignedValue = llvm::MCOperand::createImm(1); + AssignedValue = llvm::MCOperand::createImm( + randomIndex(llvm::X86::CondCode::LAST_VALID_COND)); break; default: break; -- 2.7.4