aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Brawn <john.brawn@arm.com>2018-10-10 13:03:23 +0000
committerJohn Brawn <john.brawn@arm.com>2018-10-10 13:03:23 +0000
commitc616a7236c83994cacdbc13e37269bbc9598093d (patch)
tree24d48616bbf0e14ba06ce0676f1891596e76823a
parentbc7b6251b6106c13cea725f8f81a4d4e9de5a2fd (diff)
downloadllvm-c616a7236c83994cacdbc13e37269bbc9598093d.zip
llvm-c616a7236c83994cacdbc13e37269bbc9598093d.tar.gz
llvm-c616a7236c83994cacdbc13e37269bbc9598093d.tar.bz2
[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
-rw-r--r--llvm/test/tools/llvm-exegesis/AArch64/latency-by-opcode-name.s12
-rw-r--r--llvm/test/tools/llvm-exegesis/AArch64/lit.local.cfg29
-rw-r--r--llvm/tools/llvm-exegesis/lib/Assembler.cpp2
3 files changed, 42 insertions, 1 deletions
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, {});
}
}