From: John Brawn Date: Wed, 10 Oct 2018 13:03:23 +0000 (+0000) Subject: [llvm-exegesis] Fix function return generation so it doesn't return register 0 X-Git-Tag: llvmorg-8.0.0-rc1~6887 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c616a7236c83994cacdbc13e37269bbc9598093d;p=platform%2Fupstream%2Fllvm.git [llvm-exegesis] Fix function return generation so it doesn't return register 0 When fillMachineFunction generates a return on targets without a return opcode (such as AArch64) it should pass an empty set of registers as the return registers, not 0 which means register number zero. Differential Revision: https://reviews.llvm.org/D53074 llvm-svn: 344139 --- diff --git a/llvm/test/tools/llvm-exegesis/AArch64/latency-by-opcode-name.s b/llvm/test/tools/llvm-exegesis/AArch64/latency-by-opcode-name.s new file mode 100644 index 0000000..1d719ce --- /dev/null +++ b/llvm/test/tools/llvm-exegesis/AArch64/latency-by-opcode-name.s @@ -0,0 +1,12 @@ +# RUN: llvm-exegesis -mode=latency -opcode-name=ADDXrr | FileCheck %s + +CHECK: --- +CHECK-NEXT: mode: latency +CHECK-NEXT: key: +CHECK-NEXT: instructions: +CHECK-NEXT: ADDXrr [[REG1:X[0-9]+|LR]] [[REG2:X[0-9]+|LR]] [[REG3:X[0-9]+|LR]] +CHECK-NEXT: config: '' +CHECK-NEXT: register_initial_values: +CHECK-DAG: - '[[REG2]]=0x0' +# We don't check REG3 because in the case that REG2=REG3 the check would fail +CHECK-LAST: ... diff --git a/llvm/test/tools/llvm-exegesis/AArch64/lit.local.cfg b/llvm/test/tools/llvm-exegesis/AArch64/lit.local.cfg new file mode 100644 index 0000000..392b282 --- /dev/null +++ b/llvm/test/tools/llvm-exegesis/AArch64/lit.local.cfg @@ -0,0 +1,29 @@ +import subprocess +import lit.util + +if not ('AArch64' in config.root.targets): + # We need support for AArch64. + config.unsupported = True + +elif not ('aarch64' in config.root.host_triple): + # We need to be running on an AArch64 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', 'latency', '-snippets-file', '/dev/null'], stdout=quiet, stderr=quiet) + except OSError: + print('could not exec llvm-exegesis') + config.unsupported = True + if not check_llvm_exegesis_result == 0: + config.unsupported = True diff --git a/llvm/tools/llvm-exegesis/lib/Assembler.cpp b/llvm/tools/llvm-exegesis/lib/Assembler.cpp index cb6e9e1..2b67682 100644 --- a/llvm/tools/llvm-exegesis/lib/Assembler.cpp +++ b/llvm/tools/llvm-exegesis/lib/Assembler.cpp @@ -121,7 +121,7 @@ static void fillMachineFunction(llvm::MachineFunction &MF, } else { llvm::MachineIRBuilder MIB(MF); MIB.setMBB(*MBB); - MF.getSubtarget().getCallLowering()->lowerReturn(MIB, nullptr, 0); + MF.getSubtarget().getCallLowering()->lowerReturn(MIB, nullptr, {}); } }