On x86 and AArch, SIMD instructions encode all of the scheduling information in the instruction itself. For example, VADD.I16 q0, q1, q2 is a neon instruction that operates on 16-bit integer elements stored in 128-bit Q registers, which leads to eight 16-bit lanes in parallel. This kind of information impacts how the instruction takes to execute and what dependencies this may cause. On RISCV however, the data that impacts scheduling is encoded in CSR registers such as vtype or vl, in addition with the instruction itself. But MCA does not track or use the data in these registers. This patch fixes this problem by introducing Instruments into MCA. * Replace `CodeRegions` with `AnalysisRegions` * Add `Instrument` and `InstrumentManager` * Add `InstrumentRegions` * Add RISCV Instrument and `InstrumentManager` * Parse `Instruments` in driver * Use instruments to override schedule class * RISCV use lmul instrument to override schedule class * Fix unit tests to pass empty instruments * Add -ignore-im clopt to disable this change A prior version of this patch was commited in5e82ee5373.2323a4ee61reverted that change because the unit test files caused build errors. The change with fixes were committed inb88b8307bfbut reverted once againe8e92c8313due to more build errors. This commit adds the prior changes and fixes the build error. Differential Revision: https://reviews.llvm.org/D137440
63 lines
2.1 KiB
C++
63 lines
2.1 KiB
C++
//===-------------------- RISCVCustomBehaviour.h -----------------*-C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
///
|
|
/// This file defines the RISCVCustomBehaviour class which inherits from
|
|
/// CustomBehaviour. This class is used by the tool llvm-mca to enforce
|
|
/// target specific behaviour that is not expressed well enough in the
|
|
/// scheduling model for mca to enforce it automatically.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_RISCV_MCA_RISCVCUSTOMBEHAVIOUR_H
|
|
#define LLVM_LIB_TARGET_RISCV_MCA_RISCVCUSTOMBEHAVIOUR_H
|
|
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/MC/MCInst.h"
|
|
#include "llvm/MC/MCInstrDesc.h"
|
|
#include "llvm/MC/MCInstrInfo.h"
|
|
#include "llvm/MCA/CustomBehaviour.h"
|
|
|
|
namespace llvm {
|
|
namespace mca {
|
|
|
|
class RISCVLMULInstrument : public Instrument {
|
|
public:
|
|
static const StringRef DESC_NAME;
|
|
static bool isDataValid(StringRef Data);
|
|
|
|
RISCVLMULInstrument(StringRef Data) : Instrument(DESC_NAME, Data) {}
|
|
|
|
~RISCVLMULInstrument() = default;
|
|
|
|
uint8_t getLMUL() const;
|
|
};
|
|
|
|
class RISCVInstrumentManager : public InstrumentManager {
|
|
public:
|
|
RISCVInstrumentManager(const MCSubtargetInfo &STI, const MCInstrInfo &MCII)
|
|
: InstrumentManager(STI, MCII) {}
|
|
|
|
bool shouldIgnoreInstruments() const override { return false; }
|
|
bool supportsInstrumentType(StringRef Type) const override;
|
|
|
|
/// Create a Instrument for RISCV target
|
|
SharedInstrument createInstrument(StringRef Desc, StringRef Data) override;
|
|
|
|
/// Using the Instrument, returns a SchedClassID to use instead of
|
|
/// the SchedClassID that belongs to the MCI or the original SchedClassID.
|
|
unsigned
|
|
getSchedClassID(const MCInstrInfo &MCII, const MCInst &MCI,
|
|
const SmallVector<SharedInstrument> &IVec) const override;
|
|
};
|
|
|
|
} // namespace mca
|
|
} // namespace llvm
|
|
|
|
#endif
|