mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
d0b3f4c3ac
Some BPF JIT backends would want to optimize memcpy in their own architecture specific way. However, at the moment, there is no way for JIT backends to see memcpy semantics in a reliable way. This is due to LLVM BPF backend is expanding memcpy into load/store sequences and could possibly schedule them apart from each other further. So, BPF JIT backends inside kernel can't reliably recognize memcpy semantics by peephole BPF sequence. This patch introduce new intrinsic expand infrastructure to memcpy. To get stable in-order load/store sequence from memcpy, we first lower memcpy into BPF::MEMCPY node which then expanded into in-order load/store sequences in expandPostRAPseudo pass which will happen after instruction scheduling. By this way, kernel JIT backends could reliably recognize memcpy through scanning BPF sequence. This new memcpy expand infrastructure is gated by a new option: -bpf-expand-memcpy-in-order Acked-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Jiong Wang <jiong.wang@netronome.com> Signed-off-by: Yonghong Song <yhs@fb.com> llvm-svn: 337977
89 lines
2.7 KiB
C++
89 lines
2.7 KiB
C++
//===-- BPFSubtarget.h - Define Subtarget for the BPF -----------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares the BPF specific subclass of TargetSubtargetInfo.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_BPF_BPFSUBTARGET_H
|
|
#define LLVM_LIB_TARGET_BPF_BPFSUBTARGET_H
|
|
|
|
#include "BPFFrameLowering.h"
|
|
#include "BPFISelLowering.h"
|
|
#include "BPFInstrInfo.h"
|
|
#include "BPFSelectionDAGInfo.h"
|
|
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
|
|
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
|
#include "llvm/IR/DataLayout.h"
|
|
#include "llvm/Target/TargetMachine.h"
|
|
|
|
#define GET_SUBTARGETINFO_HEADER
|
|
#include "BPFGenSubtargetInfo.inc"
|
|
|
|
namespace llvm {
|
|
class StringRef;
|
|
|
|
class BPFSubtarget : public BPFGenSubtargetInfo {
|
|
virtual void anchor();
|
|
BPFInstrInfo InstrInfo;
|
|
BPFFrameLowering FrameLowering;
|
|
BPFTargetLowering TLInfo;
|
|
BPFSelectionDAGInfo TSInfo;
|
|
|
|
private:
|
|
void initializeEnvironment();
|
|
void initSubtargetFeatures(StringRef CPU, StringRef FS);
|
|
bool probeJmpExt();
|
|
|
|
protected:
|
|
// unused
|
|
bool isDummyMode;
|
|
|
|
// whether the cpu supports jmp ext
|
|
bool HasJmpExt;
|
|
|
|
// whether the cpu supports alu32 instructions.
|
|
bool HasAlu32;
|
|
|
|
// whether we should enable MCAsmInfo DwarfUsesRelocationsAcrossSections
|
|
bool UseDwarfRIS;
|
|
|
|
public:
|
|
// This constructor initializes the data members to match that
|
|
// of the specified triple.
|
|
BPFSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS,
|
|
const TargetMachine &TM);
|
|
|
|
BPFSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS);
|
|
|
|
// ParseSubtargetFeatures - Parses features string setting specified
|
|
// subtarget options. Definition of function is auto generated by tblgen.
|
|
void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
|
|
bool getHasJmpExt() const { return HasJmpExt; }
|
|
bool getHasAlu32() const { return HasAlu32; }
|
|
bool getUseDwarfRIS() const { return UseDwarfRIS; }
|
|
|
|
const BPFInstrInfo *getInstrInfo() const override { return &InstrInfo; }
|
|
const BPFFrameLowering *getFrameLowering() const override {
|
|
return &FrameLowering;
|
|
}
|
|
const BPFTargetLowering *getTargetLowering() const override {
|
|
return &TLInfo;
|
|
}
|
|
const BPFSelectionDAGInfo *getSelectionDAGInfo() const override {
|
|
return &TSInfo;
|
|
}
|
|
const TargetRegisterInfo *getRegisterInfo() const override {
|
|
return &InstrInfo.getRegisterInfo();
|
|
}
|
|
};
|
|
} // End llvm namespace
|
|
|
|
#endif
|