Index: llvm/trunk/test/CMakeLists.txt =================================================================== --- llvm/trunk/test/CMakeLists.txt +++ llvm/trunk/test/CMakeLists.txt @@ -60,6 +60,7 @@ dsymutil llvm-dwarfdump llvm-dwp + llvm-exegesis llvm-extract llvm-isel-fuzzer llvm-lib Index: llvm/trunk/test/lit.cfg.py =================================================================== --- llvm/trunk/test/lit.cfg.py +++ llvm/trunk/test/lit.cfg.py @@ -140,16 +140,17 @@ # 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([ Index: llvm/trunk/test/tools/llvm-exegesis/X86/latency-by-opcode-name.s =================================================================== --- llvm/trunk/test/tools/llvm-exegesis/X86/latency-by-opcode-name.s +++ llvm/trunk/test/tools/llvm-exegesis/X86/latency-by-opcode-name.s @@ -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 Index: llvm/trunk/test/tools/llvm-exegesis/X86/lit.local.cfg =================================================================== --- llvm/trunk/test/tools/llvm-exegesis/X86/lit.local.cfg +++ llvm/trunk/test/tools/llvm-exegesis/X86/lit.local.cfg @@ -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 Index: llvm/trunk/test/tools/llvm-exegesis/X86/uops-by-opcode-name.s =================================================================== --- llvm/trunk/test/tools/llvm-exegesis/X86/uops-by-opcode-name.s +++ llvm/trunk/test/tools/llvm-exegesis/X86/uops-by-opcode-name.s @@ -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 Index: llvm/trunk/test/tools/llvm-exegesis/lit.local.cfg =================================================================== --- llvm/trunk/test/tools/llvm-exegesis/lit.local.cfg +++ llvm/trunk/test/tools/llvm-exegesis/lit.local.cfg @@ -0,0 +1,2 @@ +if 'native' not in config.available_features: + config.unsupported = True Index: llvm/trunk/tools/llvm-exegesis/lib/BenchmarkRunner.cpp =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/BenchmarkRunner.cpp +++ llvm/trunk/tools/llvm-exegesis/lib/BenchmarkRunner.cpp @@ -35,6 +35,8 @@ // code. static std::vector GenerateInstructions(const BenchmarkCode &BC, const size_t MinInstructions) { + if (BC.Instructions.empty()) + return {}; std::vector Code = BC.Instructions; for (int I = 0; Code.size() < MinInstructions; ++I) Code.push_back(BC.Instructions[I % BC.Instructions.size()]); @@ -53,10 +55,6 @@ InstrBenchmark.Info = BC.Info; const std::vector &Instructions = BC.Instructions; - if (Instructions.empty()) { - InstrBenchmark.Error = "Empty snippet"; - return InstrBenchmark; - } InstrBenchmark.Key.Instructions = Instructions;