[llvm] 8383fdd - Re-land "[llvm-exegesis] Save target state before running the benchmark."
Clement Courbet via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 4 00:47:09 PST 2020
Author: Clement Courbet
Date: 2020-11-04T09:46:55+01:00
New Revision: 8383fddc4fa9b4e61954e5ac93b00719a39d2291
URL: https://github.com/llvm/llvm-project/commit/8383fddc4fa9b4e61954e5ac93b00719a39d2291
DIFF: https://github.com/llvm/llvm-project/commit/8383fddc4fa9b4e61954e5ac93b00719a39d2291.diff
LOG: Re-land "[llvm-exegesis] Save target state before running the benchmark."
The X86 exegesis target is never executed run on non-X86 hosts, disable
X86 instrinsic code on non-X86 targets.
This reverts commit 8cfc872129a99782ab07a19171bf8eace85589ae.
Added:
llvm/test/tools/llvm-exegesis/X86/uops-FLDENVm.s
Modified:
llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
llvm/tools/llvm-exegesis/lib/Target.cpp
llvm/tools/llvm-exegesis/lib/Target.h
llvm/tools/llvm-exegesis/lib/X86/Target.cpp
Removed:
################################################################################
diff --git a/llvm/test/tools/llvm-exegesis/X86/uops-FLDENVm.s b/llvm/test/tools/llvm-exegesis/X86/uops-FLDENVm.s
new file mode 100644
index 000000000000..be182d8fcf5b
--- /dev/null
+++ b/llvm/test/tools/llvm-exegesis/X86/uops-FLDENVm.s
@@ -0,0 +1,6 @@
+# RUN: llvm-exegesis -mode=uops -opcode-name=FLDENVm,FLDL2E -repetition-mode=duplicate | FileCheck %s
+
+CHECK: mode: uops
+CHECK-NEXT: key:
+CHECK-NEXT: instructions:
+CHECK-NEXT: FLDENVm
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
index 1bbad207a27e..2304e91b8b32 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
@@ -71,10 +71,10 @@ class FunctionExecutorImpl : public BenchmarkRunner::FunctionExecutor {
SmallVector<StringRef, 2> CounterNames;
StringRef(Counters).split(CounterNames, '+');
char *const ScratchPtr = Scratch->ptr();
+ const ExegesisTarget &ET = State.getExegesisTarget();
for (auto &CounterName : CounterNames) {
CounterName = CounterName.trim();
- auto CounterOrError =
- State.getExegesisTarget().createCounter(CounterName, State);
+ auto CounterOrError = ET.createCounter(CounterName, State);
if (!CounterOrError)
return CounterOrError.takeError();
@@ -93,6 +93,7 @@ class FunctionExecutorImpl : public BenchmarkRunner::FunctionExecutor {
.concat(std::to_string(Reserved)));
Scratch->clear();
{
+ auto PS = ET.withSavedState();
CrashRecoveryContext CRC;
CrashRecoveryContext::Enable();
const bool Crashed = !CRC.RunSafely([this, Counter, ScratchPtr]() {
@@ -101,6 +102,7 @@ class FunctionExecutorImpl : public BenchmarkRunner::FunctionExecutor {
Counter->stop();
});
CrashRecoveryContext::Disable();
+ PS.reset();
if (Crashed) {
std::string Msg = "snippet crashed while running";
#ifdef LLVM_ON_UNIX
diff --git a/llvm/tools/llvm-exegesis/lib/Target.cpp b/llvm/tools/llvm-exegesis/lib/Target.cpp
index ad26c1678c78..85180a1d6614 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Target.cpp
@@ -147,6 +147,8 @@ const PfmCountersInfo &ExegesisTarget::getPfmCounters(StringRef CpuName) const {
return *Found->PCI;
}
+ExegesisTarget::SavedState::~SavedState() {} // anchor.
+
namespace {
// Default implementation.
diff --git a/llvm/tools/llvm-exegesis/lib/Target.h b/llvm/tools/llvm-exegesis/lib/Target.h
index 8a5624b42803..28c103aa1948 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.h
+++ b/llvm/tools/llvm-exegesis/lib/Target.h
@@ -172,6 +172,16 @@ class ExegesisTarget {
// counters are defined for this CPU).
const PfmCountersInfo &getPfmCounters(StringRef CpuName) const;
+ // Saves the CPU state that needs to be preserved when running a benchmark,
+ // and returns and RAII object that restores the state on destruction.
+ // By default no state is preserved.
+ struct SavedState {
+ virtual ~SavedState();
+ };
+ virtual std::unique_ptr<SavedState> withSavedState() const {
+ return std::make_unique<SavedState>();
+ }
+
private:
virtual bool matchesArch(Triple::ArchType Arch) const = 0;
diff --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
index 827e2e27a2f8..ac635bb8af4c 100644
--- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
@@ -26,6 +26,9 @@
#include <memory>
#include <string>
#include <vector>
+#if defined(_MSC_VER)
+#include <immintrin.h>
+#endif
namespace llvm {
namespace exegesis {
@@ -594,6 +597,40 @@ void ConstantInliner::initStack(unsigned Bytes) {
namespace {
+class X86SavedState : public ExegesisTarget::SavedState {
+public:
+ X86SavedState() {
+#ifdef __x86_64__
+# if defined(_MSC_VER)
+ _fxsave64(FPState);
+# elif defined(__GNUC__)
+ __builtin_ia32_fxsave64(FPState);
+# endif
+#else
+ llvm_unreachable("X86 exegesis running on non-X86 target");
+#endif
+ }
+
+ ~X86SavedState() {
+ // Restoring the X87 state does not flush pending exceptions, make sure
+ // these exceptions are flushed now.
+#ifdef __x86_64__
+# if defined(_MSC_VER)
+ _clearfp();
+ _fxrstor64(FPState);
+# elif defined(__GNUC__)
+ asm volatile("fwait");
+ __builtin_ia32_fxrstor64(FPState);
+# endif
+#else
+ llvm_unreachable("X86 exegesis running on non-X86 target");
+#endif
+ }
+
+private:
+ alignas(16) char FPState[512];
+};
+
class ExegesisX86Target : public ExegesisTarget {
public:
ExegesisX86Target() : ExegesisTarget(X86CpuPfmCounters) {}
@@ -691,6 +728,10 @@ class ExegesisX86Target : public ExegesisTarget {
#endif
}
+ std::unique_ptr<SavedState> withSavedState() const override {
+ return std::make_unique<X86SavedState>();
+ }
+
static const unsigned kUnavailableRegisters[4];
};
More information about the llvm-commits
mailing list