[llvm-exegesis] Add lit tests (v2).

Summary: This revisits rL342953 by adding detection of host support.

Reviewers: gchatelet, lebedev.ri, alexshap

Subscribers: mgorny, tschuett, llvm-commits

Differential Revision: https://reviews.llvm.org/D52464

llvm-svn: 342975
This commit is contained in:
Clement Courbet 2018-09-25 13:59:35 +00:00
parent b798312f4c
commit 4d1bc5dc43
7 changed files with 57 additions and 14 deletions

View File

@ -60,6 +60,7 @@ set(LLVM_TEST_DEPENDS
dsymutil
llvm-dwarfdump
llvm-dwp
llvm-exegesis
llvm-extract
llvm-isel-fuzzer
llvm-lib

View File

@ -140,16 +140,17 @@ tools = [
# FIXME: Why do we have both `lli` and `%lli` that do slightly different things?
tools.extend([
'dsymutil', 'lli', 'lli-child-target', 'llvm-ar', 'llvm-as', 'llvm-bcanalyzer',
'llvm-config', 'llvm-cov', 'llvm-cxxdump', 'llvm-cvtres', 'llvm-diff', 'llvm-dis',
'llvm-dwarfdump', 'llvm-extract', 'llvm-isel-fuzzer', 'llvm-opt-fuzzer', 'llvm-lib',
'llvm-link', 'llvm-lto', 'llvm-lto2', 'llvm-mc', 'llvm-mca',
'llvm-modextract', 'llvm-nm', 'llvm-objcopy', 'llvm-objdump',
'llvm-pdbutil', 'llvm-profdata', 'llvm-ranlib', 'llvm-readobj',
'llvm-rtdyld', 'llvm-size', 'llvm-split', 'llvm-strings', 'llvm-strip', 'llvm-tblgen',
'llvm-undname', 'llvm-c-test', 'llvm-cxxfilt', 'llvm-xray', 'yaml2obj', 'obj2yaml',
'yaml-bench', 'verify-uselistorder',
'bugpoint', 'llc', 'llvm-symbolizer', 'opt', 'sancov', 'sanstats'])
'dsymutil', 'lli', 'lli-child-target', 'llvm-ar', 'llvm-as',
'llvm-bcanalyzer', 'llvm-config', 'llvm-cov', 'llvm-cxxdump', 'llvm-cvtres',
'llvm-diff', 'llvm-dis', 'llvm-dwarfdump', 'llvm-exegesis', 'llvm-extract',
'llvm-isel-fuzzer', 'llvm-opt-fuzzer', 'llvm-lib', 'llvm-link', 'llvm-lto',
'llvm-lto2', 'llvm-mc', 'llvm-mca', 'llvm-modextract', 'llvm-nm',
'llvm-objcopy', 'llvm-objdump', 'llvm-pdbutil', 'llvm-profdata',
'llvm-ranlib', 'llvm-readobj', 'llvm-rtdyld', 'llvm-size', 'llvm-split',
'llvm-strings', 'llvm-strip', 'llvm-tblgen', 'llvm-undname', 'llvm-c-test',
'llvm-cxxfilt', 'llvm-xray', 'yaml2obj', 'obj2yaml', 'yaml-bench',
'verify-uselistorder', 'bugpoint', 'llc', 'llvm-symbolizer', 'opt',
'sancov', 'sanstats'])
# The following tools are optional
tools.extend([

View File

@ -0,0 +1,6 @@
# RUN: llvm-exegesis -mode=latency -opcode-name=ADD32rr | FileCheck %s
CHECK: mode: latency
CHECK-NEXT: key:
CHECK-NEXT: instructions:
CHECK-NEXT: ADD32rr

View File

@ -0,0 +1,29 @@
import subprocess
import lit.util
if not ('X86' in config.root.targets):
# We need support for X86.
config.unsupported = True
elif not ('x86_64' in config.root.host_triple):
# We need to be running on an X86 host.
config.unsupported = True
else:
# We need libpfm to be installed and allow reading perf counters. We can
# only know that at runtime, so we try to measure the latency of an empty
# code snippet and bail out on error.
llvm_exegesis_exe = lit.util.which('llvm-exegesis', config.llvm_tools_dir)
if not llvm_exegesis_exe:
print('llvm-exegesis not found')
config.unsupported = True
else:
try:
with open(os.devnull, 'w') as quiet:
check_llvm_exegesis_result = subprocess.call(
[llvm_exegesis_exe, '-mode', 'uops', '-snippets-file', '/dev/null'], stdout=quiet)
except OSError:
print('could not exec llvm-exegesis')
config.unsupported = True
if not check_llvm_exegesis_result == 0:
config.unsupported = True

View File

@ -0,0 +1,6 @@
# RUN: llvm-exegesis -mode=uops -opcode-name=ADD32rr | FileCheck %s
CHECK: mode: uops
CHECK-NEXT: key:
CHECK-NEXT: instructions:
CHECK-NEXT: ADD32rr

View File

@ -0,0 +1,2 @@
if 'native' not in config.available_features:
config.unsupported = True

View File

@ -35,6 +35,8 @@ BenchmarkRunner::~BenchmarkRunner() = default;
// code.
static std::vector<llvm::MCInst>
GenerateInstructions(const BenchmarkCode &BC, const size_t MinInstructions) {
if (BC.Instructions.empty())
return {};
std::vector<llvm::MCInst> Code = BC.Instructions;
for (int I = 0; Code.size() < MinInstructions; ++I)
Code.push_back(BC.Instructions[I % BC.Instructions.size()]);
@ -53,10 +55,6 @@ BenchmarkRunner::runConfiguration(const BenchmarkCode &BC,
InstrBenchmark.Info = BC.Info;
const std::vector<llvm::MCInst> &Instructions = BC.Instructions;
if (Instructions.empty()) {
InstrBenchmark.Error = "Empty snippet";
return InstrBenchmark;
}
InstrBenchmark.Key.Instructions = Instructions;